链客,专为开发者而生,有问必答!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