如何参与一个顶级开源项目

前言

最近个人事情比较多(搬家、换工作、短暂休息)所以一直也没有顾得上博客更新,恰好最近收到一封邮件提醒了我。

也是时候写一篇文章来聊聊参与开源项目的事(最近也确实进入了笔荒期)。

ps:第一次收到这样的中秋节礼物,加上 Dubbo 社区的活跃及阿里的重视度,还在做 PRC 或微服务技术选型的朋友可以考虑 Dubbo

参与开源

现在具体来聊聊参与开源的事;

日常几乎所有的开发者都会享受到开源项目所带来的便利甚至是收益,受限于环境早在十几年前甚至几年前开源活动一直都是有国外开发者主导。

但这几年国内互联网公司逐渐国际化扩大影响力也很大程度的提高了我们的开发水平,以 BAT 为首出现了许多优秀的开源项目。

现在甚至参与开源项目还能另辟蹊径的拿到大厂 offer,所以其实不少朋友都想参与其中,可能这事给人的第一感觉就不太容易,所以现在还卡在第一步。

具体步骤

以下是以我个人经验总结的几大步骤:

  • 发现问题或自荐 feature
  • fork 源码。
  • 本地开发、自测。
  • 发起 pull request
  • 等待社区 Code Review
  • 跟进社区意见调整代码。
  • 审核通过,合并进 master 分支,完成本次贡献。

下面我会结合最近一次参与 Dubbo 的流程来具体聊聊。

发现问题或自荐 feature

首先第一步自然要搞清楚自己本次贡献的内容是什么?通常都是解决某个问题或者是提交一个新的 feature ;前者相对起来更加容易一些。

当然这个问题可以是自己使用过程中发现的,也可以是 Issues 列表中待解决的问题。

以本次为例,就是我在使用过程中所发现的问题,也提交了相关 Issue 并写了一篇文章记录并解决了该问题:What?一个 Dubbo 服务启动要两个小时!

值得注意的是在提交 Issue 之前最好是先在 Issue 列表中通过关键字检索下是否已经有相关问题,避免重复。

同时提交之后也许社区会进行跟进,被打上 invalid 标签认为不是问题,或者是使用姿势不对也是有可能的。

fork 源码,本地开发

当确定这是一个待修复的问题时就可以着手开发了。

首先第一步自然是将源码拷贝一份到自己仓库中。

接着只需要 clone 自己仓库中的源码到本地进行开发。

先回顾下我遇到的这个问题。

简单来说就是启动 Dubbo 服务非常缓慢,经过定位是 main 线程阻塞在了获取本机 ip 处。

所以当时我提出的方案是:在获取本机 ip 时加上超时时间,一旦超时便抛出异常或者是再次重试,但起码得有日志方便用户定位问题。

问题是主线程会一直阻塞在此处 InetAddress.getLocalHost().getHostAddress(),但又需要知道它阻塞了多久才好判断是否超时。

所以只能再额外开启一个线程,定时去检测 main 线程是否已经完成任务了,以下便是我第一次 pr 的内容。


这次的重点不是讨论这里具体的技术细节,所以简单说下步骤:

  • 额为声明了大小为 1 的线程池。
  • 再声明了一个 volatile 标志用于判断主线程是否有完成任务。
  • 声明了一个 condition 用于新线程做等待。
  • 最后只需要运行这个线程用于判断这个标志即可。

如何自测

开发完成后下一步就是自测,由于这类项目是作为一个基础包依赖于其他的项目才能运行的,所以通常我们还得新建一个项目来配合做全流程测试(单测除外)。

这里我觉得还是有几个小技巧值得注意。

第一个是版本号;因为在本地测试,所以需要使用 mvn clean install 将包安装到本地才能在其他项目中依赖进去进行测试。

但由于我们从官方拉出来的代码版本都已经发布到了 maven 中央仓库中(不管是 release 还是 snapshot),所以我们本地仓库中肯定已经存在这几个版本的 jar 包。

一旦我们执行 mvn clean install 将自己修改的代码安装到本地时,大概率是会出问题的(也可能是我姿势不对),这样就会导致新建的项目中依赖不了自己新增的代码。

