Dubbo3 注冊中心擴(kuò)展

2022-04-22 11:53 更新

擴(kuò)展說明

負(fù)責(zé)服務(wù)的注冊與發(fā)現(xiàn)。

擴(kuò)展接口

  • org.apache.dubbo.registry.RegistryFactory
  • org.apache.dubbo.registry.Registry

擴(kuò)展配置

<!-- 定義注冊中心 -->
<dubbo:registry id="xxx1" address="xxx://ip:port" />
<!-- 引用注冊中心,如果沒有配置registry屬性,將在ApplicationContext中自動掃描registry配置 -->
<dubbo:service registry="xxx1" />
<!-- 引用注冊中心缺省值,當(dāng)<dubbo:service>沒有配置registry屬性時,使用此配置 -->
<dubbo:provider registry="xxx1" />

擴(kuò)展契約

RegistryFactory.java:

public interface RegistryFactory {
    /**
     * 連接注冊中心.
     * 
     * 連接注冊中心需處理契約:<br>
     * 1. 當(dāng)設(shè)置check=false時表示不檢查連接,否則在連接不上時拋出異常。<br>
     * 2. 支持URL上的username:password權(quán)限認(rèn)證。<br>
     * 3. 支持backup=10.20.153.10備選注冊中心集群地址。<br>
     * 4. 支持file=registry.cache本地磁盤文件緩存。<br>
     * 5. 支持timeout=1000請求超時設(shè)置。<br>
     * 6. 支持session=60000會話超時或過期設(shè)置。<br>
     * 
     * @param url 注冊中心地址,不允許為空
     * @return 注冊中心引用,總不返回空
     */
    Registry getRegistry(URL url); 
}

RegistryService.java:

public interface RegistryService { // Registry extends RegistryService 
    /**
     * 注冊服務(wù).
     * 
     * 注冊需處理契約:<br>
     * 1. 當(dāng)URL設(shè)置了check=false時,注冊失敗后不報(bào)錯,在后臺定時重試,否則拋出異常。<br>
     * 2. 當(dāng)URL設(shè)置了dynamic=false參數(shù),則需持久存儲,否則,當(dāng)注冊者出現(xiàn)斷電等情況異常退出時,需自動刪除。<br>
     * 3. 當(dāng)URL設(shè)置了category=overrides時,表示分類存儲,缺省類別為providers,可按分類部分通知數(shù)據(jù)。<br>
     * 4. 當(dāng)注冊中心重啟,網(wǎng)絡(luò)抖動,不能丟失數(shù)據(jù),包括斷線自動刪除數(shù)據(jù)。<br>
     * 5. 允許URI相同但參數(shù)不同的URL并存,不能覆蓋。<br>
     * 
     * @param url 注冊信息,不允許為空,如:dubbo://10.20.153.10/com.alibaba.foo.BarService?version=1.0.0&application=kylin
     */
    void register(URL url);
 
    /**
     * 取消注冊服務(wù).
     * 
     * 取消注冊需處理契約:<br>
     * 1. 如果是dynamic=false的持久存儲數(shù)據(jù),找不到注冊數(shù)據(jù),則拋IllegalStateException,否則忽略。<br>
     * 2. 按全URL匹配取消注冊。<br>
     * 
     * @param url 注冊信息,不允許為空,如:dubbo://10.20.153.10/com.alibaba.foo.BarService?version=1.0.0&application=kylin
     */
    void unregister(URL url);
 
    /**
     * 訂閱服務(wù).
     * 
     * 訂閱需處理契約:<br>
     * 1. 當(dāng)URL設(shè)置了check=false時,訂閱失敗后不報(bào)錯,在后臺定時重試。<br>
     * 2. 當(dāng)URL設(shè)置了category=overrides,只通知指定分類的數(shù)據(jù),多個分類用逗號分隔,并允許星號通配,表示訂閱所有分類數(shù)據(jù)。<br>
     * 3. 允許以interface,group,version,classifier作為條件查詢,如:interface=com.alibaba.foo.BarService&version=1.0.0<br>
     * 4. 并且查詢條件允許星號通配,訂閱所有接口的所有分組的所有版本,或:interface=*&group=*&version=*&classifier=*<br>
     * 5. 當(dāng)注冊中心重啟,網(wǎng)絡(luò)抖動,需自動恢復(fù)訂閱請求。<br>
     * 6. 允許URI相同但參數(shù)不同的URL并存,不能覆蓋。<br>
     * 7. 必須阻塞訂閱過程,等第一次通知完后再返回。<br>
     * 
     * @param url 訂閱條件,不允許為空,如:consumer://10.20.153.10/com.alibaba.foo.BarService?version=1.0.0&application=kylin
     * @param listener 變更事件監(jiān)聽器,不允許為空
     */
    void subscribe(URL url, NotifyListener listener);
 
