这是艿艿从春节开始默默在家撸的 Spring Cloud Alibaba 系列文章,已经完成给 Spring Cloud Alibaba 官方投稿,嘿嘿!
所有示例代码,都在 https://github.com/YunaiV/SpringBoot-Labs 仓库下。已经要 4000 Star,还不赶紧!!!嘿嘿~
下半年要开始憋点新东西,开森!美滋滋!2333333333333
“摘要: 原创出处 http://www.iocoder.cn/Spring-Cloud-Alibaba/intro/ 「芋道源码」欢迎转载,保留摘要,谢谢!
- 1. Spring Cloud 体系
- 2. Spring Cloud Alibaba 套件
- 3. 选择 Spring Cloud 还是 Dubbo?
- 666. 彩蛋
“1. Spring Cloud 体系本文在提供完整代码示例,可见 https://github.com/YunaiV/SpringBoot-Labs
原创不易,给点个 Star 嘿,一起冲鸭!
相信很多胖友都看过如下一张图:
- Spring 以 Bean(对象) 为中心,提供 IOC、AOP 等功能。
- Spring Boot 以 Application(应用) 为中心,提供自动配置、监控等功能。
- Spring Cloud 以 Service(服务) 为中心,提供服务的注册与发现、服务的调用与负载均衡等功能。
先来一起看看 Spring Cloud 官方对自己的简短介绍:
“FROM https://github.com/spring-cloud
Tools for building common patterns in distributed systems with Spring
- 基于 Spring 构建分布式系统的工具集,简称“Spring 全家桶”。
再来一起看看 Spring Cloud 官方对功能点的介绍:
“FROM https://spring.io/projects/spring-cloud
功能列表:
- 【配置中心】Distributed/versioned configuration
- 【注册中心】Service registration and discovery
- 【API 网关】Routing
- 【服务调用】Service-to-service calls
- 【负载均衡】Load balancing
- 【服务容错】Circuit Breakers
- 【分布式消息】Distributed messaging
------------ 分隔线 -------------
如下功能,从 Spring Cloud 迁移到 Spring Integration 中:
- 【全局锁】Global locks
- 【领导选举与集群状态】Leadership election and cluster state
虽然 Spring Cloud 提供了非常强大的功能,但是它并不提供所有的实现,而是通过 Spring Cloud Common 子项目,定义了统一的抽象 API。如下图所示:
而后,不同厂商结合其自身的中间件,提供自己的 Spring Cloud 套件,例如说:
-
Netflix 结合自己的 Eureka、Ribbon、Hystrix 等开源中间件,实现了 spring-cloud-netflix
“
Spring Cloud Netflix 是目前国内使用最为流行的 Spring Cloud 套件。不过随着 Netflix 在开源的调整,逐步会慢慢没落。
-
Kubernetes 结合自己的 apiserver、configmap 等功能,实现了 spring-cloud-kubernetes
-
Alibaba 结合自己的 Nacos、Dubbo、Sentinel 等开源中间件,实现了 spring-cloud-alibaba
“
目测 Spring Cloud Alibaba 在国内会火?!
当然,Spring Cloud 官方还是提供了一些功能的具体实现的,嘿嘿。例如说:
- API 网关:Spring Cloud Gateway
- 配置中心:Spring Cloud Config、Spring Cloud Vault
- 链路追踪:Spring Cloud Sleuth
- 消息驱动:Spring Cloud Stream
- 事件总线:Spring Cloud Bus
- 服务调用:Spring Cloud OpenFeign
- 负载均衡:Spring Cloud Load Balancer
下面,我们把 Spring Cloud 官方、Netflix、Alibaba 三者整理成如下表格:
Spring Cloud 技术栈整理2. Spring Cloud Alibaba 套件Spring Cloud Alibaba 套件,阿里开源组件、阿里云商业组件整合进 Spring Cloud 体系当中,同时对 Spring Cloud Gateway、OpenFeign、Ribbon 等等进行集成。整体如下图所示:
“ Spring Cloud Alibaba 全景图
我们可以将 Spring Cloud Alibaba 套件中的阿里开源组件和阿里云商业组件整理成如下对照表:
开源 V.S. 商业主要功能如下:
- 服务注册与发现:适配 Spring Cloud 服务注册与发现标准,默认集成了 Ribbon 的支持。
- 分布式配置管理:支持分布式系统中的外部化配置,配置更改时自动刷新。
- 服务限流降级:默认支持 WebServlet、WebFlux, OpenFeign、RestTemplate、Spring Cloud Gateway, Zuul, Dubbo 和 RocketMQ 限流降级功能的接入,可以在运行时通过控制台实时修改限流降级规则,还支持查看限流降级 Metrics 监控。
- 消息驱动能力:基于 Spring Cloud Stream 为微服务应用构建消息驱动能力。
- 分布式事务:使用 @GlobalTransactional 注解, 高效并且对业务零侵入地解决分布式事务问题。
商业化独有功能如下:
-
分布式任务调度:提供秒级、精准、高可靠、高可用的定时(基于 Cron 表达式)任务调度服务。同时提供分布式的任务执行模型,如网格任务。网格任务支持海量子任务均匀分配到所有 Worker(schedulerx-client)上执行。
“
曾经,阿里 SchedulerX 也是一个开源项目,现在已经木有消息了...嘿嘿,希望未来能够重启。
-
阿里云对象存储:阿里云提供的海量、安全、低成本、高可靠的云存储服务。支持在任何应用、任何时间、任何地点存储和访问任意类型的数据。
-
阿里云短信服务:覆盖全球的短信服务,友好、高效、智能的互联化通讯能力,帮助企业迅速搭建客户触达通道。
“
友情提示:艿艿还是比较推荐使用云片来发送短信,客服妹子基本是秒回,特别是审核短信模板的时候。
2.1 阿里开源组件
2.1.1 Nacos
Nacos:一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。
- 《芋道 Spring Cloud Alibaba 注册中心 Nacos 入门》
- 《芋道 Spring Cloud Alibaba 配置中心 Nacos 入门》
2.1.2 Dubbo
Dubbo:Apache Dubbo™ 是一款高性能 Java RPC 框架。
- 《芋道 Spring Cloud Alibaba 服务调用 Dubbo 入门》
2.1.3 Sentinel
Sentinel:把流量作为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。
- 《芋道 Spring Cloud Alibaba 服务容错 Sentinel 入门》
2.1.4 RocketMQ
RocketMQ:一款开源的分布式消息系统,基于高可用分布式集群技术,提供低延时的、高可靠的消息发布与订阅服务。
- 《芋道 Spring Cloud Alibaba 消息队列 RocketMQ 入门》
- 《芋道 Spring Cloud Alibaba 事件总线 Bus RocketMQ 入门》 对应 labx-20
2.1.5 Seata
Seata:阿里巴巴开源产品,一个易于使用的高性能微服务分布式事务解决方案。
- 《芋道 Spring Cloud Alibaba 分布式事务 Seata 入门》
2.2 阿里云商业组件
2.2.1 Alibaba Cloud ACM
Alibaba Cloud ACM:一款在分布式架构环境中对应用配置进行集中管理和推送的应用配置中心产品。
2.2.2 Alibaba Cloud OSS
Alibaba Cloud OSS: 阿里云对象存储服务(Object Storage Service,简称 OSS),是阿里云提供的海量、安全、低成本、高可靠的云存储服务。您可以在任何应用、任何时间、任何地点存储和访问任意类型的数据。
2.2.3 Alibaba Cloud SchedulerX
Alibaba Cloud SchedulerX: 阿里中间件团队开发的一款分布式任务调度产品,提供秒级、精准、高可靠、高可用的定时(基于 Cron 表达式)任务调度服务。
2.2.4 Alibaba Cloud SMS
Alibaba Cloud SMS: 覆盖全球的短信服务,友好、高效、智能的互联化通讯能力,帮助企业迅速搭建客户触达通道。
2.3 集成其它 Spring Cloud 组件
Spring Cloud Alibaba 在融入 Spring Cloud 体系之后,可以方便和其它 Spring Cloud 组件进行混合使用,强强联合。这也可以弥补,Alibaba 暂时缺失的开源组件。
“友情提示:如下艿艿只补充 Spring Cloud Alibaba 缺失的组件。
2.3.1 API 网关
- 【推荐】《芋道 Spring Cloud 服务网关 Spring Cloud Gateway 入门》
- 《芋道 Spring Cloud 服务网关 Zuul》计划中...
2.3.2 链路追踪
- 【推荐】《芋道 Spring Cloud 链路追踪 SkyWalking 入门》
- 《芋道 Spring Cloud 链路追踪 Spring Cloud Sleuth》
2.3.3 服务调用 + 负载均衡
- 《芋道 Spring Cloud Netflix 负载均衡 Ribbon 入门》
- 《芋道 Spring Cloud 声明式调用 Feign 入门》
相信很多胖友在做微服务架构的技术选型的时候,基本会面临到的一个问题,特别是这个问题发生在 Dubbo 停止维护的时期?知乎上还有一个非常热门的讨论帖子《Spring Cloud 和 Dubbo 各自的优缺点是什么? 》。
3.1 选择 Spring Cloud 体系?
先假设,选择 Spring Cloud 体系,那么我们就要思考选择哪一个 Spring Cloud 套件。目前最流行的,可能是 Netflix 提供的 Spring Cloud Netflix 套件。
但是世界总是这么有趣,Netflix 开始减少在开源领域的投入,逐步开始停止维护其组件:
- 《Netflix 宣布停止开发Hystrix》
- 《Eureka 2.0 开源工作宣告停止,继续使用风险自负》
- Netflix 将 Feign 捐献给 OpenFeign 社区
- Spring Cloud 官方团队不考虑提供 Zuul 2 的支持,见 Zuul#ISSUE483
- Ribbon 进入维护状态,可见 Ribbon 项目首页
因此,Spring Cloud Netflix 进入维护模式,可见《Spring Cloud Greenwich.RC1 available now》新闻。如下图所示:
Spring Cloud Netflix 维护模式那么,Spring Cloud Netflix 可能不是一个很好的选择。但是,Spring Cloud 又暂时没有其它非常流行的套件,暂时可靠的貌似只有 Alibaba 提供的 Spring Cloud Alibaba 套件!在 Wanted: who's using Spring Cloud Alibaba 中,可以看到目前在使用 Spring Cloud Alibaba 的公司和团队。
另外,听说 Spring Cloud Alibaba 会成为 Spring Cloud 第二代标准实现,但是艿艿暂时没找到这块的资料和新闻。
3.2 选择 Spring Cloud Alibaba 还是 Dubbo?
事实上,Dubbo 已经从一个 RPC 框架,慢慢演变成了 Dubbo 生态,如下图所示:
“FROM http://dubbo.apache.org/zh-cn/ecology/index.html
Dubbo 生态
非常丰富,我们在 Spring Cloud Alibaba 看到的组件,在 Dubbo 生态中都提供了对应的集成。所以吧,这样看下来,无论选择 Spring Cloud Alibaba 还是 Dubbo 体系,都是非常不错的选择。
如果胖友选择 Dubbo 体系,推荐阅读如下文章:
- 《芋道 Spring Boot Dubbo 入门》
- 《芋道 Spring Boot 注册中心 Nacos 入门》
- 《芋道 Spring Boot 配置中心 Nacos 入门》
- 《芋道 Spring Boot 服务容错 Sentinel 入门》
- 《芋道 Spring Boot 消息队列 RocketMQ 入门》
- 《芋道 Dubbo 分布式事务 Seata 入门》
- 《芋道 Spring Boot 链路追踪 SkyWalking 入门》
目前,艿艿自己团队选择的是 Spring Boot + Dubbo 作为整体架构,正在考虑慢慢迁移到 Spring Cloud Alibaba 上。主要原因是,我们面向的是 B 端业务,需要考虑私有化部署,而 Spring Cloud 相比 Dubbo 更易实现中间件的透明迁移。
例如说,Spring Cloud Stream RocketMQ 迁移到 Spring Cloud Stream Kafka 或 Spring Cloud Stream RabbitMQ 只需要修改配置文件即可。感兴趣的胖友,可以对比学习如下三篇文章:
“旁白君:毕竟私有化部署时,对方可能会对使用什么基础组件会有要求,他就不喜欢 RocketMQ 而要 RabbitMQ 消息队列。