微服務架構(gòu)實現(xiàn)技術(shù)三大關(guān)鍵要素之服務治理

服務治理在面臨系統(tǒng)存在大量服務時可以解決基本的三大定位問題:提升服務架構(gòu)的可擴展性;有效的服務監(jiān)控和故障定位;對服務的有效劃分和路由。在技術(shù)實現(xiàn)上,服務治理一般表現(xiàn)為服務發(fā)布與訂閱機制以及實現(xiàn)該機制的服務注冊中心。
各個微服務需要通過服務治理實現(xiàn)自動化的注冊和發(fā)現(xiàn)。服務治理的需求來自于服務的數(shù)量。為了實現(xiàn)微服務架構(gòu)中的服務注冊和發(fā)現(xiàn),通常都需要構(gòu)建一個獨立的媒介來管理服務的實例,這個媒介一般被稱為服務注冊中心。
一、服務注冊中心:注冊中心核心功能+實現(xiàn)策略
主要充當服務注冊和服務發(fā)現(xiàn)服務器的作用,不但是路由信息的存車倉庫,也是服務提供者和服務消費者進行交互的媒介。
1.注冊中心核心功能


(1)注冊中心具備發(fā)布-訂閱功能,體現(xiàn)在服務提供者可以根據(jù)服務的元數(shù)據(jù)發(fā)布服務,而服務消費者則通過自己感興趣的服務進行訂閱并獲取包括服務地址在內(nèi)的各項元數(shù)據(jù)。
(2)布-訂閱功能還體現(xiàn)在數(shù)據(jù)變更推送,即當注冊中心服務定義發(fā)生變化時,主動推送變更到該服務的消費者從而實現(xiàn)間接路由。
(3)需要確保數(shù)據(jù)的一致性,在任何時候服務提供者和服務消費者都應該看到同一份數(shù)據(jù)。
(4)為了確保服務高可用性,一般也需要注冊中心保持高可用性,也就意味著注冊中心需要構(gòu)建對等集群。
對等集群,Peer-to-Peer Server Clusgter,指集群中所有服務器都提供同樣的服務,客戶端只連接一個服務器完成注冊和發(fā)現(xiàn)即可,任何一臺服務器宕機都不影響客戶端的正常使用。
(5)作為注冊中心的客戶端程序,一般對嵌入在服務提供者和服務消費者的應用程序中。
在應用程序運行時,服務提供者的注冊中心客戶端程序會向注冊中心注冊自身提供的程序,而服務消費者的注冊中心客戶端程序則從注冊中心查詢當前訂閱的服務信息并周期性的刷新服務狀態(tài)。
(6)服務消費者需配備緩存機制以加速服務路由,提高服務路由的效率和容錯性,更重要的是,當服務注冊中心不可用時,服務消費者可以利用本地緩存路由實現(xiàn)對現(xiàn)有服務的可靠調(diào)用。
可以對注冊中心進行抽象建模如下圖,客戶端可以是服務提供者也可以是服務消費者。

2.注冊中心實現(xiàn)策略
在實現(xiàn)流程圖上,服務提供者和服務消費者可以使用一定的通信機制與注冊中心服務器建立連接并維持心跳檢測,通過注冊中心提供的操作接口分別完成發(fā)布和動態(tài)更新服務定義、獲取制定服務地址列表、取消服務發(fā)布、獲取服務地址更新等功能。同時,注冊中心的服務監(jiān)聽機制確保消費者能夠?qū)崟r監(jiān)控服務更新狀態(tài)。
具體流程如下圖:

二、服務發(fā)布與注冊
服務發(fā)布的目的是為了暴露服務訪問的入口,是一個通過構(gòu)建網(wǎng)絡連接并啟動端口監(jiān)聽請求的過程。服務發(fā)布注冊流程如下:

1.發(fā)布啟動器:確定服務發(fā)布形式并啟動發(fā)布平臺。
(1)服務發(fā)布形式常見的有三種:配置化+API調(diào)用+使用注解,各有利弊。
配置化:通過以XML為代表的配置化工具,服務框架對業(yè)務代碼零侵入,擴展和修改方便,同時配置信息修改能夠?qū)崟r生效。
API調(diào)用:服務框架對業(yè)務代碼侵入性較強,修改代碼之后需要重新編譯才能生效。
注解方式:服務框架對業(yè)務代碼零侵入,擴展和修改比較方便,但修改配置需要編譯才能生效。
一般我們傾向于使用配置方式,但涉及系統(tǒng)之間集成時,需要使用服務框架中較底層的服務接口,API調(diào)用有可能是唯一選擇。
(2)發(fā)布平臺的啟動與所選擇的發(fā)布方式密切相關(guān)。
使用配置化發(fā)布時:通常會借助諸如Spring的容器進行服務實例的配置和管理,容器的正常啟動意味著發(fā)布平臺的啟動。
使用API調(diào)用時:簡單使用main函數(shù)進行啟動。
使用注解方式時:與使用配置化發(fā)布啟動是類似的。
2.動態(tài)代理
在實現(xiàn)遠程調(diào)用時必然會添加動態(tài)代理功能,通過動態(tài)代理來實現(xiàn)對服務發(fā)布進行動態(tài)攔截,可以對服務發(fā)布行為本身進行封裝和抽象,同時也便于擴展和定制化。
JDK自帶的Proxy機制和諸如javassist的字節(jié)碼編輯庫都可以實現(xiàn)動態(tài)代理。
3.發(fā)布管理器
在流程中充當承上啟下的門戶Facade作用,一方面,獲取協(xié)議服務器中生成的服務URL信息并發(fā)布到注冊中心,另一方面,負責通知發(fā)布啟動器本次發(fā)布是否成功。
4.協(xié)議服務器
是真正實現(xiàn)服務器創(chuàng)建和網(wǎng)絡通信的組件,主要作用在于確定發(fā)布協(xié)議以及根據(jù)該協(xié)議建立網(wǎng)絡連接、并管理心跳、斷線重連、端口綁定與釋放。常見的協(xié)議包括HTTP、RMI、Hessian等。
5.注冊中心
主要用于保存和更新服務的地址信息。
三、服務發(fā)現(xiàn)與調(diào)用
較服務發(fā)布與注冊而言,服務發(fā)現(xiàn)與調(diào)用是一個導入的過程,基本和服務發(fā)布與注冊是對稱結(jié)構(gòu)流程:

