微服务介绍
英文:https://martinfowler.com/articles/microservices.html
中文:https://blog.cuicc.com/blog/2015/07/22/microservices/
微服务拆分
拆分的目的:复杂的问题简单化,不应为了拆分而拆分。
单体架构优势:
- 开发简单直接: 单体架构下,开发过程更加简单和直接,因为所有功能模块都在同一个代码库中,开发人员可以更轻松地理解整个系统的结构和功能。
- 项目集中式管理: 单体架构有利于集中式管理,使得团队更容易协作,减少沟通成本,并且便于维护和部署。
- 有针对性排查问题: 排查问题时只需要关注一个应用,更容易定位和解决问题,提高了故障排除效率。
- 节省人力成本: 维护一个工程可以节省维护系统运行的人力成本,因为不需要额外的部署和维护工作,减少了运维成本。
单体架构劣势:
- 规模扩大导致的研发成本增加: 随着业务功能的增多和开发团队规模的扩大,单体架构下的研发成本会逐渐增加,可能会抑制研发效率的提升,比如版本控制和代码冲突解决等问题。
- 技术瓶颈: 单体架构在技术层面可能会面临数据库连接数的限制,这会成为应用服务器扩容的瓶颈,限制了系统的横向扩展能力。
- 对运维的影响: 单体架构对于系统的运维也会产生一定的影响,因为所有的功能模块都在同一个应用中,可能会增加系统维护的复杂性和风险。
微服务优点:
- 快速迭代: 微服务架构支持快速迭代和敏捷开发,因为各个微服务可以独立开发、测试、部署和扩展,不会因为整个系统的迭代而受阻。
- 可伸缩性: 微服务架构具有良好的可伸缩性,可以根据需要独立地扩展或缩减每个微服务,以满足不同业务需求和流量的变化。
- 容错性: 微服务架构下,每个微服务都是独立部署和运行的,如果某个微服务发生故障,不会影响整个系统的稳定性,提高了系统的容错性和可用性。
微服务缺点:
- 分布式系统复杂性: 微服务架构引入了分布式系统的复杂性,包括服务发现、负载均衡、分布式事务等问题,需要额外的技术和工具来解决。
- 部署和运维成本: 微服务架构下,由于服务数量增多,部署和运维成本也会相应增加,需要更多的自动化工具和流程来管理微服务的生命周期。
- 数据一致性: 微服务架构下,由于数据分布在不同的服务中,可能会出现数据一致性的问题,需要通过一致性协议或者异步通信来解决。
拆分时机
微服务不仅仅是技术的升级,更是开发方式、组织架构、开发观念的转变。
-
代码维护困难: 当代码库变得庞大,同时有多个开发者进行频繁提交,并且出现了大量的代码冲突时,这表明单体架构下的代码管理已经难以维护,可以考虑微服务拆分来减少代码库的复杂度,提高团队的开发效率。
-
模块耦合严重: 如果模块之间的依赖关系过于复杂,小的功能修改也需要等待大版本上线,并且需要高层级的协调才能进行上线,这表明模块之间的耦合度过高,不利于快速迭代和独立部署,可以通过微服务拆分来解耦模块,实现独立部署和快速上线。
-
横向扩展流程复杂: 如果主要业务和次要业务耦合严重,需要对某些业务进行横向扩展而另一些业务不需要扩展,这会导致扩展流程复杂,不利于系统的横向扩展和资源的有效利用,可以通过微服务拆分来将不同的业务功能拆分成独立的服务,实现按需扩展
-
业务规模增长: 当业务规模逐渐扩大,需要更快地满足市场需求时,微服务拆分是有必要的。在业务成长期阶段,单体架构可能已经无法满足需求,需要考虑微服务架构。
-
团队规模增长: 当团队规模达到一定程度,如百人规模以上,单体架构下的开发效率可能会受到限制,此时考虑微服务拆分可以提高团队的协作效率和开发效率。
-
技术储备和人才储备: 微服务架构需要具备相应的技术储备和人才储备,包括领域驱动设计、注册中心、配置中心、日志系统、持续交付、监控系统等方面的知识和经验。
-
研发效率下降: 如果单体架构下研发效率大幅下降,代码维护困难,影响了团队的整体生产力,那么这就是进行微服务拆分的一个很好的时机。
拆分通用原则
-
单一服务内部功能高内聚低耦合: 每个微服务应专注于解决特定的业务问题,确保内部功能高度内聚,即相关功能组件应该紧密相关,而与其他组件的耦合应尽量降低。这有助于提高服务的独立性和可维护性。
-
闭包原则(CCP): 当需要对一个微服务进行修改时,所有的变更应该局限在这个微服务的内部,而不影响其他微服务。这样做可以降低系统的耦合性,提高服务的自治性和可维护性。
-
服务自治、接口隔离原则: 每个微服务应该具有自治性,能够独立开发、测试、部署和运行。同时,服务之间应该通过标准的接口进行通信,隐藏内部实现细节,降低服务之间的依赖,提高系统的稳定性和可维护性。
-
持续演进原则: 微服务架构的设计应该是一个持续演进的过程,根据业务需求和技术发展不断优化微服务的划分和边界,避免服务数量的爆炸性增长,确保服务的合理性和灵活性。
-
影响产品日常功能迭代的最小化: 在微服务拆分过程中,应尽量减少对产品日常功能迭代的影响,优先拆分比较独立的边界服务,并逐步减少对现有业务的影响,同时避免服务之间的环形依赖或双向依赖。
-
服务接口的可扩展性: 微服务接口的设计应具备良好的可扩展性,尽量避免修改接口签名,而是通过封装类等方式来进行参数的扩展,确保向后兼容性,降低对调用方的影响。
-
避免环形依赖与双向依赖: 尽量避免微服务之间存在环形依赖或双向依赖,这会导致系统的耦合度增加,使得服务边界不清晰,降低了系统的可维护性和可扩展性。
-
阶段性合并和重新梳理: 随着对业务领域理解的深入和业务逻辑的变化,应定期对微服务的边界进行合并和重新梳理,确保服务边界的清晰和合理性,避免服务边界的混乱。
-
自动化驱动: 在微服务架构中,应优先构建自动化工具和环境,简化服务的创建、开发、测试、部署和运维过程,减少手动操作,提高开发和管理效率,降低微服务数量增加所带来的复杂性问题。
拆分策略
功能维度
在功能维度拆分策略中,基于业务复杂度的拆分可以选择领域驱动设计或数据驱动的方法。以下是一些优化介绍:
-
基于领域驱动设计的拆分优化:
- 确保与领域的密切合作:以业务建立统一的语言和概念模型,确保对业务领域的深入理解,从而更好地划分服务边界。
- 重视核心业务场景:识别和优先处理核心业务场景,将其拆分为独立的微服务,这有助于提高系统的灵活性和可维护性。
- 聚合和分解的平衡:通过领域模型和业务分析,找到合适的聚合和分解点,避免过度拆分或过度集中,确保微服务的功能单一性和内聚性。
-
基于数据驱动的拆分优化:
- 综合考虑表之间的关系:在确定整体数据结构时,不仅要考虑单个表的结构,还需要考虑表之间的关系和依赖,从而更好地划分服务边界。
- 强调数据一致性和事务边界:在拆分服务时,要考虑数据一致性和事务的边界,避免将需要在同一个事务中操作的数据拆分到不同的服务中,从而确保系统的数据一致性。
- 迭代验证和持续优化:拆分服务后,需要不断验证业务流程和服务调用关系,及时发现和解决问题,持续优化服务拆分的结果,以满足业务需求和性能需求。
-
已有单体架构中逐步拆分服务:
拆分步骤: 前后端分离,提取公共基础服务(如登录、权限),不断从老系统抽取服务,垂直划分优先,适当水平切分
在实施功能维度拆分策略时,需要根据具体业务情况和团队的实际情况选择合适的方法,并不断进行迭代和优化,以确保微服务架构的设计符合业务需求和系统性能的要求。
非功能维度
考虑到扩展性、复用性、高性能、高可用、安全性、异构性等方面,以下是针对这些目标的主要拆分策略:
-
扩展性:
- 将系统中变与不变的部分区分开来,将不变的部分拆分为共用的服务,而将变化的部分独立出来满足个性化扩展需要。
- 根据二八原则,将经常变动的部分与基本不变的部分进行拆分,以降低对成熟服务稳定性的影响。
-
复用性:
- 将系统中重复的功能,如鉴权、限流、安全和日志监控等,拆分为独立的服务,形成微服务中的API网关,以提高功能的复用性。
-
高性能:
- 将性能要求高或者性能压力大的模块拆分出来,避免对其他服务产生性能影响。
- 基于读写分离或根据具体性能瓶颈,对服务进行拆分,以优化性能。例如,将核心的排队功能拆分为独立的服务,或对流量较大的服务进行读写分离。
-
高可用:
- 将可靠性要求高的核心服务与可靠性要求低的非核心服务进行拆分,重点保证核心服务的高可用性。确保服务数量满足“三个火枪手”的原则,以提高系统整体的可用性。
-
安全性:
- 将对信息安全要求高的服务进行拆分,进行区别部署,如设置特定的DMZ区域对服务进行分区部署,以满足信息安全的要求。
- 采取针对性的安全策略,降低安全风险,并提高信息安全的效率和成本效益。
-
异构性:
- 对于对开发语言种类有要求的业务场景,可以将功能独立出来实现为一个独立服务,使用不同的语言进行实现,以满足异构性的需求。
Spring Cloud技术栈选型
Spring Cloud Alibaba 官网:
Spring AI 抢先体验 | https://sca.aliyun.com
针对Spring Cloud存在的痛点,选择Spring Cloud Alibaba作为微服务组件是一个明智的选择。以下是优化介绍:
-
稳定性和持续更新:
- Spring Cloud Alibaba的组件由阿里巴巴经过实际使用和考验,具有较高的稳定性和性能。与此同时,Alibaba积极参与并支持这些组件的维护和更新,确保其与最新技术的兼容性,从而避免了部分组件停止维护和更新所带来的不便。
-
简化部署和管理:
- Spring Cloud Alibaba提供了更简单的环境搭建过程,其集成了完善的可视化界面,使得部署和管理变得更加简单和直观。这减少了二次开发和定制的需求,同时提高了开发和运维的效率。
-
简化配置和降低学习成本:
- 相比于传统的Spring Cloud,Spring Cloud Alibaba简化了配置过程,降低了配置的复杂性。它提供了更易于上手的配置方式,并且明确了各个组件之间的配置差异,使得开发人员更容易理解和合理应用。这降低了学习曲线,提高了开发效率。
-
成熟的生态系统和强大的性能:
- Spring Cloud Alibaba基于Alibaba在大规模分布式系统方面的丰富经验,提供了一整套成熟的微服务组件。这些组件经过了实际的考验,性能强劲,设计合理。借助这些组件,开发人员可以构建高性能、可靠的微服务架构,同时享受到完善的可视化界面带来的便利。
-
低学习成本和简化搭建过程:
- Spring Cloud Alibaba的搭建过程相对简单,并且提供了较低的学习曲线。其文档和社区资源丰富,开发人员可以快速上手,并且通过阿里云提供的云原生服务,可以进一步简化部署和管理的过程,降低了搭建和维护的成本。
Spring Cloud Alibaba官方推荐版本选择:
2.2.x 分支
适配 Spring Boot 为 2.4,Spring Cloud Hoxton 版本及以下的 Spring Cloud Alibaba 版本按从新到旧排列如下表(最新版本用*标记):
Spring Cloud Alibaba Version | Spring Cloud Version | Spring Boot Version |
---|---|---|
2.2.10-RC2* | Spring Cloud Hoxton.SR12 | 2.3.12.RELEASE |
2.2.10-RC1 | Spring Cloud Hoxton.SR12 | 2.3.12.RELEASE |
2.2.9.RELEASE | Spring Cloud Hoxton.SR12 | 2.3.12.RELEASE |
2.2.8.RELEASE | Spring Cloud Hoxton.SR12 | 2.3.12.RELEASE |
2.2.7.RELEASE | Spring Cloud Hoxton.SR12 | 2.3.12.RELEASE |
2.2.6.RELEASE | Spring Cloud Hoxton.SR9 | 2.3.2.RELEASE |
2.2.1.RELEASE | Spring Cloud Hoxton.SR3 | 2.2.5.RELEASE |
2.2.0.RELEASE | Spring Cloud Hoxton.RELEASE | 2.2.X.RELEASE |
2.1.4.RELEASE | Spring Cloud Greenwich.SR6 | 2.1.13.RELEASE |
2.1.2.RELEASE | Spring Cloud Greenwich | 2.1.X.RELEASE |
2.0.4.RELEASE(停止维护,建议升级) | Spring Cloud Finchley | 2.0.X.RELEASE |
1.5.1.RELEASE(停止维护,建议升级) | Spring Cloud Edgware | 1.5.X.RELEASE |
组件版本关系
每个 Spring Cloud Alibaba 版本及其自身所适配的各组件对应版本如下表所示:
Spring Cloud Alibaba Version | Sentinel Version | Nacos Version | RocketMQ Version | Dubbo Version | Seata Version |
---|---|---|---|---|---|
2.2.10-RC2 | 1.8.6 | 2.2.0 | 4.9.4 | ~ | 1.6.1 |
2.2.10-RC1 | 1.8.6 | 2.2.0 | 4.9.4 | ~ | 1.6.1 |
2.2.9.RELEASE | 1.8.5 | 2.1.0 | 4.9.4 | ~ | 1.5.2 |
2.2.8.RELEASE | 1.8.4 | 2.1.0 | 4.9.3 | ~ | 1.5.1 |
2.2.7.RELEASE | 1.8.1 | 2.0.3 | 4.6.1 | 2.7.13 | 1.3.0 |
2.2.6.RELEASE | 1.8.1 | 1.4.2 | 4.4.0 | 2.7.8 | 1.3.0 |
2.2.3.RELEASE or 2.1.3.RELEASE or 2.0.3.RELEASE | 1.8.0 | 1.3.3 | 4.4.0 | 2.7.8 | 1.3.0 |
2.2.1.RELEASE or 2.1.2.RELEASE or 2.0.2.RELEASE | 1.7.1 | 1.2.1 | 4.4.0 | 2.7.6 | 1.2.0 |
2.2.0.RELEASE | 1.7.1 | 1.1.4 | 4.4.0 | 2.7.4.1 | 1.0.0 |
2.1.1.RELEASE or 2.0.1.RELEASE or 1.5.1.RELEASE | 1.7.0 | 1.1.4 | 4.4.0 | 2.7.3 | 0.9.0 |
2.1.0.RELEASE or 2.0.0.RELEASE or 1.5.0.RELEASE | 1.6.3 | 1.1.1 | 4.4.0 | 2.7.3 | 0.7.1 |
2021.x 分支
适配 Spring Boot 2.4,Spring Cloud 2021.x 版本及以上的 Spring Cloud Alibaba 版本按从新到旧排列如下表(最新版本用*标记):
Spring Cloud Alibaba Version | Spring Cloud Version | Spring Boot Version |
---|---|---|
2021.0.6.0* | Spring Cloud 2021.0.5 | 2.6.13 |
2021.0.5.0 | Spring Cloud 2021.0.5 | 2.6.13 |
2021.0.4.0 | Spring Cloud 2021.0.4 | 2.6.11 |
2021.0.1.0 | Spring Cloud 2021.0.1 | 2.6.3 |
2021.1 | Spring Cloud 2020.0.1 | 2.4.2 |
组件版本关系
每个 Spring Cloud Alibaba 版本及其自身所适配的各组件对应版本如下表所示:
Spring Cloud Alibaba Version | Sentinel Version | Nacos Version | RocketMQ Version | Dubbo Version | Seata Version |
---|---|---|---|---|---|
2021.0.6.0 | 1.8.6 | 2.2.0 | 4.9.4 | ~ | 1.6.1 |
2021.0.5.0 | 1.8.6 | 2.2.0 | 4.9.4 | ~ | 1.6.1 |
2021.0.4.0 | 1.8.5 | 2.0.4 | 4.9.4 | ~ | 1.5.2 |
2021.0.1.0 | 1.8.3 | 1.4.2 | 4.9.2 | ~ | 1.4.2 |
2021.1 or 2.2.5.RELEASE or 2.1.4.RELEASE or 2.0.4.RELEASE | 1.8.0 | 1.4.1 | 4.4.0 | 2.7.8 | 1.3.0 |
2022.x 版本及依赖关系
适配 Spring Boot 3.0,Spring Cloud 2022.x 版本及以上的 Spring Cloud Alibaba 版本按从新到旧排列如下表(最新版本用*标记): (注意,该分支 Spring Cloud Alibaba 版本命名方式进行了调整,未来将对应 Spring Cloud 版本,前三位为 Spring Cloud 版本,最后一位为扩展版本,比如适配 Spring Cloud 2022.0.0 版本对应的 Spring Cloud Alibaba 第一个版本为:2022.0.0.0,第个二版本为:2022.0.0.1,依此类推)
Spring Cloud Alibaba Version | Spring Cloud Version | Spring Boot Version |
---|---|---|
2022.0.0.0* | Spring Cloud 2022.0.0 | 3.0.2 |
2022.0.0.0-RC2 | Spring Cloud 2022.0.0 | 3.0.2 |
2022.0.0.0-RC1 | Spring Cloud 2022.0.0 | 3.0.0 |
组件版本关系
每个 Spring Cloud Alibaba 版本及其自身所适配的各组件对应版本如下表所示:
Spring Cloud Alibaba Version | Sentinel Version | Nacos Version | RocketMQ Version | Seata Version |
---|---|---|---|---|
2022.0.0.0 | 1.8.6 | 2.2.1 | 4.9.4 | 1.7.0 |
2022.0.0.0-RC2 | 1.8.6 | 2.2.1 | 4.9.4 | 1.7.0-native-rc2 |
2022.0.0.0-RC1 | 1.8.6 | 2.2.1-RC | 4.9.4 | 1.6.1 |
2023.x 分支
适配 Spring Boot 3.2,Spring Cloud 2023.x 版本及以上的 Spring Cloud Alibaba 版本按从新到旧排列如下表(最新版本用*标记):
Spring Cloud Alibaba Version | Spring Cloud Version | Spring Boot Version |
---|---|---|
2023.0.1.0* | Spring Cloud 2023.0.1 | 3.2.4 |
2023.0.0.0-RC1 | Spring Cloud 2023.0.0 | 3.2.0 |
组件版本关系
每个 Spring Cloud Alibaba 版本及其自身所适配的各组件对应版本如下表所示:
Spring Cloud Alibaba Version | Sentinel Version | Nacos Version | RocketMQ Version | Seata Version |
---|---|---|---|---|
2023.0.1.0 | 1.8.6 | 2.3.2 | 5.1.4 | 2.0.0 |
2023.0.0.0-RC1 | 1.8.6 | 2.3.0 | 5.1.4 | 2.0.0 |