美文网首页
十六、Dubbo框架源码分析:注册中心

十六、Dubbo框架源码分析:注册中心

作者: 还算年轻 | 来源:发表于2020-11-02 10:43 被阅读0次

    一、Dubbo支持哪些注册中心,特点和区别?

    注:注册中心的作用就是提供暴露接口的发现与动态更新,相当与一个小的数据库,存储了哪个服务提供哪些接口给调用者使用,并当服务不可用时剔除通知给调用者。

    目前dubbo 推荐zookeeper 作为注册中心。

    1、dubbo支持的注册中心有:(dubbo为每个注册实现单独一个小工程实现,通过registry-api 抽象出公用实现)

        1、zookeeper 常用。

        2、dubbo自己定义的注册中心。

        3、redis:基于redis的注册中心。

        4、multicast注册中心。


    2、dubbo注册中心如何配置:(dubbo支持多注册中心)

         <dubbo:registry address="zookeeper://10.20.153.10:2181" />

         <dubbo:registry address="redis://10.20.153.10:6379" />

    3、dubbo支持注册中心特点以及选择:

        1、multicast注册中心:(不常用:适用于较小规模开发)

            Multicast 注册中心不需要启动任何中心节点,只要广播地址一样,就可以互相发现。

            1. 提供方启动时广播自己的地址

            2. 消费方启动时广播订阅请求

            3. 提供方收到订阅请求时,单播自己的地址给订阅者,如果设置了 unicast=false ,则广播给订阅者

            4. 消费方收到提供方地址时,连接该地址进行 RPC 调用。

        2、redis:基于redis的注册中心:

            1.通过redis的存储能力,存储服务信息。

            2.通过redis的发布订阅能力,提供通知功能。

    使用 Redis 的 Key/Map 结构存储数据结构:

        主Key 为服务名和类型

        Map 中的 Key 为 URL 地址

        Map 中的 Value 为过期时间,用于判断脏数据,脏数据由监控中心删除

    使用Redis 的 Publish/Subscribe 事件通知数据变更:

        通过事件的值区分事件类型:

        register , unregister , subscribe , unsubscribe

        普通消费者直接订阅指定服务提供者的 Key,只会收到指定服务的 register ,unregister 事件

       3、dubbo自己定义的注册中心:

        Simple 注册中心本身就是一个普通的 Dubbo 服务,可以减少第三方依赖,使整体通讯方式一致。

        基于 dubbo 协议开源只是给出了默认一个注册中心实现 SimpleRegistryService,它 只 是 一 个 简 单 实 现 , 不 支 持 集 群 , 就 是 利 用 Map来存储服务地址, 具体不在啰嗦了,请读者翻看源代码,可作为自定义注册中的参考将 Simple 注册中心暴露成 Dubbo 服务:

        4、zookeeper :

        流程说明:

        服务提供者启动时: 向 /dubbo/com.foo.BarService/providers 目录下写入自己的 URL 地址 服务消费者启动时: 订阅 /dubbo/com.foo.BarService/providers 目录下的提供者 URL 地址。并向/dubbo/com.foo.BarService/consumers 目录下写入自己的URL 地址监控中心启动时: 订阅 /dubbo/com.foo.BarService 目录下的所有提供者和消费者 URL 地址。

    二、Dubbo注册中心源码分析:

     1、multicast注册中心分析:

     2、zk注册中心分析:

    <dubbo:registry protocol=” zookeeper” address="127.0.0. 1:2181" />

    5、发布服务是注册服务信息到注册中心:

    每个<dubbo:service/>在 spring 内部都会生成一个 ServiceBean 实例,

    ServiceBean 的实例化过程中调用 export 方法来暴露服务

    1. 通过 loadRegistries 获取注册中心 registryUrls

    1.检查注册中心->如果xml中没有配置registries,则从 dubbo.properties->List<RegistryConfig>

    2.按照配置的协议比较暴露服务到各个注册中心:例dubbo协议:

    private static final Protocol protocol = ExtensionLoader.getExtensionLoader(Protocol.class).getAdaptiveExtension();

    Invoker<?> invoker = proxyFactory.getInvoker(ref, (Class) interfaceClass,registryURL.addParameterAndEncoded(Constants.EXPORT_KEY, url.toFullString()));

    Exporter<?> exporter = protocol.export(invoker);

    exporters.add(exporter);

    protocol 是protocol 的SPI 适配器类:

    RegistryProtocol#export() 方法主要做了以下几步:

    1、做本地发布,在 DubboProtocol 打开一个 Netty 服务进行监听

    2、获得一个 ZookeeperRegistry 的注册中心的连接,并将服务注册到 zk 上/dubbo-demo/com.guaoran.source.dubbo.demo.IHelloService/providers/dubbo%3A%2F%2F19..开启一个订阅

    3、在 zk 上注册一个 /dubbo-demo/com.guaoran.source.dubbo.demo.IHelloService/configurators 节点

    三、如何扩展Dubbo注册中心,实现自定义?

    扩展接口:

        com.alibaba.dubbo.registry.RegistryFactory

        com.alibaba.dubbo.registry.Registry

    扩展配置:

    <!-- 定义注册中心 -->

    <dubbo:registry id="xxx1" address="xxx://ip:port" />

    <!-- 引用注册中心,如果没有配置registry属性,将在ApplicationContext中自动扫描registry配置 -->

    <dubbo:service registry="xxx1" />

    <!-- 引用注册中心缺省值,当<dubbo:service>没有配置registry属性时,使用此配置-->

    <dubbo:provider registry="xxx1" />

    实现RegistryFactory接口:

    实现Registry接口:


    META-INF/dubbo/com.alibaba.dubbo.registry.RegistryFactory:

    xxx=com.xxx.XxxRegistryFactory


    相关文章

      网友评论

          本文标题:十六、Dubbo框架源码分析:注册中心

          本文链接:https://www.haomeiwen.com/subject/dflamktx.html