-Dubbo源碼分析Regist組件

鏈客,專爲開發者而生,有問必答!ide

此文章來自鏈客區塊鏈技術問答社區,未經容許拒絕轉載。
在這裏插入圖片描述微服務

-Dubbo源碼分析Regist組件1源碼分析

Dubbo最中心的功用包括進程和和諧RPC協議通訊。進程和諧的要害組件是Regist,後者的要害組件在於Remoting。今天我們要點分析Dubbo的進程和諧組件。

進程和諧組件的功用包括:1)註冊消費端組件 2)佈置服務端組件 3)檢測消費端和服務端的心跳 4)同步消費端的服務。其要點處理服務註冊和服務發現問題,固然還有一些服務的治理功用。這也是微服務配置中心的底子中心功用。

註冊組件包括的底子組件包括Registry、RegistryFactory、RegistryService和NotifyListener。其間Registry做爲註冊接口,其結束Node, RegistryService,其結束註冊、去註冊、訂閱和免除訂閱等功用。RegistryFactory經過戰略模式結束Registry的調用,二者一塊兒結束可插拔的內核模式。NotifyListener結束通知功用。本組件的中心在於Registry、RegistryFactory兩部分,其結束的抽象類包括AbstractRegistry和AbstractRegistryFactory。Dubbo自己自帶結束Dubbo、Multicast、Redis和Zookeeper的結束,其餘協議的結束需求本身結束。從可擴展的角度分析,Dubbo結束的機制很是靈敏。

以Dubbo的註冊爲例,其結束服務的銜接和監聽,其具體代碼以下:區塊鏈

public DubboRegistry(Invoker registryInvoker, RegistryService registryService) {this

super(registryInvoker.getUrl());

    this.registryInvoker = registryInvoker;

    this.registryService = registryService;

    // Start reconnection timer

    int reconnectPeriod = registryInvoker.getUrl().getParameter(Constants.REGISTRY_RECONNECT_PERIOD_KEY, RECONNECT_PERIOD_DEFAULT);

    reconnectFuture = scheduledExecutorService.scheduleWithFixedDelay(new Runnable() {

        public void run() {

            // Check and connect to the registry

            try {

                connect();  //服務的銜接

            } catch (Throwable t) { // Defensive fault tolerance

                logger.error("Unexpected error occur at reconnect, cause: " + t.getMessage(), t);

            }

        }

    }, reconnectPeriod, reconnectPeriod, TimeUnit.MILLISECONDS);

}

protected final void connect() {spa

try {

        // 判斷是否發起正常,假如正常直接退出

        if (isAvailable()) {

            return;

        }

        if (logger.isInfoEnabled()) {

            logger.info("Reconnect to registry " + getUrl());

        }

        clientLock.lock();//客戶所肯定

        try {

            // Double check whether or not it is connected

            if (isAvailable()) {

                return;

            }

            recover();//回覆服務

        } finally {

            clientLock.unlock();

        }

    } catch (Throwable t) { // Ignore all the exceptions and wait for the next retry

        if (getUrl().getParameter(Constants.CHECK_KEY, true)) {

            if (t instanceof RuntimeException) {

                throw (RuntimeException) t;

            }

            throw new RuntimeException(t.getMessage(), t);

        }

        logger.error("Failed to connect to registry " + getUrl().getAddress() + " from provider/consumer " + NetUtils.getLocalHost() + " use dubbo " + Version.getVersion() + ", cause: " + t.getMessage(), t);

    }

}

經過以上代碼分析,Dubbo發起服務採用了守時線程池,並且依照固定的距離發起,保證服務的安穩。抽象層的註冊只重視於服務的引入,具體的協議層擔任服務的發起註冊。線程

經過以上的分析,註冊組件分爲三層,第一層爲接口層,擔任具體的使命職責定義;第二層爲抽象註冊層,擔任業務的引入、銷燬等生命週期辦理;第三層爲具體的協議註冊結束層,擔任具體業務的結束。Dubbo的結束是一個職責明晰,使命明晰的一個進程。code

相關文章
相關標籤/搜索