服務定位架構模式

1. 服務定位基本理念

系統集成(System Integration)是應用系統架構設計的一個重要課題,無論何種行業和應用,系統都可能需要集成對第三方服務的訪問。這些第三方服務可能來自外部供應商,也可能來自於同一組織的不同團隊,更廣義上來講,同一團隊內部也可能需要進行服務的發現和整合,以便不同技術體系結構下的各個模塊和組件之間的集成。

系統集成需要解決的主要問題是如何獲取並管理第三方服務。第三方服務同樣需要業務迭代和版本更新,當這些服務的實現發生了變化,那麼涉及到集成部分的代碼可能需要重構,如果有些用戶層面的代碼還不能被直接訪問的話,整個重構的成本就會很大。服務定位(Service Locator)模式想要解決的問題就是解耦服務提供者(Service Provider)和用戶,應用程序無需直接訪問具體的服務提供者類,而解決方案就是服務註冊(Registration)和發現(Discovery)機制。

下圖中包含了服務定位模式的幾個核心組件:

(1)服務(Service),實際處理請求的服務,可以包含不同的實現。對這種服務的引用可以在類似 JNDI 服務器的中央註冊中心中查找。

(2)上下文(Context) ,上下文中帶有對要查找的服務的引用,如JNDI使用InitialContext作爲上下文容器。

(3)服務定位器(Service Locator),服務定位器是通過類似 JNDI 服務器的中央註冊中心查找並獲取服務,同時可以根據需要對服務進行緩存。

(4)緩存(Cache),緩存存儲服務的引用以便複用。

(5)客戶端(App),App是通過 Service Locator調用服務的對象。

服務定位模式本質上體現的還是解耦思想,支持服務動態升級,提高了系統的可維護性。與服務定位模式類似的還有業務代理(Business Delegate)模式(見下圖)。我們可以看到在業務代理模式中,負責查找服務的稱爲BusinessLookup,而BusinessDelegate組合BusinessLookup以及BusinessService爲App端提供穩定的第三方業務服務查找和集成方案。

2. 服務定位應用

在大型分佈式系統中,由於涉及到服務的發佈者和消費者之間大量的調用關係,服務的定位顯得尤爲重要,因此主流的分佈式服務框架都提供了類似註冊中心的機制作爲服務提供者和服務消費者進行交互的媒介,充當着服務註冊和發現(Registration&Discovery)服務器的作用。

一個典型的註冊中心模型參考下圖,圖中的註冊中心應該具備發佈-訂閱功能,體現在服務提供者可以根據服務的元數據發佈服務,而服務消費者則通過對自己感興趣的服務進行訂閱並獲取包括服務地址在內的各項元數據。發佈-訂閱的功能還體現在數據變更推送,即當註冊中心服務定義發生變化時,主動推送變更到服務的消費者從而實現服務路由。由於服務提供者和服務消費者同時依賴於註冊中心,就需要確保數據一致性,在任何時候服務提供者和消費者都應該看到同一份數據。同時服務消費者具備緩存功能,當註冊中心不可用時,就可以同步本次緩存中的路由信息獲取服務提供者的地址並實現遠程調用。

再以Dubbo爲例,其註冊中心包含Multicast註冊中心、Zookeeper註冊中心、Redis註冊中心和Simple註冊中心等多種實現方式。無論使用何種實現方式,其基本的模型和工作流程與服務定位模式保持高度一致。

 

如果對文章感興趣,可以關注我的微信公衆號:程序員向架構師轉型。

我出版了《系統架構設計:程序員向架構師轉型之路》、《向技術管理者轉型:軟件開發人員跨越行業、技術、管理的轉型思維與實踐》、《微服務設計原理與架構》、《微服務架構實戰》等書籍,並翻譯有《深入RabbitMQ》和《Spring5響應式編程實戰》,歡迎交流。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章