胖哥成为Spring官方项目的Contributor

举报
码农小胖哥 发表于 2022/05/11 00:59:38 2022/05/11
【摘要】 给开源项目尤其是Spring这种知名度高的项目贡献代码是比较难的,起码胖哥是这么认为的。有些时候我们的灵感未必契合作者的设计意图,即使你的代码十分优雅。 我曾经给Spring Security提交了一个我认为非常重要的一项优化,和作者沟通了几十个来回无法说服他。人家说留了抽象接口,你觉得不对自己实现一个就是了,默认的就是能用...

602bdadaaccf4be9aedb8efddfd5fd6f.gif

给开源项目尤其是Spring这种知名度高的项目贡献代码是比较难的,起码胖哥是这么认为的。有些时候我们的灵感未必契合作者的设计意图,即使你的代码十分优雅。

我曾经给Spring Security提交了一个我认为非常重要的一项优化,和作者沟通了几十个来回无法说服他。人家说留了抽象接口,你觉得不对自己实现一个就是了,默认的就是能用而已。于是我就放弃了这个PR

Spring Authorization Server中我抓住了一个能够绝对被接受的机会,我在编写Spring Authorization Server教程中,调用授权服务器元信息端点时不小心后面带了个锚点符号#,类似http://issuer.felord.cn/#。在客户端启动的时候请求授权服务器会报了一个请求错误,在追踪源码的时候我发现对授权服务器issuer实际上是进行校验的,那么规则一定有漏洞,于是我查阅了相关RFC的定义,找到了不完善的依据RFC8414[1],所以只要实现了,PR被接受应该是跑不了的事情,甚至可以半场开香槟。这个规范的实现没有什么技术含量,我如果告诉你,你也能做得到,甚至做得比我好,在0.3.0版本中这个优化将会实装。

583581c061046f8881ecc02eac28c0ba.png

那么难点在哪里?

代码风格

首先是代码风格,开源项目都有一些代码风格要求,我之前有很多东西模仿(抄)了Spring的设计,所以我在实现规范的时候特别注意了这一点,命名风格、缩进等等都反复推敲。

理解项目的架构思想

在整个PR过程中,我出现的问题主要在这里。虽然我最初的实现执行起来没有问题,完全在生命周期之内,但是显然它的位置不是最佳。比如参数的校验你可以写在控制层,也可以写在服务层,结果一定是没问题的,但是过程可能有问题。作者和我沟通了一番,表明了他的设计思路,很快我就纠正了这个问题。

单元测试非常重要

实现代码确实不多,单元测试的代码几乎超过了其20倍。我们平时写个main方法简单sout打印一下就完事了,对于开源项目可不一样。尤其是这种知名开源框架,需要你测试实现的方方面面。如果你想为开源项目贡献代码,常用的断言、Mock插桩都要会,这个胖哥的博客felord.cn都有相关的介绍。

Git规范

Git 提交规范胖哥也多次强调了它的重要性,在大型开源项目中遵循一些提交规范也是一个基本要求,Git你得熟练。Spring要求最小功能提交,怎么说呢?你的实现必须是一个最小粒度的完整单元,你不能在一个提交中既有增强优化(enhance)还有新特性(feature)。而且你的提交必须压缩到一个git commit内,即使被打回去修改。要多用

git commit --amend -m '你的提交信息'
  

在一些不得已的时候,git rebasesquash commits或许能帮到你。

要善于发现,敢做敢为

最重要的一点,你要善于发现,比如下面这个bug(现在还没有彻底修复),如果我说它是个bug,你一定会大吃一惊,我当时也是一样的。


   
  1. public DefaultSecurityFilterChain(RequestMatcher requestMatcher, List<Filter> filters) {
  2.  if (!filters.isEmpty()) {
  3.   logger.info(LogMessage.format("Will not secure %s", requestMatcher));
  4.  }else {
  5.   logger.info(LogMessage.format("Will secure %s with %s", requestMatcher, filters));
  6.  }
  7.  this.requestMatcher = requestMatcher;
  8.  this.filters = new ArrayList<>(filters);
  9. }

3.1版本log逻辑居然错到5.6版本!而修复它只需要改下位置,这个bug我妈应该也会改。但是没有人发现和质疑它,直到最近有人提交了修复(5.7版本会修复这个bug)。

所以你要善于发现一些问题和细节,同时也要敢于质疑,质疑错了又不会损失什么。

要有专长

我和大家一样,平常也是什么都学,没办法!做原创技术博主太容易内容焦虑了。但是我刻意保证了一些东西去深入学习,有些东西必须成为你的独门绝技,要一精多专,这样你在专长的领域可能有更多的机会。

TODO

对于成为开源贡献者只是一个开始,更多的挑战还在后面。有人问我最近为什么更文少了!这里也讲一下我最近在做的事。

首先,因为疫情我只能在家办公了,在家的工作效率你懂的。

其次,我正在做一个基于Spring Authorization Server的开源项目Id Server[2],你可以认为是一个极简版的keycloak,甚至最初的功能比较简陋。放个截图吧。

14d269cf4863e2a1206a90cc09b3ad76.png

做这个东西很有挑战,前端真是太难了!目前已经初具雏形,不日将放出预览版。也欢迎各位同学参与贡献。

参考资料

[1]

RFC8414: https://datatracker.ietf.org/doc/html/rfc8414

[2]

Id Server: https://github.com/NotFound403/id-server

c90956e9e4b45d4f43882b3e1294aad9.gif

文章来源: felord.blog.csdn.net,作者:码农小胖哥,版权归原作者所有,如需转载,请联系作者。

原文链接:felord.blog.csdn.net/article/details/124642378

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。