「这是我参与11月更文挑战的第22天,活动详情查看:2021最后一次更文挑战」
平时总是在讲Spring Cloud微服务,项目中使用微服务也是比较片面、流于表面,对于Spring Cloud缺少宏观完整的了解,这次就趁着年底的寒潮把Spring Cloud好好学习一下。
1. Spring Cloud是什么
Spring Cloud作为开发分布式系统的全家桶,是一个用于构建微服务开发和治理的框架集合。Spring Cloud通过提供整合一系列框架工具,来帮助开发人员迅速搭建分布式系统中的公共组件,如配置管理、服务发现、熔断器、路由、全局锁、主节点选举、分布式会话、控制总线、一次性令牌、集群状态等。
Spring Cloud基于Spring Boot项目进行创建,并通过Spring Boot对项目开发的简化,来管理Spring Boot创建的各个微服务项目,得到一个完整的系统功能。
Spring Cloud官方文档地址为:spring.io/projects/sp…
2. Spring Cloud的使用
2.1 微服务的优势
由于Spring Cloud开发模式带来的高效和便利,越来越多的公司项目加入微服务行列,使用Spring Cloud带来的好处有:
- 多个服务独立部署,按需启停和部署,启动速度更快,模块高内聚、低耦合
- 模块职责单一,每个服务提供专门的功能,由专门的人员负责维护
- 服务可以基于不同方式、不同语言开发,只需提供相应功能,服务之间通过HTTP请求交互
- 服务独立升级迭代,快速发布版本,如有需要可以对服务单独扩展性能,成本低
2.2 微服务带来的问题
与此同时,服务的拆分也会带来一些问题:
- 分布式部署,通过网络调用的方式增加了模块之间的交互复杂度,请求速度受到影响
- 为了提升访问速度,有了Feign等基于HTTP、dubbo、netty基于RPC实现服务远程调用
- 服务拆分后使用单独的数据存储数据,实现数据的去中心化,但是也带来了数据的一致性问题
- 为了实现数据一致性,出现了微服务下的分布式事务来保证数据的最终一致性
- 服务提供API被其他服务调用,修改接口时需要保证其他服务调用的可用性,增加问题定位和测试难度
- 通过引入自动化测试来保证模块服务接口的功能稳定
- 多个服务分别部署、监控,还要保证所有服务功能可用,增加了运维人员的压力
- 基于Jenkins、docker、k8s等技术实现的持续集成、部署模式提供解决方案
2.3 什么情况更适合Spring Cloud
既然Spring Cloud带来了这么多的好处,那么是不是所有的项目都应该采用微服务架构呢?
事实并非如此,微服务作为一种架构模式,也仅是针对部分业务项目才能带来功能和效率上的提升,如果项目追求稳定,对于性能和迭代需求较低,那么就没有必要使用Spring Cloud。
因此,Spring Cloud更适用于如下的项目场景中:
- 大型复杂系统,提供功能丰富,且需要各功能模块关联配合,适合根据系统功能模块拆分,独立部署开发,相互请求关联,减小系统耦合
- 高并发需求项目,如商城项目的秒杀需求,此类项目需要保证高并发服务稳定性,甚至可以对其他服务降级来保证主服务,此情况下需要分别部署服务
- 快速迭代类项目,如果项目需求多更新频繁,不宜每次对整个服务迭代,可以按照系统功能分开部署,按需独立开发、快速迭代
3. Spring Cloud包括哪些模块
Spring Cloud作为一个框架集合,其中支持了众多的技术框架,来实现一站式微服务开发和治理,在Spring Cloud的发展历程中,出现了Spring Cloud Netflix、Spring Cloud Alibaba、以及Spring Cloud官方推出的实现微服务的架构设计方案。
3.1 Spring Cloud Netflix
Spring Cloud Netflix 通过自动配置的方式绑定到Spring Boot环境中,并提供Netflix OSS的框架集成到应用中。
Netflix OSS项目是Netflix公司开源的一整套用于大型分布式项目架构的微服务架构技术栈,而Spring Cloud Netflix则提供了一系列的封装将Netflix OSS集成到Spring Boot项目中,并对多个Spring Boot服务的进一步管理构建形成微服务架构,就有了Spring Cloud。
Spring Cloud Netflix 提供的功能有:
- Eureka:注册中心,提供服务的注册与发现功能,用来管理微服务
- Ribbon:基于客户端的负载均衡组件
- Hystrix:服务容错框架,用于防止服务发生故障时的雪崩效应
- Zuul:API的网关组件,提供整个服务中的路由转发、请求过滤等功能
- Feign:Web服务客户端,提供微服务之间的HTTP请求功能
- Archaius :提供分布式配置功能
3.2 Spring Cloud Alibaba
Spring Cloud Alibaba为分布式应用开发提供一站式解决方案,它包含开发分布式应用程序所需的所有组件,使你可以轻松地使用Spring Cloud开发应用程序。
使用Spring Cloud Alibaba,只需要添加一些注解和少量配置,就可以将Spring Cloud应用连接到阿里巴巴的分布式解决方案中,并通过阿里巴巴中间件构建分布式应用系统。
Spring Cloud Alibaba提供了功能组件有:
- Nacos,提供服务注册与发现,并通过Netflix支持Ribbon,实现客户端的负载均衡。同时Nacos又可以作为存储中心来进行分布式配置管理。
- Sentinel,通过哨兵机制实现服务限流、熔断降级等,保证服务稳定性
- RocketMQ,Java写的消息驱动组件,基于高可用分布式集群技术,实现消息发布与订阅服务
- Seata,高性能微服务分布式事务解决方案
- Dubbo,高性能RPC框架,用于实现服务通信
除此之外,使用Spring Cloud Alibaba提供服务时,还可以更好的兼容阿里巴巴的其他商业解决方案,如:
- SMS,阿里短信服务
- OSS,阿里云对象存储服务
- SchedulerX,阿里巴巴分布式任务调度
3.3 Spring Cloud 官方
除了Netflix和Alibaba两个微服务架构解决方案外,Spring Cloud 官方也提出了众多的框架组件来满足微服务项目架构的需要。
- Consul,服务治理,注册发现
- Gateway,网关,提供路由转发、请求过滤,服务限流等功能,旨在为微服务架构提供一种简单而有效的统一的API路由管理方式
- OpenFeign,基于HTTP的服务调用,类似Netflix的Feign组件
- Config,分布式配置管理
- Sleuth,服务跟踪组件
- Bus,消息代理的集群消息总线
- Stream,构建消息驱动的微服务应用程序
4. 版本迭代命名
4.1 Spring Cloud版本命名方式
Spring Cloud版本名称为了与Alibaba、Netflix等子项目版本号进行区分,使用英文单词作为版本而不是数字版本号。其中,作为版本的英文单词来均源于伦敦地铁站名称,并且根据首字母排序进行版本号的迭代。
如下图是Spring Cloud官方给出的Cloud版本与Boot版本的对应关系图:
4.2 子项目版本命名方式
对于Spring Cloud Alibaba、Netflix子项目的命名方式则有一套自己的规则,如Spring Cloud Alibaba 2.1.0.RELEASE项目版本,其中各数字代表的含义为:
- Spring Cloud Alibaba:子项目名称
- 2:主版本号,一般指功能模块有较大更新或者整体架构发生变化时更新的版本
- 1:次版本号,表示只有局部变动的更新
- 0:修改版本号,一般作为项目bug修复的变动版本
- RELEASE:希腊字母版本号,标注当前版本的软件处于哪个开发阶段,具体详情有:
- Base:项目设计阶段,表示还没有具体的功能实现
- Alpha:软件开发的初级版本,存在较多的bug
- Bate:表示相比于Alpha版本有较大的改进,消除了严重的bug
- Gamma:基于Beta版本进一步改进,作为正式版本发布前的候选版本
- Release:该版本表示最终正式版本。