Spring 社区的首个国产开源项目顺利毕业

阅读数:7263 2019 年 8 月 17 日 08:00

Spring 社区的首个国产开源项目顺利毕业

SpringCloudAlibaba 于 2018 年 7 月 27 日在 SpringCloud 孵化器仓库提交第一次代码,到 2019 年 8 月 1 日在 Alibaba 仓库发布第一个毕业版本,时间将近整整一年。

一年时间,SpringCloudAlibaba 完成了从 SpringCloud 最默默无闻的项目到 SpringCloud 最火项目的蜕变,并且从孵化器仓库毕业了!

SpringCloudAlibaba 的正式毕业离不开社区的帮助,非常感谢 SpringCloudAlibaba 的 contributor,也非常感谢社区开源爱好者们创建的 issue,每一个 issue 都是对 SpringCloudAlibaba 的帮助。

SpringCloudAlibaba 毕业过程中的一些小插曲

1、在 5 月底的时候,SpringCloudAlibabaTeam 跟 SpringCloudTeam 有过一次毕业的沟通,并且准备在 SpringCloudHoxton 正式发布的时候宣布 SpringCloudAlibaba 毕业。只不过后来 SpringCloud 官方调整了项目策略,需要进行仓库迁移。双方 team 后续还因此开了一个视频会议,SpringCloudAlibaba 因此提前毕业。

2、SpringCloudTeam 希望毕业后的 starter 命名方式跟 springbootstarter 规定的格式一致,以 alibaba–spring-cloud-starter 的格式进行命令。考虑到孵化器的 starter 都是以 spring-cloud-starter-alibaba- 开头,SpringCloudAlibaba 并不想破坏原有的规则。最终双方讨论了好多次才决定沿用老的 starter 命名方式。

3、在仓库迁移后的几天时间内,有社区的开源爱好者专门创建 issue 提问为何离开 springcloud 仓库,SpringCloudAlibaba 被各种质疑。后来 SpringCloudLeader-SpencerGibb 在 issue 上回复进行了解释。

4、SpringCloudAlibaba 本来计划是 6 月份发布毕业版本,结果拖到了现在。为了引起不必要的舆论风险,我们一直在等待 SpringCloudTeam 官方的公告发布,期间跟 SpringCloudTeam 沟通了好多个晚上 (有 12 小时时差)。

官方文章解读

Spring 社区的首个国产开源项目顺利毕业

官方文章内容写得有点多,我们翻译一下并做个简单的总结:

集成到 SpringCloudReleaseTrain 带来的不便:

  • 项目的维护者不能自行发版,从而无法与项目集成的技术组件的 roadmap 保持一致,必须等到 SpringCloud 的下一个 ReleaseTrain 才能发布新的版本更新集成的技术组件。
  • 项目的维护者没有办法看到关键的统计数据,如 github 中的关键数据,以及在依赖被下载了多少次。

以下的这些合作,其实与在不在 SpringCloudReleaseTrain 中没有关系:

  • SpringCloudTeam 会参与到项目中,进行代码 review 帮助更好地集成到 SpringCloud。
  • SpringCloudAlibabaStarter 会加入到 start.spring.io 中,供用户选择。
  • SpringTeam 会将 SpringCloudAlibaba 项目放在官方介绍页上 https://spring.io/projects/spring-cloud-alibaba ,介绍项目重要的一些发版和功能特性。

仓库迁移对于开发者来说,实际意味着什么?

  • 从 SpringCloud 的 github 中迁移并不是意味着这些项目的开发和维护模式有改变,SpringCloudAlibabaTeam&SpringCloudTeam 仍然维护着项目。
  • 新的模式意味着 groupId 会发生改变,甚至有些项目的 artifactId 会改变,项目中的 packagename 也会发生变化。需要用户侧代码修改。
  • 开发人员需要明确地在开发中指明依赖的版本,不能通过 SpringCloudBOM 继承依赖。
  • 作为先行者,SpringCloudAlibaba 将会首先遵循新的策略,SpringCloudAlibaba 在毕业这个重大的时机迁移是一个合适的时间。未来大家会看到更多的组件从 SpringCloudReleaseTrain 中迁移出去。

本次毕业版本的 releasenote

1、Greenwich 对应的版本支持此 Greenwich.SR2 版本

2、Finchley 对应的版本支持此 Finchley.SR4 版本

3、Sentinel

  • sentinel 相关依赖的版本更新至 1.6.3。Sentinel 各版本的 release 信息参考这里
  • issue615:支持 SpringCloudGateway,spring-cloud-alibaba-sentinel-zuul 重命名为 spring-cloud-alibaba-sentinel-gateway。该模块实现了 Sentinel 适配网关 (SpringCloudGateway,NetflixZuul) 相关的逻辑
  • issue614:支持 WebFlux,spring-cloud-alibaba-starter-sentinel 内部分别适配了 WebServlet 和 WebFlux
  • issue626:SentinelOpenFeign 场景下解决了接口继承场景下调用父类接口方法出错的 bug
  • issue782:SentinelOpenFeign 场景下解决了接口中存在 default 方法下调用 default 方法出错的 bug
  • issue741、issue615:新增网关和 http-method-specify 相关的配置
  • issue716:优化了 SlotChainBuilder 的加载逻辑,确保非网关场景下 HotParamSlotChainBuilder 生效,网关场景下 SlotChainBuilder 生效
  • issue707:删除 DataSource 相关的加载日志,改由 Sentinel 自身的 SPI 实现 (未来实现)
  • issue265:添加 SentinelHealthIndicator 用于查询 Sentinel 的健康状态

