为什么需要微服务
传统的servletssm
- 部署成本高(无论是修改1行代码,还是10行代码,都要全量替换)
- 改动影响大,风险高(不论代码改动多小,成本都相同)
- 因为成本高,风险高,所以导致部署频率低(无法快速交付客户需求)
- 当然还有例如无法满足快速扩容,弹性伸缩,无法适应云环境特性等问题
微服务的优点 - 针对特定服务发布,影响小,风险小,成本低
- 频繁发布版本,快速交付需求
- 低成本扩容,弹性伸缩,适应云环境
微服务的缺点 - 分布式系统的复杂性
- 部署,测试和监控的成本问题
- 分布式事务和CAP的相关问题
单体开发
所谓的单体应用就是指一个war包包含了项目的所有功能。
单体应用的优点
不管是什么样的架构模式都会有其优点所在,单体应用的优点如下所示:
- 容易部署:这个不容置疑,整个项目就一个war包,部署特别方便。
- 容易运行/测试:这个也上面也类似,我们在测试阶段只需要启动一个war包即可。
- 但是相比优点缺点反而更加明显,下面讲述一下单体应用的缺点。
单体应用的缺点
- 复杂性高:随着业务的不断迭代,项目的代码量会急剧的增多,项目模块也会随着而增加,模块与模块之间的关系就会变成的很复杂,整个项目就会变成的非常复杂,在新增和修改代码的时候都会做很多的测试,很容易会由于一处的变动影响之前业务的功能。
- 部署评率低:随便代码的增多,首先部署会越来越消耗时间,还有我们在修复一个很小很小的bug的时候整个项目都要重新部署,所以我们会集中一个时间点部署多个需求。
- 可靠性差:这个很容易理解,假如某个影响出现了死循环,导致内存溢出,会影响整个项目挂掉。
- 扩展性差:我们在新增业务的时候,代码层面会考虑在不影响现有的业务基础上编写代码,提高了代码的复杂性。
CAP
- 一致性(Consistency): 一致性指 (all nodes see the same data at the same time),即更新操作成功并返回客户端完成后,所有节点在同一时间的数据完全一致。
- 可用性(Availability): 可用性指(Reads and writes always succeed),即服务一直可用,而且是正常响应时间。
- 分区容错性(Partition tolerance): 分区容错性指(the system continues to operate despite arbitrary message loss or failure of part of the system),即分布式系统在遇到某节点或网络分区故障的时候,仍然能够对外提供满足一致性和可用性的服务。
BASE理论
eBay 的架构师 Dan Pritchett 源于对大规模分布式系统的实践总结,在 ACM 上发表文章提出 BASE 理论,BASE 理论是对 CAP 理论的延伸,核心思想是即使无法做到强一致性(Strong Consistency,CAP 的一致性就是强一致性),但应用可以采用适合的方式达到最终一致性(Eventual Consitency)。
- 基本可用(Basically Available): 基本可用是指分布式系统在出现故障的时候,允许损失部分可用性,即保证核心可用。电商大促时,为了应对访问量激增,部分用户可能会被引导到降级页面,服务层也可能只提供降级服务。这就是损失部分可用性的体现。
- 软状态(Soft State): 软状态是指允许系统存在中间状态,而该中间状态不会影响系统整体可用性。分布式存储中一般一份数据至少会有三个副本,允许不同节点间副本同步的延时就是软状态的体现。MySQL Replication 的异步复制也是一种体现。
- 最终一致性(Eventual Consistency): 最终一致性是指系统中的所有数据副本经过一定时间后,最终能够达到一致的状态。弱一致性和强一致性相反,最终一致性是弱一致性的一种特殊情况。
ACID 和 BASE 的区别与联系
ACID 是传统数据库常用的设计理念,追求强一致性模型。BASE 支持的是大型分布式系统,提出通过牺牲强一致性获得高可用性。
ACID 和 BASE 代表了两种截然相反的设计哲学,在分布式系统设计的场景中,系统组件对一致性要求是不同的,因此 ACID 和 BASE 又会结合使用。