Dubbo 注册中心(Registry)
Dubbo在跟注册中心(Registry)通信之前,首先要创建Registry Proxy,才能subscribe(订阅服务)和register(注册服务)。
在Dubbo中,和注册中心有关的bundle一共有六个,下图所示。
bundle | 描述 |
---|---|
dubbo-registry-api | |
dubbo-registry-default | |
dubbo-registry-multicast | 不需要启动任何中心节点,只要广播地址一样,就可以互相发现,组播受网络结构限制,只适合小规模应用或开发阶段使用。 组播地址段: 224.0.0.0 - 239.255.255.255 |
dubbo-registry-redis | 基于redis实现 |
dubbo-registry-simple | 简单实现,不支持集群,通过java.util.Map存储Url |
dubbo-registry-zookeeper | 基于zk实现,支持集群,通过目录提供服务 |
1 | <dubbo:registry protocol=”zookeeper” address="127.0.0.1:2181" /> |
1 | <dubbo:registry protocol=”dubbo” address="127.0.0.1:9090" /> |
1 | <dubbo:registry protocol="redis" address="10.20.153.10:6379" /> |
1 | <dubbo:registry protocol="multicast" address="224.5.6.7:1234" /> |
1 | <dubbo:service interface="com.alibaba.dubbo.registry.RegistryService" group="simple" version="1.0.0" ... /> |
1、创建了一个RegistryDirectory,可以调用RegistryDirectory的doList(Invocation invocation)方法来获得invocation的所有Invoker。其中invocation只需要给出调用的方法名称,Invoker则负责发送调用请求和接收返回结果,里面封装了所有的通信,序列化细节。RegistryDirectory又是如何根据invocation来得到invoker的呢?RegistryDirectory包含一个subscribe方法,用来向Registry请求感兴趣的服务的调用地址,然后Registry会回调RegistryDirectory,也就是notify方法,notify方法就会把这些服务的地址进一步封装成invoker,并且缓存起来。这样调用doList的时候直接根据invocation的方法名来找对应的invoker就可以了。
2、因为RegistryDirectory的doList返回的invocation是一个list列表,也就是可能会存在多个可用的服务实现,那么就需要一个负载均衡机制来决定调用哪个服务,可以看到cluster的invoke方法里都有一个loadbalance来具体实现选择。
3、构造RegistryService代理,所有的请求通过cluster最后落到directory的invoker上面,具体负责RegistryService里各种接口方法的调用。
4、实现一个DubboRegistry,跟RegistryService区别是,DubboRegistry里面实现了failback机制,如果某个方法调用失败,那么会有一个线程来重复的调用,直到调用成功。
5、是用来设置Registry Proxy,RegistryDirectory使用它来连接Registry,请求感兴趣的服务地址。
6、设置Protocol,RegistryDirectory使用它来把url转换成invoker。
7、初始化Registry Proxy,使用consumer端的配置信息来连接Registry,调用完成后Registry的invoker就生成了。这一步就是RegistryProxy同普通的Service Proxy不一致的地方。
8、重新注册Registry服务,这样就可以获得Registry的Provider端的配置信息。生成Registry代理和普通代理的区别是:普通代理需要Registry代理同Registry通信,订阅服务和生成invoker。但是Registry代理则只能先通过consumer端的配置信息生成一个临时的代理,然后在notify回调时重新生成Registry代理(包含了Provider端的参数以及路由信息)。