大公司开源怎么做？SOFAStack 给出一个很好的例子
自从 SOFAStack 开源以来，我先后和杨冰、鲁直从 SOFA 开源的思想、战略层面进行过深入沟通，而这次，我希望可以从战术上，从实操层面分享他们在 SOFA 开源方面的经验给广大的开源社区和开源企业。
蚂蚁金服 SOFA
自从 SOFAStack 开源以来，我先后和杨冰、鲁直从 SOFA 开源的思想、战略层面进行过深入沟通，而这次，我希望可以从战术上，从实操层面分享他们在 SOFA 开源方面的经验给广大的开源社区和开源企业。
![](/data/attachment/album/201907/22/214517mmghhmoocslshgp2.jpg)


蚂蚁金服的 SOFAStack 作为一个成功地将企业私有项目转化为开源核心模式的知名案例，我们之前对背后的思考和推动力做过专题分析，但是具体这件事是如何在蚂蚁金服内部发生的、是如何实操的，有很多读者向我们表示非常感兴趣，而我觉得这也是其它技术公司所正在探索和思考的方向。


因此，上个月底，老王在参加上海举办的 KubeCon 2019 时，遇到了蚂蚁金服 SOFA 团队的余淮，他目前在蚂蚁金服中间件团队服务与框架组具体负责开发框架与 SOFAStack 的开源工作。于是，参会之余，我和余淮就 SOFA 开源的实操方面进行了深入的沟通，现将谈话所得整理给大家。


![余淮（左）和老王（右）在 KubeCon 2019](/data/attachment/album/201907/22/212902qqy22y92mkq93bw8.jpg)


### SOFA 与开源


2018 年，SOFAStack 开始开源之后，处于关注，我曾向蚂蚁金服中间件负责人杨冰了解过[为什么要将 SOFA 开源的背后思考，以及 SOFA 发展迭代的历程](/article-10548-1.html)。


目前，SOFA 的架构已经发展到 SOFA 5 阶段，前任的 SOFA 开源负责人鲁直也向我介绍过 [SOFA 5 中重点推进的方向](/article-10794-1.html)，主要包括 Service Mesh 和 Serverless，以及分布式事务 Seata 的落地等。而在今年上半年他们又[开源了分布式事务框架 Seata](/article-10693-1.html) 和服务注册中心 SOFARegistry。


作为一个成功的开源核心模式的项目，我非常关注 SOFA 开源的实操是如何进行的，是如何进行开源治理的，作为 SOFA 团队的老朋友，我们话题就直接从 SOFA 的开源治理聊起。


### 以 SOFA 为例：公司内部软件的开源流程


余淮说，从 2015 年开始，蚂蚁金服开启了金融科技对外输出的战略，SOFAStack 也走出了蚂蚁金服，甚至跨越了国界，被更多金融机构与合作伙伴所使用，如天弘基金、信美互信、南京银行、PayTM、DANA 钱包等。


在与合作伙伴以及客户的沟通、合作过程中，他们发现了 SOFAStack 的理念和能力也正是很多金融行业的企业所需要的。在蚂蚁金融科技对外输出的过程中，内部已经对 SOFAStack 进行了一定程度的代码重构，例如历史兼容逻辑的剥离等，但是并未能达到直接开源的标准。 


关于开源，其内部一直有开源的讨论，到 2017 年双十一结束后正式决定开源。经过了一系列的准备，2018 年 4 月，完成了对 SOFA 项目的满足了开源改造的标准后，SOFAStack 马上宣布正式开源框架中部分重要组件。


**SOFA 团队给开源定的策略叫「<ruby> 开源核心 <rp>  （ </rp> <rt>  Open Core </rt> <rp>  ） </rp></ruby>」，顾名思义就是要将接口层以及核心实现都开源，以可扩展化的方式来层层构建 SOFAStack 的能力，保证 SOFAStack 的内部版本和开源的版本采用的是同一个内核**。为此 SOFAStack 做了大量的改造和重构工作。 


在开源的具体考量上，余淮表示，**SOFAStack 的开源改造基本上有三条原则，分别是高可扩展性、对内兼容历史版本、对外兼容业界标准**。 


以 SOFARPC 重构为例，大概经历了这样的过程：


