2020年,在技术上最大的一件事情就是写了一个HTTP
客户端工具并推动开源,目前该项目在github
上差不多收获了400
个star。也许对于各位技术大佬来说,四百star
完全微不足道,但对于还是“铁憨憨”的我来说,真的很不容易。在整个过程中,我经历了啃源码时的枯燥、编码设计时的纠结以及开源完成时的喜悦。下面,我们就来详细聊聊这件事。
项目地址: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
请求。考虑到Feign
是spring cloud
中消费端的调用框架,而我们的项目当时并不是spring cloud
项目,由于不想引入spring cloud
相关依赖,因此放弃了Feign
。而Retrofit
是基于okhttp
封装的http
客户端工具,使用同样非常广泛,因此最终选用了Retrofit
。
然而,理想很丰满,现实很骨感。retrofit
官方并没有提供与spring-boot
项目快速整合的starter
,这使得我不得不自己将其与spring-boot
项目进行整合。实际上,我做的最初版就是做了一个整合,并且也达到过基本可用的状态。如果故事止步于此,这件事我也就做到了勉强60分甚至是不及格的水准。对代码不将就,追求极致才是我们该有的态度,因此我萌生了一个更加大胆的想法,做一个开源项目,剥离业务代码,实现更加完整更加优雅的封装。
开源
在每一个程序猿心中,自己写一个开源项目是一件很酷的事,我当时想的就是把这件事做成。但是真正要动手去做的时候才发现,事情比想象中要复杂的多。因为开源项目最终是要给其他人用的,所以我对自己的代码设计和质量都有更加严格的要求。而当时不得不承认的一个事实是,我对相关框架源码的理解远远不够,换句话说就是我还不具备写一个开源项目的能力。这个时候,我要做的事情就是先死磕相关源码。经过3个多月的时间,我终于把retrofit
、spring
和mybatis
框架的核心源码全部理解了一遍。看过源码的同学应该都知道,看源码的过程多少带有一些“煎熬”,但是认真啃完之后收获也会很大。
准备工作完成之后,就开始正式进入代码设计和实现了。此时,之前啃源码的效果就明显体现出来了,我在写代码的时候会自然而然地联想到开源框架的优秀实现,然后借鉴过来。这是一种很抽象的感觉,相信啃过源码的同学都有所体会。就这样,编码大概又花了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
。这对于平时都是“小透明”的我来说,真的是出乎意料。后来,有很多技术公众号也转载了我的开源项目,比如程序员DD
、HelloGithub
、Java知音
、SpringForAll社区
等等。截止到12月12日为止,整个项目在github
上已经收获了差不多400
个star
。
收获
对我而言,做完整个开源项目,除了在技术上有更多的成长以外,更重要的是收获了自信。在日常工作中,我不会畏惧更复杂的业务,同时也更想在技术上做出更多的成绩。最近重听了罗胖“2019跨年演讲”,对里面有两个词语印象深刻,一个是“我辈中人”,另一个是“做事的人“。“我辈中人”是一种自信与自豪,“做事的人“是一种脚踏实地的态度。2020即将过去,2021马上到来,继续加油!
掘金年度征文 | 2020 与我的技术之路 征文活动正在进行中……
欢迎关注我的开源项目:一款适用于SpringBoot的轻量级HTTP调用框架