鏈客,專爲開發者而生,有問必答!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