原創:猿天地(微信公衆號ID:cxytiandi),歡迎分享,轉載請保留出處。
在工做中,我相信不少人都有下面這樣的感覺:java
是否是很真實,咱們每每在看別人代碼的時候就會有上面這些想法。我認爲主要的緣由仍是大部分看的都是業務代碼,並且不少是多年積累下來的,也沒有重構,而後一年年的堆邏輯,最後就變成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微服務 入門 實戰與進階》做者, 公衆號猿天地發起人。