    /**
     * 取消訂閱服務(wù).
     * 
     * 取消訂閱需處理契約:<br>
     * 1. 如果沒有訂閱,直接忽略。<br>
     * 2. 按全URL匹配取消訂閱。<br>
     * 
     * @param url 訂閱條件,不允許為空,如:consumer://10.20.153.10/com.alibaba.foo.BarService?version=1.0.0&application=kylin
     * @param listener 變更事件監(jiān)聽器,不允許為空
     */
    void unsubscribe(URL url, NotifyListener listener);
 
    /**
     * 查詢注冊列表,與訂閱的推模式相對應(yīng),這里為拉模式,只返回一次結(jié)果。
     * 
     * @see org.apache.dubbo.registry.NotifyListener#notify(List)
     * @param url 查詢條件,不允許為空,如:consumer://10.20.153.10/com.alibaba.foo.BarService?version=1.0.0&application=kylin
     * @return 已注冊信息列表,可能為空,含義同{@link org.apache.dubbo.registry.NotifyListener#notify(List<URL>)}的參數(shù)。
     */
    List<URL> lookup(URL url);
 
}

NotifyListener.java:

public interface NotifyListener { 
    /**
     * 當(dāng)收到服務(wù)變更通知時觸發(fā)。
     * 
     * 通知需處理契約:<br>
     * 1. 總是以服務(wù)接口和數(shù)據(jù)類型為維度全量通知,即不會通知一個服務(wù)的同類型的部分?jǐn)?shù)據(jù),用戶不需要對比上一次通知結(jié)果。<br>
     * 2. 訂閱時的第一次通知,必須是一個服務(wù)的所有類型數(shù)據(jù)的全量通知。<br>
     * 3. 中途變更時,允許不同類型的數(shù)據(jù)分開通知,比如:providers, consumers, routes, overrides,允許只通知其中一種類型,但該類型的數(shù)據(jù)必須是全量的,不是增量的。<br>
     * 4. 如果一種類型的數(shù)據(jù)為空,需通知一個empty協(xié)議并帶category參數(shù)的標(biāo)識性URL數(shù)據(jù)。<br>
     * 5. 通知者(即注冊中心實(shí)現(xiàn))需保證通知的順序,比如:單線程推送,隊(duì)列串行化,帶版本對比。<br>
     * 
     * @param urls 已注冊信息列表,總不為空,含義同{@link org.apache.dubbo.registry.RegistryService#lookup(URL)}的返回值。
     */
    void notify(List<URL> urls);
 
}

已知擴(kuò)展

org.apache.dubbo.registry.support.dubbo.DubboRegistryFactory

擴(kuò)展示例

Maven 項(xiàng)目結(jié)構(gòu):

src
 |-main
    |-java
        |-com
            |-xxx
                |-XxxRegistryFactoryjava (實(shí)現(xiàn)RegistryFactory接口)
                |-XxxRegistry.java (實(shí)現(xiàn)Registry接口)
    |-resources
        |-META-INF
            |-dubbo
                |-org.apache.dubbo.registry.RegistryFactory (純文本文件,內(nèi)容為:xxx=com.xxx.XxxRegistryFactory)

XxxRegistryFactory.java:

package com.xxx;
 
import org.apache.dubbo.registry.RegistryFactory;
import org.apache.dubbo.registry.Registry;
import org.apache.dubbo.common.URL;
 
public class XxxRegistryFactory implements RegistryFactory {
    public Registry getRegistry(URL url) {
        return new XxxRegistry(url);
    }
}

XxxRegistry.java:

package com.xxx;
 
import org.apache.dubbo.registry.Registry;
import org.apache.dubbo.registry.NotifyListener;
import org.apache.dubbo.common.URL;
 
public class XxxRegistry implements Registry {
    public void register(URL url) {
        // ...
    }
    public void unregister(URL url) {
        // ...
    }
    public void subscribe(URL url, NotifyListener listener) {
        // ...
    }
    public void unsubscribe(URL url, NotifyListener listener) {
        // ...
    }
}

META-INF/dubbo/org.apache.dubbo.registry.RegistryFactory:

xxx=com.xxx.XxxRegistryFactory


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號