? 小马哥 & Josh Long ?
喜欢写一首诗一般的代码,更喜欢和你共同 code review,英雄的相惜,犹如时间沉淀下来的对话,历久方弥新。
相见如故,@杭州。
4 月 18 日,Josh Long 来到了阿里巴巴西溪园区,我们向其演示了 Spring Cloud Alibaba 各个组件的功能和实现方式,Josh Long 看完意犹未尽,表示会在新的 Spring Tips 视频再次介绍 Spring Cloud Alibaba 中的其他组件。(点击文末阅读原文,访问上一期spring-tips-bootiful-alibaba)
画外音:首次遇见,@北京:我和 Josh Long 的一天
一天后, Spring Cloud Alibaba 发布了首个 GA 版本,此次开发历时 267 天,汇集 26 位 contributor 的努力,覆盖 Spring Cloud Edgware、Spring Cloud Finchley 和 Spring Cloud Greenwich 3 个版本。Spring Cloud 联合创始人 Spencer Gibb 在 Spring 官网的博客页面宣布该发板消息。随后,Spring Cloud 官方 Twitter 也发布了此消息
Spring 贺电史:
Spring Cloud Alibaba发布第二个版本,Spring 发来贺电
阿里巴巴开源 Spring Cloud Alibaba,加码微服务生态建设
版本概要
概要:
增加了 4 个新的模块:spring-cloud-alibaba-dubbo、spring-cloud-alibaba-seata、spring-cloud-alibaba-sentinel-zuul 以及 spring-cloud-alicloud-sms。
spring-cloud-alibaba-nacos 和 spring-cloud-alibaba-sentinel 对应的组件客户端进行了升级,新增了一些 feature,并且优化了一些功能。
spring-cloud-stream-binder-rocketmq 进行了比较大的重构,并且集成了 RocketMQ Spring 项目。同时 spring-cloud-starter-bus-rocketmq 也进行了一些优化。
修复了之前版本的一些 bug。
新版本的版本号对应关系如下表:
由于 Spring Cloud Alibaba 还在 Spring Cloud 孵化器内,所以版本号不能高于 1。
发布三个版本意味着维护三个分支,这个过程需要付出很多精力来做修改,遇到的难点有以下这些:
F 和 G 版对应的 JDK 版本是 Java 8 及以上,而 E 版还是 Java 7,这意味着 lambda 表达式或其它 Java 8 包含的类或方法等这些 Java8 才有的特性,在 Java 7 的分支下需要重新写一遍。
Spring Cloud 官方提供的组件在不同版本的处理逻辑并不一致,需要逐一进行适配。比如 Sentinel 整合 Feign 的时候,Feign 中的
RequestTemplate#url
方法在 G 版进行了修改。不同版本的 Spring Cloud 规范并不一样,实现方式也变了。比如 Spring Cloud Strean Binder 在 G 版本的接口声明跟 E 、F 版本不一致。
SpringBoot 的兼容性问题,比如 Endpoint 的 id 策略,Actuator 的自动化配置生效写法,SpringApplicationEvent 事件在不同版本的执行顺序、策略变化等等。
测试、回归流程变长等等。
模块详情
1. Spring Cloud Alibaba Seata(原 Fescar)
另外一个新增的组件是 Seata (原 Fescar,即分布式事务解决方案)。
Seata 是 阿里巴巴 开源的分布式事务中间件,以高效并且对业务 0 侵入的方式,解决微服务场景下面临的分布式事务问题。
随着业务需求和架构的变化,单体应用被拆分为微服务,原有的单库数据源已经改成了分别使用独立的数据源。业务过程将由多个个服务的调用来完成。此时,每一个服务内部的数据一致性仍可以通过本地事务来保证,但整个业务层面的全局数据一致性的保障改如何保障呢?这就是 Seata 所解决的微服务架构下典型的分布式事务需求。
Seata 提供了 AT(Automatic Transaction)和 TCC (Try-Confirm-Cancel) 两种工作模式。AT 模式是对业务完全无侵入,支持目前绝大多数 支持 ACID 事务的 关系型数据库。
当事务的参与者只有 支持 ACID 事务的关系型数据库时,Seata 可以在完全不侵入 业务的情况下完成分布式事务方案。
当事务的参与者中包含其他场景时,Seata 提供了与 AT 相应的另外一种工作模式称为 TCC 模式 ,来解决这些场景下的分布式事务问题。TCC 模式下,分支事务需要应用自己来定义业务本身及提交和回滚的逻辑。
Seata 事务的传播是依赖于在微服务调用链中传递 Seata 事务 上下文来完成的。如何在 Spring Cloud 框架中传播 Seata 事务上下文,并使得 Spring Cloud 用户更方便使用 Seata,就是 Spring Cloud Alibaba Seata 解决的问题。
在 Spring Cloud 这一层面,我们通过在微服务中传递事务上下文的方式完成了 Seata 在 Spring Cloud 层面的接入:
Spring MVC 环境下支持自动还原 Seata 事务上下文;
支持服务调用者通过 RestTemplate 或 FeignClient 调用时,自动传递 Seata 事务上下文;
支持 FeignClient 和 Hystrix、Sentinel 同时使用的场景;
2. Spring Cloud Stream RocketMQ Binder
在之前的 RocketMQ Binder 实现中,Binder 内部使用原生的 RocketMQ Producer 和 Consumer 进行消息的处理。
新版本对 RocketMQ Binder 进行了重构,集成了 RocketMQ Spring,其中 RocketMQ Spring 提供了这些功能:
统一使用
RocketMQTemplate
用于消息的发送。提供
@RocketMQListener
注解用于消息的消费。