分布式中台实践
作者:互联网
链客,专为开发者而生,有问必答!
此文章来自链客区块链技术问答社区,未经允许拒绝转载。
-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) {
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() {
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的结束是一个职责明晰,使命明晰的一个进程。
标签:Dubbo,结束,getUrl,实践,注册,组件,服务,分布式 来源: https://blog.csdn.net/weixin_44172023/article/details/90598914