涉及輕微的源碼展示,可放心參考;
一、基礎簡介服務注冊發現是微服務架構中最基礎的能力,下面将從源碼層面分析實現邏輯和原理,在這之前要先來看下依賴工程的基礎結構,涉及如下幾個核心組件:
在熟悉工程依賴之間的結構時,還要明白服務間交互的流程和原理,這樣在分析源碼設計時,有一個清晰的思路與輪廓;如何實現下面的服務交互模式,在閱讀源碼工程時,圍繞如下兩個核心邏輯:
在這裡先簡單的聊一下個人在閱讀源碼工程時的基本思路,比如微服務組件:通常從配置參數作為切入口,觀察基于參數構建的核心對象,再重點分析對象的管理模式,以及适配的擴展能力,最後結合項目的應用場景即可:
閱讀源碼最重要的是耐着心情慢慢看,并随手畫下核心流程,實際上如果有一定的編程經驗,不管是閱讀什麼工程的源碼,隻要用心去分析單點的實現原理,都算不上過度複雜,但是組件通常為了複用能力,會去适配多種複雜的場景,這樣勢必要采用抽象的封裝和設計模式,源碼工程的複雜度自然就會相應提高,這個話題後續會細聊。
二、服務注冊1、服務配置首先從Nacos配置參數開始,這裡隻設置服務發現的兩個參數:1Nacos注冊中心的服務端地址,2在服務的元數據中加載分支号;然後來具體的看源碼流程:
在配置參數加載的過程中,有很多缺省的默認值,所以需要關注最終會提供的參數信息,來判斷是否需要自定義設置,另外AutoConfig配置要重點看實例化的對象;斷點的流程可以按照如下的方式做設置,這裡陳列的是在配置加載階段的幾個核心節點:
NamingService是Nacos服務管理接口,涉及注冊、查詢、撤銷、檢查等多個方法,即對應的是Nacos服務端的相應API請求,在注冊執行的階段會細說用法。
2、注冊構建看完服務配置之後再看注冊配置,對于配置中複雜的設計,需要重點關注兩個信息:ConditionalOn和matchIfMissing,這樣很容易發現默認加載:
在構建服務注冊的核心類NacosServiceRegistry時,通過服務的登記信息轉換為注冊的實例化對象,然後通過NamingService接口方法,上報實例化對象;需要注意的是,雖然這裡隻看了Nacos中的相關API,但實際上API實現了諸多Spring-cloud-commons包中聲明的接口,比如Registration、ServiceInstance等。
3、執行上報通常微服務的注冊中心組件,都是基于server-client架構和部署方式,客戶端需要根據自身啟動狀态去上報或者撤銷注冊,服務端負責統一維護注冊數據:
在最終執行服務注冊時,其動作本質就是請求Nacos服務端的一個Post方法,并将配置數據上報,例如:IP地址、端口、元數據、權重等;這樣客戶端注冊邏輯執行完成,然後再看服務端數據可視化界面,就可以看到注冊的客戶端服務。
至于Nacos服務端是如何管理這些注冊數據的,參考部署版本的nacos-naming模塊源碼,閱讀上報接口和頁面中的列表加載的實現即可;注意在初始的配置文件中,加入的branch分支參數也在元數據結構中。
在NamingService接口中,涉及多個服務管理的方法,在執行原理上基本相同就不在贅述,這樣注冊中心的Client端和Server端就形成了通信機制,接下來再看Client端之間的通信。
三、服務通信1、基礎配置Feign在配置方面比較複雜,提供了多個場景下的适配能力,這裡隻以兩個常見的參數作為切入點:1通信超時時間,2Http選型(采用默認值);
這裡要重點關注的是注解的掃描和注冊以及容器管理,要理解Feign的上下文環境需要明白上文中描述的服務間交互原理,然後參考FeignClientFactoryBean工廠類中構建邏輯。
2、通信邏輯雖然Feign注解的方式可以簡化開發,但是在具體執行的時候還是Http的請求響應模式,這裡可以參考LoadBalancerFeignClient類中的execute方法:
不管是Feign組件還是Spring框架,默認的負載均衡策略都是采用Ribbon的實現方式,在上述流程中配置和負載均衡命令都依賴Ribbon組件,接下來看服務選擇策略。
四、負載均衡1、命令構建這裡構建了調用負載均衡接口的命令,ILoadBalancer接口中提供服務管理的相關方法,其中最核心的就是chooseServer方法,然後結合具體的策略規則實現服務的選擇的功能:
2、策略規則
Ribbon組件中負載均衡的策略有好幾種規則,比如随機選擇、Key匹配、權重傾斜等;在工作中常用的就是默認規則即RoundRobinRule,以及基于Key設計的灰度模式,簡單做法就是服務啟動時在元數據中添加的分支号作為匹配的标識;
現在回到流程的開始看,通過Nacos組件進行服務注冊和管理,通過Feign組件基于Ribbon負載均衡策略做服務通信,如果單看各節點組件的邏輯還比較容易理解,但是通過Spring框架做組件之間的協作調度時,複雜程度明顯提高;
如果是剛開始閱讀源碼的階段,可以隻關注相應流程的核心邏輯,選擇性忽略細節的實現原理,當然重點還是要多讀讀Spring的設計,這樣時間久了自然會有很多收獲。
,
更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!