所以我通常的做法是修改版本号,这个版本号是从来没有被官方发布到中央仓库中的,可以确保自己新增的代码会以一个全新版本安装到本地,这样我们再依赖这个版本进行测试即可。

不过再提交时得注意不要把这个版本号提交上去了。

发起 pull request

自测完成后便可发起 pull request 了,不要大意,这里还得有一个地方需要注意,那就是代码换行符的问题。

一旦换行符与源仓库的不一致时,git 会认为这次修改是删除后重来的,这样会给 code review 带来巨大的麻烦。

就像这样,明明我改动的行数并不多,但 git 确认为你是推翻了重来,导致审核起来根本不知道你改了哪些地方。

最简单的方法就是设置自己 git 的全局配置,可以参考这里

# 提交时转换为LF,检出时转换为CRLF
git config --global core.autocrlf true

# 提交时转换为LF,检出时不转换
git config --global core.autocrlf input

# 提交检出均不转换
git config --global core.autocrlf false

确认没问题后便可点击这里发起 pull request,后面按照引导执行即可。

当然各个项目之间还会有自己定制的贡献流程,最好就是查看官方的贡献指南。

http://dubbo.apache.org/en-us/docs/developers/contributor-guide/new-contributor-guide_dev.html

Code Review

pr 发起后便可等待社区审核了。

在这过程中要充分和社区进行交流,有可能你的方案和社区的想法并不一致。

比如像我这次:



最终通过沟通加上自己后面的思考觉得还是社区的方案更加轻便合理一些,达成一致之后社区便将这次 pr 合并进 master 中。

其实整个过程我觉得最有意义的便是 code review 的过程,所有人都可以参与其中头脑风暴,其中也不乏技术大牛,不知不觉便能学到不少东西。

类似案例

虽然我之前的方案没有被采纳,但类似的用法(一个线程监控其他线程)还是不少,正好在 Dubbo 中也有用到。

便是其中核心的服务调用,默认情况下对使用者来说这看起来是一个同步调用,也就是说消费方会等待 PRC 执行完毕后才会执行后续逻辑。

但其实在底层这就是一个 TCP 网络包的发送过程,本身就是异步的

只是 Dubbo 在你不知道的情况下做了异步转同步,这样看起来就像是一个同步方法。

如图中的红框部分,Dubbo 自身调用了 get() 方法用于同步获取服务提供者的返回结果。

逻辑其实也挺简单,和我上文的方案类似,只是这里的 isDone() 函数返回的是是否已经拿到了服务提供者的返回值而已。

总结

本次总结了参与开源的具体步骤,其实也挺简单;就如官方所说哪怕是提个 Issue,修改一个错别字都算是参与,所以不要想的太难。

最后还简单分析了 Dubbo 调用过程中的异步转同步的过程,掌握这些操作对自己平时开发也是很有帮助的。

你的点赞与分享是对我最大的支持

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,569评论 4 363
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,499评论 1 294
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,271评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,087评论 0 209
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,474评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,670评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,911评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,636评论 0 202
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,397评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,607评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,093评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,418评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,074评论 3 237
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,092评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,865评论 0 196
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,726评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,627评论 2 270

推荐阅读更多精彩内容

  • 五篇随笔 2014-11月-12月在加拿大《信报》发表的五篇散文 一嫁给姐夫的女人 嫁给姐夫的女人,个子高高的,人...
    唐山凤池阅读 586评论 1 0
  • 昨晚在思维训练营群里得到了共读《王者速读法》的消息,赶紧报了名,交了押金,开启一周的共读。这个书名真霸气啊!是不是...
    陶醉了醉了阅读 400评论 1 0
  • 出差去车站路上,跟出租车司机聊起来,司机是个女司机,从脸上表情看起来心情不好。问起情况,司机说被儿子气的,儿子毕业...
    逄格亮阅读 218评论 0 0
  • 2017年10月4日 星期三 晴 秋意浓,晚风拂,明月高挂,圆又亮。然他乡一人,晚风似越凉,思情如甘甜,又甜又...
    糯小玉阅读 268评论 2 0
  • 孩子们渐渐熟悉起来,尽管有时也叫错名字。他们从各自的地盘走出来,随便找个地方玩耍。 他们懂得了玩具应该与其...
    羞莲阅读 304评论 1 5