dubbo源码-RegistryProtocol(注册中心和服务提供者的桥梁)
RegistryProtocol是Protocol的实现类,是注册中心和服务提供者的桥梁,下面分析该类主要的两个方法export(导出服务)、refer(引用服务)的实现流程,分析是如何实现服务导出和服务引用的。
export:
export比较简单,先从invoker中抽取出服务提供者url,调用底层protocol(通过SPI 注入的具体protocol,比如dubbo protocol)的export执行导出,然后从invoker抽取出注册中心url,在调用注册中心的factory获取注册中心,最后进行服务的注册。
refer:
refer因为涉及到服务提供者是集群提供,所以逻辑比export复杂一些,要依赖directory(前面博客有分析)的功能。
首先通过invoker的url获取注册中心的url配置信息,然后给获取的注册中心构建ServiceDiscoveryMigrationInvoker invoker。分析下这类Invoker:
这类Invoker都是以Migration(迁移)开头的,不知道为啥是这个名字,有什么历史故事。MigrationClusterInvoker继承自Invoker主要定义了ServiceDiscoveryInvoker和InterfaceDiscoveryInvoker的刷新操作。
MigrationInvoker实现了MigrationClusterInvoker接口,底层依赖RegistyProtocol的getServiceDiscoveryInvoker和getInvoker接口获取invoker并刷新自己维护的invoker,而RegistryProtocol这两个方法获取到的Invoker都是ClusterInvoker,唯一的差别的是传入的directory一个是ServiceDiscoveryDirectory,一个是RegistryDirectory,在创建Directory后会在这里调用directory的订阅方法,底层具体实现订阅的注册中心类里,比如zookeeperregistry里在订阅完成以后会在调用DynamicDirectory的notify方法更新他们内部的invoker,这也是主要的注册中心和服务提供者关联的地方。 MigrationInvoker封装了serviceDiscoveryinvoker和interfaceinvoker的选择逻辑,底层还是依赖从RegistryProtocol中拿到的invoker的invoke方法。
再回到上面RegistryProtocol的refer流程里,获取到MigrationInvoker这个实例后,又调用了定义的registryProtocolListener的onRefer方法,在唯一的实现MigrationRuleListener类中调用了MigrationInvoker的刷新invoker方法初始化MigrationInvoker类中的两个invoker。
最后返回 MigrationInvoker作为最终的invoker。