总结
项目
- "防御性编程"的思维。
- 对于api、dao、service各自独立为一个模块
- 将计算密集型与IO/存储密集型分割开来,提高资源利用率
- 数据冗余:Coupon表多了一个shop_id字段。通过打破范式,应对高并发的场景,你必须尽可能提高系统的吞吐量和性能,以空间换时间
业务
- Long来表示“金额”。对于境内电商行业来说,金额往往是以分为单位的,这样我们可以直接使用Long类型参与金额的计算,比如100就代表100分,也就是一块钱比使用Double到处转换BigDecimal省了很多事儿。
- 电商领域中,商品的数量通常不能以Integer整数来表示,这是因为只有标品才能以整数计件。对于像蔬菜、肉类等非标品来说,它们的计件单位并不是“个”。所以在实际项目中,尤其是零售行业的业务系统里,计件单位要允许小数位的存在。
代码
- 模板模式是一种基于抽象类的设计模式,它的思想很简单,就是将共性的算法骨架部分上升到抽象层,将个性部分延迟到子类中去实现。
- 尽可能对上层业务屏蔽其底层业务复杂度,底层具体业务逻辑的修改对上层是无感知的,这其实也是开闭原则的思想。
架构
- 做系统架构的时候,首要目标就是保障系统的高可用性。不管你的系统架构多么精妙,用的技术多么先进,如果系统的可用性无法得到保障,那么你做什么都是白忙活。像我们的人生一样,事业、家庭、地位都是0,健康才是一串0前面的那个1,没有1则一切皆无。所以,系统的高可用性,就是系统架构层面的那个1。
- 避免单点故障:在做系统架构的时候,你应该假设任何服务器都有可能挂掉。如果某项任务依赖单一服务资源,那么这就会成为一个“单点”,一旦这个服务资源挂掉就表示整个功能变为不可用。所以你要尽可能消灭一切“单点”;
- 故障机器状态恢复:尽快将故障机器返回到故障前的状态。对于像Nacos这类中心化注册中心来说,因故障而下线的机器在重新上线后,应该有能力从某个地方获取故障发生前的服务注册列表。