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

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

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

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


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

    1、zookeeper 常用。

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

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

    4、multicast注册中心。


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

     

     


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注册中心分析:



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

每个在 spring 内部都会生成一个 ServiceBean 实例,

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

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

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

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

扩展配置:

实现RegistryFactory接口:

实现Registry接口:


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

xxx=com.xxx.XxxRegistryFactory


你可能感兴趣的:(十六、Dubbo框架源码分析:注册中心)