原創:猿天地(微信公眾號ID:cxytiandi),歡迎分享,轉載請保留出處。
在工作中,我相信很多人都有下面這樣的感受:
- 這誰的程式碼呀,看不下去了
- 這破程式碼,一行註釋也沒有
- 這程式碼,還沒我寫的好
- 這程式碼,有bug吧
- 這程式碼,。。。。。。。
是不是很真實,我們往往在看別人程式碼的時候就會有上面這些想法。我認為主要的原因還是大部分看的都是業務程式碼,而且很多是多年積累下來的,也沒有重構,然後一年年的堆邏輯,最後就變成shi山了。
當然也有不少的人程式碼寫的確實很好,簡潔易懂,我們在看別人程式碼的時候要抱著學習的態度去看,同樣的邏輯,看看別人是怎麼寫的,為什麼這樣寫,如果是自己會怎麼寫,對比下,這樣的話你就有收穫了。
今天想跟大家聊的話題主要是看開源專案的原始碼,因為業務程式碼大家每天都能看。所以往往只會去用某些框架,而忽略了它的內在。
多看開源專案的原始碼是很好的學習機會,特別是當你遇到問題的時候,或者想要做一個什麼功能的時候,如果有其他框架中也有類似功能,那麼你就知道怎麼做了。
案例一
比如我在做一個功能,需要整合多種配置中心,如果依賴了Nacos那就用Nacos,如果依賴了Apollo,那就用Apollo。在自動裝配的類中就要處理這種沒有依賴的情況,最開始想的就是這樣處理:
@ConditionalOnClass(value = com.alibaba.nacos.api.config.ConfigService.class)
@ConditionalOnMissingClass(value = { "com.alibaba.cloud.nacos.NacosConfigProperties" })
@Bean
public NacosConfigUpdateListener nacosConfigUpdateListener() {
return new NacosConfigUpdateListener();
}
然後測試發現,如果在專案沒有依賴Nacos的情況下,這裡就會報錯,雖然加了判斷也不行。這個時候我就再想,其他的一些框架中是如何實現的呢?
這個時候我就想到之前看Zuul的原始碼,裡面也有類似的需求。會使用不同的Client來進行呼叫,比如ApacheHttpClient, OkHttpClient。
發現Zuul裡面是加了靜態類進行判斷的,這就不會報錯了。如下:
@Configuration
@ConditionalOnClass(value = com.alibaba.nacos.api.config.ConfigService.class)
@ConditionalOnMissingClass(value = { "com.alibaba.cloud.nacos.NacosConfigProperties" })
protected static class NacosConfiguration {
@Bean
public NacosConfigUpdateListener nacosConfigUpdateListener() {
return new NacosConfigUpdateListener();
}
}
案例二
當我需要控制Feign的呼叫邏輯,替換呼叫的URL時我就想到之前看過Sleuth的原始碼,Sleuth做為一款鏈路跟蹤框架,內部對很多框架進行了整合。
像Feign這種遠端呼叫的,需要對它進行擴充套件,然後透傳鏈路跟蹤的資料。所以當我也有類似需求的時候,就可以參考Sleuth的實現。
上面貼了Sleuth中的TracingFeignClient原始碼,TracingFeignClient就是Sleuth中對Feign Client的擴充套件,增加了Sleuth自己的一些邏輯。然後這個TracingFeignClient最終會在啟動的時候替換掉Feign預設的Client。
案例三
當我需要對Redis做埋點監控的時候,又想起了之前看過opentracing中對Redis的監控程式碼,就可以借鑑裡面的方式。
地址:
https://github.com/opentracing-contrib/java-spring-cloud/
裡面就是用了AOP對RedisConnectionFactory和RedisConnection進行了替換,也不用動框架底層的程式碼,擴充套件就行。
總結
寫本文的目的就是為了告訴大家,在平時無事的時候除了學習一些框架的使用,也要去翻翻原始碼。雖然當時不一定用的到,但是在你以後遇到類似問題的時候,你會有映象說,當時我在某某框架中看到過類似的解決方案,這就是你的知識積累。
另一個點就是這些框架中都會用到一些好的設計,也是我們可以學習參考的案例。
最後就是在面試中也有遇到說:有沒有看過框架的原始碼啊之類的問題?
如果真的看過,並且記住了,這個時候你就可以和麵試官侃侃而談,稱兄道弟了。
關於作者:尹吉歡,簡單的技術愛好者,《Spring Cloud微服務-全棧技術與案例解析》, 《Spring Cloud微服務 入門 實戰與進階》作者, 公眾號猿天地發起人。