先来看一下第一代 spring cloud 的组件
组件名称 |
功能 |
描述 |
Eureka | 服务治理(注册、发现......) |
|
Ribbon |
客户端负载均衡器 |
|
Hystrix |
服务之间远程调用时的熔断保护 |
Hystrix 的使用主要有三种方式
|
Feign |
通过定义接口的方式直接调用其他服务的 API |
|
Zuul | 服务网关 |
提供了路由、监控、弹性、安全等服务。Zuul 能够与 Eureka、Ribbon、Hystrix 等组件配合使用。 |
Config |
分布式配置中心组件 |
|
Sleuth |
用于请求链路跟踪 |
|
Stream |
用来为微服务应用构建消息驱动能力 |
spring cloud 现在已经是一种标准了,各公司可以基于它的编程模型编写自己的组件 ,比如Netflix、阿里巴巴都有自己的一套通过spring cloud 编程模型开发的分布式服务组件 。
Spring Cloud Alibaba 主要包含 Sentinel、Nacos、RocketMQ、Dubbo、Seata 等组件。
Spring Cloud 二代组件
二代引入了 Spring Cloud Alibaba
第一代组件 |
第二代组件 |
Eureka |
Nacos |
Config |
Apollo |
Zuul |
spring cloud gateway |
Hystrix |
Sentinel |
Eureka VS Nacos
Eureka 之前官方也宣布了暂停了 2.X 版本的开发,1.X 的版本还会维护。其实对于一般的服务规模,目前的 Eureka 完全够用了。而 Nacos 作为后起之秀,目前更新频率很高,社区也更活跃,使用 Nacos 是一个正确的选择。
Apollo VS Spring Cloud Config
功能 |
spring cloud config |
apollo |
统一配置管理 |
集成Git |
自带存储(MySql) |
多环境区分 |
配置指定 |
配置指定 |
实时更新 |
Bus消息总线 |
Http长连接 |
定时拉取 |
需要自己扩展 |
支持 |
权限控制 |
需要Git支持 |
支持 |
版本管理 |
Git版本 |
有直接的版本功能,一键恢复指定版本 |
Web管理后台 |
无 |
有 |
Zuul VS Spring Cloud Gateway
在 Spring Cloud Gateway 出现之前,网关都是用 Zuul 构建的,虽然 Netflix 开源了 Zuul2,由于各种原因,官方并没有打算将 Zuul2 集成到 Spring Cloud 体系中。而是自己研发了一个全新的网关 Spring Cloud Gateway,由于 Zuul1 基于 Servlet 构建,使用的是阻塞的 IO,性能并不是很理想。Spring Cloud Gateway 则基于 Spring 5、Spring boot 2 和 Reactor 构建,使用 Netty 作为运行时环境,比较完美的支持异步非阻塞编程。
官方提供的压测报告显示 Spring Cloud Gateway 的性能是 Zuul 的 1.5 倍,Spring Cloud Gateway 刚出不久,稳定性有待验证,主要是缺乏大规模流量的验证,而 Zuul 开源的时间较长,同时在 Netflix 内部经过了大规模流量的验证,比较稳定。长期发展来说,Spring Cloud Gateway 的优势比较大,毕竟官方主推。
Hystrix VS Sentinel
Hystrix 替换成了 Sentinel,Hystrix 也停止了开发,这个时候 Spring Cloud Alibaba 中的 Sentinel 的优势就很明显了,Sentinel 支持多样化的流量控制,熔断降级等功能,完全可以替代 Hystrix。
其他
- 分布式事务:Seata
- 消息队列: RocketMQ
- 调用链监控:Apache Skywalking
- 日志查询: ELK
- 指标监控: Prometheus
- 分布式缓存: Redis
- 分布式定时任务:XXL-JOB
整体架构组件
基于以上,如果我来设计系统架构,那么将用以下组件
组件 |
功能 |
Nacos |
服务注册中心 |
Apollo |
分布式配置中心 |
XXL-JOB |
分布式定时任务中心 |
SpringBoot |
微服务组件 |
Sentinel |
服务熔断限流组件 |
Spring Cloud Gateway |
微服务网关 |
Spring Cloud OpenFeign |
服务通信调用 |
Seata |
分布式事务 |
RocketMQ |
消息队列 |
Skywalking |
服务调用链监控系统 |
Redis |
分布式缓存 |
ELK |
日志收集、查询系统 |
Prometheus |
Metrics指标监控系统 |
此外,微服务集群是以容器的方式部署的,用K8S进行docker集群管理。