Summary
Me and Open Source-After Alibaba Summer of Code
Aug 29, 2019

关于阿里巴巴编程之夏的介绍可以参考 AliOS-things 同学的文章 https://zhuanlan.zhihu.com/p/79863308

借秋招的一个间歇期,记录一下我的开源历程。算是对自己的人生阶段的一个记录。

从小学时使用开源软件成为受益者,到第一次到开源社区中成为贡献者,我用了十年。不求回报地默默贡献,得到他人的肯定便觉得欢欣雀跃,也许这就是开源的魅力所在。

图1,赵老师在 Jenkins 中文社区的发言

我第一次正式参与到开源项目中,是在去年的九月。

去年四月的时候,在上海有幸认识了家辉,我们当时便成为了朋友。也是通过他,我了解到了 GSoC。半年之后,觉得是开始套瓷的时间了,便想挑选几个社区来有针对性的交流。第一个关注的是 Apache 的 Kylin 社区,虽然主要开发者是中国人,但是方向和我期望的不太一样,所以后来没有选择它。后来在 GSoC-CN 中根据往年的申请情况,选择了 Jenkins 社区,巧合的是 Jenkins 中文社区刚刚成立,而 Jenkins 社区中活跃的参与者赵老师 @Rick 又是中国人,所以从九月到第二年的三月我便一直在 Jenkins 社区中做贡献,期间成为了 Jenkins-infra member。

图2,赵老师由 KK 宣布为最有价值参与者

转折发生在二月和三月。在年前我和赵老师提到过想申请他的 multibranch plugin,他也提醒过我多次要提早准备。但是我期间一直没有在其 gitter channel 中发言,二月的时候有一个印度的同学也参与到其中。同时在三月时春招受挫,和在蚂蚁的家纯学长聊了聊,决定放弃 GSoC,参与到 Kafka 中去。

图3,和学长的交流

四月的一个偶然机会,了解到 ASoC 的举办,而其中恰好有我想要深入学习的 Dubbo 社区,于是便在 issue 中留言。我没有马上得到回复,而我又不想错过这次机会,于是在 Jira 中留言、给社区发邮件、给导师发邮件、给 aliopensource 发邮件。久久没有得到回复的我有点绝望,当时又去接触了 Spring Cloud Alibaba 社区。后来乎兴老师在 Jira 中回复了我,@cvictory 也在 issue 中回复了我,aliopensource 和社区也都回复了我邮件,让我先写 proposal。有 GSoC 的经历,其实我的提案早就写完了,但是 ASoC 的提案描述相对来说不够具体,很难有针对性的给出解决方案,就这样踏上了漫长的交流之路…

我的提案被接受了,也就意味着七月 ASoC 就要正式开始了。我在图书馆、自习室、宿舍里一遍又一遍地阅读 gRPC 和 Dubbo 的文档,写了五六个 demo,感觉不是一个很难的挑战,同时我也去了百度实习,于是稍有放松。

正式开始的前几天,刘军老师 @chickenlj 成为了我的导师。我们先简单地聊了聊需要实现的内容以及实现的方式,我提出了类似 native-thrift 的实现方法,没有想到噩梦就在眼前。

Dubbo 是基于接口扩展的,Thrift 也是基于接口实现的。自然而然地,thrift 协议很容易地就接入到了 Dubbo 中。而问题在于,gRPC 是基于内部类继承的,我无法把 gRPC service 接入到 Dubbo 中!和刘军老师讨论了这个问题之后,我们面临两种解决方案:通过注解的形式手动配置服务,这种交给我来实现;通过改造 IDL code-gen 插件在 gRPC 中添加接口,这种由刘军老师来尝试可行性。

图4,和刘军老师的交流

Dubbo 中的 Proxy 层代理了 Invoker,其实我在注解中配置服务类再反射得到实例就可以很简单地完成了,但是我当时没有意识到 Proxy 层的问题。这个问题卡住了大概一周左右,之后又咨询了 @居士,他曾在 gRPC 中加入 zookeeper 的服务发现,遗憾的是没能得到相关的思路。过了两周,刘军老师说他那个方法能够调通了,于是我便用修改好的插件生成了 Java code,同时刘军老师的代码提示出代理类的存在,于是豁然开朗,gRPC 协议成功地集成进来了!

图5,与居士的交流

Dubbo 能够使用原生 gRPC 协议通信之后面临着两个问题:Dubbo 与原生 gRPC 之间的通信,DNS registry 的服务发现。这两个问题令我措手不及,它们从来就没有在 issue 和 proposal 中出现过。不过第一个问题很容易就实现了,因为在 Dubbo 启动的是原生 gRPC Server,它可以直接与原生 gRPC Client 通信,现在问题只剩下 DNS registry 了。

DNS registry 的实现过程中参考了许多其他实现:gRPC 的 nameResolver,k8s 的 DNS 规范,zk registry 的实现和 redis registry 的实现。这么多实现不但没有给我帮助,反而让我更加困惑了:我到底要做什么?抱着疑惑我再次求助刘军老师,经过两天的交流终于明白了真实的需求,交流结束的当天便完成了 DNS registry。

此时已经是8月中旬了,但是心里不免忐忑:虽然可以通过 DNS A 记录来正常通信,但是这么做的扩展性不会很低吗?在一个偶然间,我发现了 brpc-java (baidu-rpc)中的 DNS 发现的实现代码,猜想着一个记录对应一组 ip:port 的形式,而不是一个解析记录中一个 ip 中多个 port 对应多个服务,后来这也在与乎兴老师的交流中得到的了证实。

不知不觉中两个月已经过去了,回想起7月背负期末考试、实习、秋招和 ASoC 四座大山的艰难岁月;在项目阻塞时三天两夜的调研,甚至在下班骑车时都在思考解决的方案。守得云开见月明,这些艰难险阻都已经克服,考试顺利通过了、实习也结束了、秋招也拿到了 sp、ASoC 也顺利完成了。在北京两个月甚至没有怎么出去逛逛,不过也值了!

图6,和乎兴老师的合影

没有想到,在5月刚刚读过乎兴老师介绍自己成为 ASF member 的开源历程文章之后,自己有幸能见到乎兴老师本人!希望我能以此为契机开始,从此投身到开源建设的事业中去!

非常感谢家辉,通过他我才有参与到开源社区建设的契机。感谢赵老师给了我许多帮助,不过非常抱歉最后没有用心申请赵老师的提案。感谢@居士给了我许多思路。感谢家纯学长帮助规划我的成长路线。感谢刘军老师在项目期间给我的指导和帮助。感谢所有在这个过程中帮助过我的人,在他们的帮助下我才能顺利地完成此次编程之夏。

鞠躬