服務注冊與發現的中心,服務的提供者将服務釋出到注冊中心,服務的使用着到注冊中引用服務。
Dubbo的注冊中心提供了多種實作,其實作是基于dubbo的spi的擴充機制的,使用着可以直接實作自己的注冊中心。
@SPI("dubbo")
public interface RegistryFactory {
@Adaptive({"protocol"})
RegistrygetRegistry(URL url);
}
RegistryFactory用來建立注冊中心, 預設的注冊中心是dubbo協定,由于阿裡的注冊中心并沒有開源,dubbo協定注冊中心隻提供了一個簡單實作。 開源dubbo的注冊中心推薦使用zookeeper。這裡我們主要去分析基于dubbo和zookeeper協定的注冊中心實作及使用。
注冊中心服務類圖:
服務接口定義
public interface RegistryService {
void register(URL url);
void unregister(URL url);
void subscribe(URL url, NotifyListener listener);
void unsubscribe(URL url, NotifyListener listener);
List<URL> lookup(URL url);
}
Register:注冊資料,比如:提供者位址,消費者位址,路由規則,覆寫規則,等資料。
注冊需處理契約
1. 當URL設定了check=false時,注冊失敗後不報錯,在背景定時重試,否則抛出異常。
2. 當URL設定了dynamic=false參數,則需持久存儲,否則,當注冊者出現斷電等情況異常退出時,需自動删除。
3. 當URL設定了category=routers時,表示分類存儲,預設類别為providers,可按分類部分通知資料。
4. 當注冊中心重新開機,網絡抖動,不能丢失資料,包括斷線自動删除資料。
5. 允許URI相同但參數不同的URL并存,不能覆寫。
Unregister:取消注冊
Subscribe:訂閱符合條件的已注冊資料,當有注冊資料變更時自動推送
訂閱需處理契
1. 當URL設定了check=false時,訂閱失敗後不報錯,在背景定時重試。
2. 當URL設定了category=routers,隻通知指定分類的資料,多個分類用逗号分隔,并允許星号通配,表示訂閱所有分類資料。
3. 允許以interface,group,version,classifier作為條件查詢,如:interface=com.alibaba.foo.BarService&version=1.0.0
4. 并且查詢條件允許星号通配,訂閱所有接口的所有分組的所有版本,或:interface=*&group=*&version=*&classifier=*
5. 當注冊中心重新開機,網絡抖動,需自動恢複訂閱請求
6. 允許URI相同但參數不同的URL并存,不能覆寫
7. 必須阻塞訂閱過程,等第一次通知完後再傳回。
Unsubscribe:取消訂閱
Lookup: 查詢符合條件的已注冊資料,與訂閱的推模式相對應,這裡為拉模式,隻傳回一次結果