0%

2020,我写了个开源项目 | 掘金年度征文

2020年,在技术上最大的一件事情就是写了一个HTTP客户端工具并推动开源,目前该项目在github上差不多收获了400个star。也许对于各位技术大佬来说,四百star完全微不足道,但对于还是“铁憨憨”的我来说,真的很不容易。在整个过程中,我经历了啃源码时的枯燥、编码设计时的纠结以及开源完成时的喜悦。下面,我们就来详细聊聊这件事。

retrofit-2020.12.12.png

项目地址:https://github.com/LianjiaTech/retrofit-spring-boot-starter

缘起

相信很多小伙伴跟我一样,对代码都有一定的“强迫症”。碰到实现上不够好或者使用上不够方便的代码,总想好好封装一下。这样不仅能锻炼自己的抽象设计能力,更能显著地提升研发效率,一举两得。时间回到2019年4月份,当时我们系统是一个spring-boot框架项目,项目中存在大量的http接口调用,但是调用的方式都是直接在业务方法里面使用类似HttpUtil发起的。这种实现方式,不仅丧失了框架层面灵活扩展的可能性,更是完全背离了面向对象的设计原则。作为一向有代码强迫症的我来说,忍不住就想对它下手了。

当然,光有想法是不够的,更重要的是如何实践。我当时做的第一件事情就是想清楚自己最终想达成的目标,正所谓“以终为始”,先想清楚目标,再去努力实现。这里,我联想到了mybatis框架可以直接通过接口执行sql。实际上,不管是执行sql还是发起http请求,本质上都是一种数据交互形式,因此我最终定的目标就是支持spring-boot项目通过接口发起http请求。接下来第二件事就是代码实现了,我没有上来直接撸代码,而是先去调研了一下相关的开源实现,毕竟站在巨人的肩膀上才能看得更远。经过一番调研之后,最终有2个项目在我的考虑范围之内,第一个是Feign,另一个是Retrofit,它们都支持通过接口发起http请求。考虑到Feignspring cloud中消费端的调用框架,而我们的项目当时并不是spring cloud项目,由于不想引入spring cloud相关依赖,因此放弃了FeignRetrofit是基于okhttp封装的http客户端工具,使用同样非常广泛,因此最终选用了Retrofit

然而,理想很丰满,现实很骨感。retrofit官方并没有提供与spring-boot项目快速整合的starter,这使得我不得不自己将其与spring-boot项目进行整合。实际上,我做的最初版就是做了一个整合,并且也达到过基本可用的状态。如果故事止步于此,这件事我也就做到了勉强60分甚至是不及格的水准对代码不将就,追求极致才是我们该有的态度,因此我萌生了一个更加大胆的想法,做一个开源项目,剥离业务代码,实现更加完整更加优雅的封装

开源

在每一个程序猿心中,自己写一个开源项目是一件很酷的事,我当时想的就是把这件事做成。但是真正要动手去做的时候才发现,事情比想象中要复杂的多。因为开源项目最终是要给其他人用的,所以我对自己的代码设计和质量都有更加严格的要求。而当时不得不承认的一个事实是,我对相关框架源码的理解远远不够,换句话说就是我还不具备写一个开源项目的能力。这个时候,我要做的事情就是先死磕相关源码。经过3个多月的时间,我终于把retrofitspringmybatis框架的核心源码全部理解了一遍。看过源码的同学应该都知道,看源码的过程多少带有一些“煎熬”,但是认真啃完之后收获也会很大

准备工作完成之后,就开始正式进入代码设计和实现了。此时,之前啃源码的效果就明显体现出来了,我在写代码的时候会自然而然地联想到开源框架的优秀实现,然后借鉴过来。这是一种很抽象的感觉,相信啃过源码的同学都有所体会。就这样,编码大概又花了2个月的时间,整个过程我都处在一个很兴奋的状态,记得那会睡觉的时候都在想怎么撸代码。由于这些工作都是业余时间进行的,因此这大半年时间里面,我的业余生活明显变得非常充实,现在回想起来,确实很累但很有收获

当一切准备就绪,接下来就是接受实际考验的时候了,我们当时替换了线上2个Java项目的http调用,并且通过自测就直接上线了,上线之后效果也很好,没有出现任何异常。后来正式申请项目开源,整个过程比较漫长,大概花了4个月的时间,终于在2020年4月份审核通过。我记得当时刚好是清明节,我在github上正式发布了自己首个开源项目。不知不觉完成了目标,甚是欣慰。

百星

在接下来的2个月里面,我主要是做了一些功能上的迭代优化,github上的star数量依然少的可怜。在6月份的时候,我准备写2.0版本了。之所以要这么快写2.0版本,不是因为我们1.0写的有多烂,而是因为这段时间,我思想上出现了一些转变。之前写1.0的时候,我完全站在自己的视角去想项目应该支持哪些功能,兼容哪些框架,这诚然是我应该考虑的问题,但是好像偏离了方向,偏离了实际。我把实现做的复杂,仅仅是为了支持可能并不存在的需求。因此,2.0的设计上,我做了大量简化,仅保留最重要最核心的功能,我觉得只有用户一下就能看懂你的设计,他们才会更有兴趣和更有安全感。最后,我还花了整整2天时间为2.0编写文档,这简直是一件不可思议的事情。

由于我这个时候已经开始写技术文章了,因此就在掘金上发了一篇介绍开源项目使用的文章。为了吸引眼球,我还特意取了一个很唬人的标题《spring-boot项目下最优雅的http客户端工具,用它就够了!》。没想到一下子就火了,马上就上了当天的热门推荐,还给我带来了30多个star。这对于平时都是“小透明”的我来说,真的是出乎意料。后来,有很多技术公众号也转载了我的开源项目,比如程序员DDHelloGithubJava知音SpringForAll社区等等。截止到12月12日为止,整个项目在github上已经收获了差不多400star

收获

对我而言,做完整个开源项目,除了在技术上有更多的成长以外,更重要的是收获了自信。在日常工作中,我不会畏惧更复杂的业务,同时也更想在技术上做出更多的成绩。最近重听了罗胖“2019跨年演讲”,对里面有两个词语印象深刻,一个是“我辈中人”,另一个是“做事的人“。“我辈中人”是一种自信与自豪,“做事的人“是一种脚踏实地的态度。2020即将过去,2021马上到来,继续加油!

掘金年度征文 | 2020 与我的技术之路 征文活动正在进行中……

欢迎关注我的开源项目:一款适用于SpringBoot的轻量级HTTP调用框架