ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

分布式中台实践

2019-05-27 10:51:40  阅读:239  来源: 互联网

标签:Dubbo 结束 getUrl 实践 注册 组件 服务 分布式


链客,专为开发者而生,有问必答!

此文章来自链客区块链技术问答社区,未经允许拒绝转载。
在这里插入图片描述

-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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有