4、NacosDiscovery

  • nacos-client 版本更新至 1.1.1。Nacos 各版本的 release 信息参考这里
  • issue765:添加心跳相关的配置参数。包括心跳的周期、心跳超时时间以及实例删除的超时时间
  • issue669:添加 NacosRule 支持权重的 Ribbon 路由规则
  • issue728:支持 ServiceRegistryEndpoint 对当前应用服务状态的操作 / 查询
  • issue708:支持与 SpringCloudConfig 共同使用
  • issue650:适配 ServerIntrospector,可获取 metadata 以及 secure 信息
  • issue644:NacosWatch 删除内部逻辑,只进行 HeartbeatEvent 事件的发送

5、NacosConfig

  • nacos-clinet 版本更新至 1.1.1。Nacos 各版本的 release 信息参考这里
  • issue652:修复 NacosConfigEndpoint 线程不安全的 bug

6、RocketMQBinder

  • issue541:适配 MessageSource,consumer 端可以注入 PollableMessageSource 进行消息的拉取
  • issue709:解决不同 jvm 下 instanceName 相同导致 rebalance 失败的 bug

7、DubboSpringCloud

  • dubbo 版本更新至 2.7.3。Dubbo 各版本的 release 信息参考这里
  • issue589:ip 获取策略使用 SpringCloud 官方的 InetUtils 工具获取
  • issue592:SpringCloud 注册中心配置 spring-cloud://localhost 成为可选项,默认直接沿用原生的 SpringCloud 注册中心
  • issue623:为服务实例的变化新增监听机制
  • issue591:修复某些场景下启动报 NPE 的 bug
  • issue600:不再强依赖 spring-boot-actuator,成为可选依赖

8、Seata

  • seata 版本更新至 0.7.1。Seata 各版本的 release 信息参考这里
  • issue686:修复负载均衡的 FeignClient 场景下 xid 传递失败的 bug

Thanksforthecontributors:@Rivers-Shall,@ly641921791,@JevonYang,@cdfive,@eacdy,@pyhblacksky,@george510257,@AbelSara,@slievrly,@pigxcloud,@lovepoem,@liudaomanbu,@lujian0571,@jsbxyyx,@pengzai170,@hero-zhanghao,@wzlee,@xingfudeshi

Roadmap

1、SpringBootAdmin 是一个开源社区项目,用于管理和监控 SpringBoot 应用程序。但是它没有跟 SpringCloud 做深度的整合。我们希望做一个 SpringCloudAdmin,它能提供如下功能:

  • 增加服务治理控制台,整合微服务控制能力
  • 服务查询、管理
  • 配置管理
  • 限流降级等
  • 项目管理 / 监控

2、参考 SpringCloudAzurePlayground http://azure-spring-cloud.azurewebsites.net/ ,创造 SpringCloudAlibabaPlayground,把一些最佳实践,视频教程,自动生成项目等功能放上去。

3、增加 SpringCloudAlibaba 最佳实践项目。

4、针对 SpringCloudAlibaba 各种特性,开发对应的实战 Demo。

5、替换 SpringCloud 服务调用客户端 OpenFeign&Ribbon。开发更通用的服务调用客户端,替换 SpringCloud 服务调用客户端 OpenFeign&Ribbon。

Committer 机制

项目迁移到 Alibaba 自身的 GitHub 仓库后,不像在 spring-cloud-incubator 仓库中那样没有权限发展 committer。我们现在有权限发展 contributor 成为 committer。任何人只要在 SpringCloudAlibaba 项目上提交了 PullRequest 并且被 merge,就可以成为 contributor;contributor 晋升为为 committer,需要这些条件:

1、至少提交 5 个有分量的 PullRequest

2、参与 issue 列表的维护及重要 feature 的讨论

3、参与 codereview

希望有越来越多的开源爱好者能够成为 SpringCloudAlibaba 的 contributor 或 committer,让我们共同完善 SpringCloud 生态。

毕业后用户侧代码修改

仓库迁移必定涉及到代码修改。我们总结修改点有 3 点:

1、包名 packagename

2、版本号 versionnumber

3、如果用到了 SpringCloudAlibaba 内部类,需要 reimport 这些类 (少部分情况才需要改,大部分情况这些类都被 AutoConfiguration 屏蔽了)

以使用 SpringCloudAlibabaBom 和 SpringCloudNacosDiscovery 为例,了解修改点到底有哪些:

孵化器对应的 bom 和 starter 版本依赖

复制代码
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>0.9.0.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

毕业对应的版本依赖

复制代码
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.1.0.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

我们在 GitHub 上提供了一个项目,详情参考这里

用于对比毕业版本跟孵化器版本开发项目的区别。该项目使用了 NacosConfig&NacosDiscovery&Sentinel 功能,master 分支是毕业版本,incubator 分支是孵化器版本。这是使用 diff 命令比较两个分支代码的不同点:

结论: 我们发现只有 pom 里的包名和版本号不一致,代码层面无需任何修改。

版本的对应关系:

Spring 社区的首个国产开源项目顺利毕业

项目地址参考这里

作者介绍

方剑,花名洛夜,GitHubID@fangjian0423,开源爱好者,阿里巴巴高级开发工程师,阿里云产品 EDAS 开发,SpringCloudAlibaba 开源项目负责人。

本文转载自云栖社区

原文链接

https://yq.aliyun.com/articles/712296

收藏

评论

微博

用户头像
发表评论

注册/登录 InfoQ 发表评论