1. 首先需要将 SOFARPC 进行了一次核心接口和模型抽象，然后增加了扩展点机制和事件总线机制，所有的对内、对外实现都基于这些核心接口和模型去扩展，并且保证这些扩展能力都是平等的、可选的；
2. 接着将核心的处理逻辑实现迁移到这套接口和模型上来，保证 RPC 能力完整可用；
3. 然后需要将 RPC 里一些对接内部系统的、兼容历史逻辑的代码做成内部扩展，并进行全量测试验证，确保和已有线上的历史方案的兼容，发布上线；
4. 最后会调研业界的一些开源标准方案和实现，并对其进行兼容，例如 SOFARPC 不仅对接自己的 SOFARegistry 的实现，还兼容了 Zookeeper、Etcd、Nacos 等业界优秀的注册中心方案。


虽然上面重构过程听上去没那么复杂，但是在实际过程中还是非常考验团队的技术能力的，特别是在抽象核心接口和模型的时候，为了做到既兼容内部又兼容外部，这需要进行大量的调研工作，才能做好这层较为通用抽象。其次在对内逻辑兼容的时候，由于内部的历史负担还是比较重的，为了能让重构的代码安全上线，团队也做了很多事情。


还是举 SOFARPC 的例子，蚂蚁内部的服务路由过程比开源是要复杂很多的，特别是配合蚂蚁特有的单元化部署以及异地多活的能力，有时候需要多层路由才能找到目标地址。为了验证重构后逻辑的正确性，除了在开源代码里有单元测试用例外，SOFA 团队在内部也构建了一套非常完善的集成框架，专门用来测试已有逻辑的兼容性及正确性。


基于开源核心这套思想建设 SOFAStack 以后，其实对开发人员的工作量来不会变少，反而可能是增多的。这是因为在写代码的同时，需要更多的考虑内部外部的使用情况，对代码质量也提出了更高的要求，开发流程会变得更加复杂。


例如，内部新增一个特性，在以前可能直接修改代码经过测试就发布上线了，但现在的话会去思考这其中哪些能力是通用的，把这些能力抽象一下放到开源版本里去，然后开源版测试后发布，这个时候内部版本在基于这个开源版进行扩展，再经过测试后发布上线。


虽然开发人员工作变多了，但是这样的话可以让 SOFAStack 的核心代码被更多的开发者评审，在更多的系统中运行，在更多的场景下进行验证，对 SOFAStack 的品质保证有非常大的帮助。 


此外在开源进度上，余淮表示， SOFAStack 并不追求开源全部内部的组件，而是会根据产品的特性和开源准备的情况有选择的开源。


例如 SOFAStack 下的分库、分表组件，因为产品特性和 OB 等内部结合紧密就暂时不会开源。**金融级分布式架构下未开源部分能力，SOFAStack 会和与业界其它优秀的开源项目做集成，保证整个金融级分布式架构功能的完整性和多样性**。


所以对于 SOFAStack 来说，并不只有自己开源的产品，而更多关注的是，和整个社区里所有开源优秀的产品一起，打造一套快速构建金融级分布式架构的套件。 


### 开源项目的管理


开源一个项目，作为背后推动的公司事实上要付出相当多的人力和资金成本，同时，也不可避免的会涉及到审批流程。随着蚂蚁金服越来越多领域的项目开源，包括 SOFAStack、AI、区块链等，蚂蚁金服内部出台了相应的严格的审核机制，包括技术、合规、法务、安全等部门进行审核，同时还会考察项目开源对公司的意义，以及是否对社区有价值，在审核通过之后项目就会正式开源与大家见面了。 


蚂蚁金服对于开源文化是十分友好的，其内部的代码也大多都是公开在内网的 GitLab 仓库，经常会有业务团队对 SOFAStack 提交一些合并请求（拉取请求）来帮助项目的发展。


同时，蚂蚁金服的工程师也普遍地拥抱开源，开源能够帮助项目产生更多、更好的想法，同时也可以吸收来自社区的贡献，让项目本身能够做的更好，这是大家所喜闻乐见的。


### SOFA 的社区治理


开源项目并不是开放源代码就是终点，事实上，这只是开始，之后持续不断的开源治理才是开源之路。而如何将一个开源项目从最开始的由开源项目背后的公司主导转变为社区性项目，这是一个值得思考和探索的课题。


基于目前的开源模式和社区建设力度，SOFA 团队也在尽可能去吸引外部的贡献者。不过 SOFAStack 项目由于大量应用在蚂蚁金服及不少企业线上环境，所以目前对于开发者技术能力以及代码质量要求相对较高，因此，这项任务还需要较多的工作。


