不看原始碼,怎麼卷的過小年輕

猿天地發表於2021-05-09

原創:猿天地(微信公眾號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微服務 入門 實戰與進階》作者, 公眾號猿天地發起人。

相關文章