一、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
网友评论