目前 SOFA 社区已经涌现了不少积极的开发者和贡献者，解决了社区提出的一些重要需求。这其中一些功能组件的完成，贡献者提供了相当重要的代码基础，而 SOFA 社区成员也积极参与到功能的完善和规范化工作中，甚至有的拉取请求要经过十几个来回才能被合并入功能分支。 


余淮同时也谈到，下一步会引入更友好的流程和工具，让更多的开发者能够更容易地加入到 SOFAStack 社区的开发和贡献当中，为 SOFAStack 的共同发展做出包括贡献代码、文档完善和推广宣传等各个方面的贡献。


在社区团队方面，SOFAStack 也设计了诸如<ruby> 贡献者 <rp>  （ </rp> <rt>  Contributor </rt> <rp>  ） </rp></ruby>、<ruby> 提交者 <rp>  （ </rp> <rt>  Committer </rt> <rp>  ） </rp></ruby>、<ruby> 委员会成员 <rp>  （ </rp> <rt>  PMC </rt> <rp>  ） </rp></ruby>等多个层面的贡献者认证机制，以让各个层级的热情、精力不同的人能够加入到项目的贡献中。


SOFAStack 开源至今社区已经有 120 多位贡献者共建社区，也有十来位外部提交者通过其贡献的代码获得社区的认可，并进一步取得对社区发展的影响力。谈及这一点，余淮表示，为了保证代码质量，来自社区的代码贡献往往需要 SOFAStack 社区已有成员和贡献者许多次的往复修改和完善才能进入到代码主干，但是通过这些互动，才能真正遴选出来社区的中坚分子，也进一步将项目融入到社区中。


在社区建设方面，除了在 Github 上、钉钉微信群的一些交流外，SOFAStack 社区还会有丰富的线上线下的活动。每周类似周报形式的 SOFA Weekly，帮助大家了解社区的最新资讯和项目进展；社区共建的 SOFALab 源码解析实验室，和社区同学一起学习和解析源码，整理成册，帮助大家更好的学习项目；每月若干次的 SOFAChannel 直播，可以在线和讲师进行沟通交流。与此同时，SOFAStack 也会定期在全国各地举行线下的 SOFAMeetup 活动，大家一起面对面交流，目前已经在全国五个城市举办了 7 场，共有一千多人到现场；也会举办 Workshop 和 CodeLab 等实践类的活动，像本次的 KubeCon 就有一场 Workshop，手把手带着大家一起实践 SOFAStack。


在社区合作方面，社区里有很多优秀的开发者和开源项目，SOFA 团队也经常和社区互相学习、分享、交流技术，目前SOFAStack 已经和很多开源社群建立了良好的关系，包括国内 ServiceMesher，K8S 中国，ShardingSephere，SkyWalking，Ant Design，EggJS 等，也包括国外的 light4j 等。


此外，余淮还谈到，SOFAStack 在今年还会结合实际业务方面和开源社区做更多的能力整合提升，他举例说到 SOFAStack 今年会和做 Spring Cloud 更深入的集成和增强，例如 Spring Cloud 还是文件级别的配置更新，配合 SOFAStack可以做到更细粒度的配置更新等。 


### 总结


要说我对哪个国内开源项目研究的最深入，那非 SOFAStack 莫属。自从 SOFAStack 开源以来，我先后和杨冰、鲁直从 SOFA 开源的思想、战略层面进行过深入沟通，而这次，我希望可以从战术上，从实操层面分享他们在 SOFA 开源方面的经验给广大的开源社区和开源企业。


![](/data/attachment/album/201907/22/215406xrvbra33hrqn3r3t.png)



> 
> “穿山甲专访”栏目是 Linux 中国社区推出的面向开源界、互联网技术圈的重要领军人物的系列采访，将为大家介绍中国开源领域中一些积极推动开源，谙熟开源思想的技术人，并辨析其思考、挖掘其动因，揭示其背后所发生的事情，为关注开源、有志于开源的企业和技术人标出一条路径。
> 
> 
> 取名为“穿山甲”寓意有二：取穿山甲挖掘、深入之意来象征技术进步和表征技术领袖的作用；穿山甲是珍稀保护动物，宣传公益。
> 
> 
> 

