注冊中心概述:
Dubbo通過注冊中心實現(xiàn)了分布式環(huán)境的服務注冊和發(fā)現(xiàn),是分布式節(jié)點的紐帶读第,主要作用如下:
1.動態(tài)加入,一個服務提供者通過注冊中心可以動態(tài)地把自己暴露給其他消費者,無需消費者逐個去更新配置文件韭山。
2.動態(tài)發(fā)現(xiàn),一個消費者可以動態(tài)的感知新的配置、路由規(guī)則和新的服務提供者.無需重啟服務使之生效
3.動態(tài)調(diào)整,注冊中心支持參數(shù)的動態(tài)調(diào)整灯变,新參數(shù)自動更新到所有服務相關(guān)節(jié)點扣猫。
4.統(tǒng)一配置菜循,避免了本地配置導致每個服務的配置不一致問題。
官方推薦使用zookeeper癌幕,阿里內(nèi)部沒有使用過redis作為注冊中心,故沒有長時間運行的可靠驗證.
工作流程:
服務提供者啟動的時候,會向注冊中心寫入自己的元數(shù)據(jù)信息,同時會訂閱配置元數(shù)據(jù)的信息.
消費者啟動的也會想注冊中心寫入自己的元數(shù)據(jù)信息,并訂閱服務提供者昧穿,路由和配置元數(shù)據(jù)
服務治理中心(dubbo-admin)啟動時勺远,會同時訂閱所有消費者和路由以及配置元數(shù)據(jù)的信息。
當服務提供者離開或者新的服務加入的時候时鸵,注冊中心服務提供者的信息會發(fā)生變化谚中,變化信息會動態(tài)通知消費者、服務治理中心
服務消費者服務調(diào)用的時候會異步將調(diào)用統(tǒng)計等上報給監(jiān)控中心寥枝。
原理概述:
可以在這里看到所有的都是在dubbo層級下的dubbo跟節(jié)點下面是當前所擁有的接口名稱宪塔,如果有多個接口,則會以多個子節(jié)點的形式展開
每個服務下面又分別有四個配置項
consumers: 當前服務下面所有的消費者列表(URL)
providers:當前服務下面所有的提供者列表(URL)
configuration:當前服務下面的配置信息信息囊拜,provider或者consumer會通過讀取這里的配置信息來獲取配置
routers: 當消費者在進行獲取提供者的時某筐,會通過這里配置好的路由來進行適配匹配規(guī)則。
可以看到冠跷,dubbo基本上很多時候都是通過URL的形式來進行交互獲取數(shù)據(jù)的南誊,在URL中也會保存
很多的信息身诺。
提供者會在 providers目錄下進行自身的服務注冊。
消費者會在consumers 目錄下進行自身注冊抄囚,并且監(jiān)聽 provider 目錄霉赡,以此通過監(jiān)聽提供者增加或者減少,實現(xiàn)服務發(fā)現(xiàn)幔托。
Monitor模塊會對整個服務級別做監(jiān)聽穴亏,用來得知整體的服務情況。以此就能更多的對整體情況做監(jiān)控重挑。
服務注冊流程分析:
首先 ServiceConfig 類拿到對外提供服務的實際類 ref(如:HelloServiceImpl),然后通過ProxyFactory 接口實現(xiàn)類中的 getInvoker 方法使用 ref 生成一個 AbstractProxyInvoker 實例嗓化,到這一步就完成具體服務到 Invoker 的轉(zhuǎn)化。接下來就是 Invoker 轉(zhuǎn)換到 Exporter 的過程谬哀。
刺覆、、史煎、
public interface RegistryService {
/**
*進行對URL的注冊操作谦屑,比如provider,consumer篇梭,routers等
*/
? ? void register(URL url);
/**
*解除對指定URL的注冊氢橙,比如provider,consumer很洋,routers等
*/
void unregister(URL url);
/**
*增加對指定URL的路徑監(jiān)聽充蓝,當有變化的時候進行通知操作
*/
? ? void subscribe(URL url, NotifyListener listener);
/**
*解除對指定URL的路徑監(jiān)聽隧枫,取消指定的listener
*/
? ? void unsubscribe(URL url, NotifyListener listener);
/**
*查詢指定URL下面的URL列表喉磁,比如查詢指定服務下面的consumer列表
*/
List<URL> lookup(URL url);
}
? ? ? ??