1.調(diào)用啟動器
確定服務的調(diào)用形式并啟動調(diào)用平臺,與發(fā)布啟動器一樣。
2.動態(tài)代理
完成本地接口到遠程調(diào)用的轉(zhuǎn)換,導入服務提供者接口API和服務信息并生成遠程服務的本地動態(tài)代理對象,將本地API調(diào)用轉(zhuǎn)換成遠程服務調(diào)用并返回調(diào)用結(jié)果。
3.調(diào)用管理器
具備緩存功能,保存服務地址的緩存信息。當從注冊中心獲取服務提供者地址信息時,調(diào)用管理器根據(jù)需要更新本地緩存,確保在注冊中心不可用的情況下,調(diào)用啟動器仍然可以從本地緩存中獲取服務提供者的有效地址信息。
4.協(xié)議客戶端
根據(jù)服務調(diào)用指定的協(xié)議類型創(chuàng)建客戶端并發(fā)起連接請求,負責與協(xié)議服務器進行交互并獲取調(diào)用結(jié)果。
5.注冊中心
主要用于保存和更新服務的地址信息。
四、服務監(jiān)控
如圖,在微服務架構(gòu)中的服務調(diào)用中,服務中間件、數(shù)據(jù)庫、緩存、文件系統(tǒng)以及其他服務之間都有可能存在依賴關(guān)系,為了確保系統(tǒng)運行時這些依賴關(guān)系的穩(wěn)定性和可用性,服務調(diào)用路徑、服務調(diào)用的業(yè)務數(shù)據(jù)、服務性能數(shù)據(jù)都是需要監(jiān)控的內(nèi)容,以便于系統(tǒng)定位和防御故障問題。

基本思路:日志埋點
1.使用跟蹤ID作為一次完整應用調(diào)用的唯一標識,然后將該次調(diào)用的詳細信息通過日志的方式進行保存。
2.日志埋點分為客戶端埋點和服務器埋點
客戶端埋點:關(guān)注于跟蹤ID、客戶端IP、調(diào)用方接口、調(diào)用時間等信息。
服務器端埋點:關(guān)注于跟蹤ID、調(diào)用方上下文、服務端耗時、處理結(jié)果等信息。
3.日志埋點的作用分為兩類
一類用于服用調(diào)用跟蹤把所有請求過程的日志能夠關(guān)聯(lián)起來;
一類用于統(tǒng)計各服務的處理時間,一般通過記錄服務調(diào)用的開始時間和結(jié)束時間計算并統(tǒng)計時間延遲。
4.針對日志埋點產(chǎn)生的海量運行時數(shù)據(jù),通常需要專門的工具進行處理埋點數(shù)據(jù)。
基于Hadoop、Storm、Spark等技術(shù)的離線/實時批量處理框架;
基于Elastic Search、Solr的垂直化搜索引擎;
專門的Flume/ELK等日志處理框架
5.在日志埋點過程中也可以使用抽樣思想,并一定將所有的場景都進行日志埋點。
基本目標:
保障線上服務運行質(zhì)量,治理的對象是基于統(tǒng)一分布式服務框架開發(fā)的各項業(yè)務數(shù)據(jù)。
基本定位:
關(guān)注服務運行時的狀態(tài)、細粒度治理等。
基本策略:
服務限流、降級、服務動態(tài)路由和灰度發(fā)布等。
具體實現(xiàn):
采用通過注冊中心對服務以來進行分析,結(jié)合運行時調(diào)用關(guān)系,梳理不合理的依賴和調(diào)用路徑,優(yōu)化服務架構(gòu);
實時收集服務調(diào)用日志,分析、匯總、存儲和展示,方便開發(fā)和運維人員進行實時診斷;
執(zhí)行服務運行時治理方案,包括限流降級、路由、統(tǒng)一配置等在線調(diào)整。
文章來源于網(wǎng)絡。
感謝大家閱讀,歡迎大家私信討論。給大家推薦一個Java技術(shù)交流群:473984645里面會分享一些資深架構(gòu)師錄制的視頻資料:有Spring,MyBatis,Netty源碼分析,高并發(fā)、高性能、分布式、微服務架構(gòu)的原理,JVM性能優(yōu)化、分布式架構(gòu)等這些成為架構(gòu)師必備的知識體系。還能領(lǐng)取免費的學習資源,目前受益良多!
推薦大家閱讀:
Java高級架構(gòu)學習資料分享+架構(gòu)師成長之路?
個人整理了更多資料以PDF文件的形式分享給大家,需要查閱的程序員朋友可以來免費領(lǐng)取。還有我的學習筆記PDF文件也免費分享給有需要朋友!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容