不看源碼,怎麼卷的太小年輕

原創:猿天地(微信公衆號ID:cxytiandi),歡迎分享,轉載請保留出處。

在工做中,我相信不少人都有下面這樣的感覺:java

  • 這誰的代碼呀,看不下去了
  • 這破代碼,一行註釋也沒有
  • 這代碼,還沒我寫的好
  • 這代碼,有bug吧
  • 這代碼,。。。。。。。

是否是很真實,咱們每每在看別人代碼的時候就會有上面這些想法。我認爲主要的緣由仍是大部分看的都是業務代碼,並且不少是多年積累下來的,也沒有重構,而後一年年的堆邏輯,最後就變成shi山了。git

固然也有很多的人代碼寫的確實很好,簡潔易懂,咱們在看別人代碼的時候要抱着學習的態度去看,一樣的邏輯,看看別人是怎麼寫的,爲何這樣寫,若是是本身會怎麼寫,對比下,這樣的話你就有收穫了。github

今天想跟你們聊的話題主要是看開源項目的源碼,由於業務代碼你們天天都能看。因此每每只會去用某些框架,而忽略了它的內在。面試

多看開源項目的源碼是很好的學習機會,特別是當你遇到問題的時候,或者想要作一個什麼功能的時候,若是有其餘框架中也有相似功能,那麼你就知道怎麼作了。spring

案例一

好比我在作一個功能,須要集成多種配置中心,若是依賴了Nacos那就用Nacos,若是依賴了Apollo,那就用Apollo。在自動裝配的類中就要處理這種沒有依賴的狀況,最開始想的就是這樣處理:api

@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微服務 入門 實戰與進階》做者, 公衆號猿天地發起人。

相關文章
相關標籤/搜索