Directory代表了多个invoker,对于消费端来说,每个invoker代表了一个服务提供者。
Directory内部维护一个List,这个List会通过注册中心根据服务端的变更而变更。
![](https://img.haomeiwen.com/i10778047/ceea8ca43d876ae7.png)
StaticDirectory是当消费端使用了多注册中心时,其把所有服务注册中心的invoker列表汇集到一个invoker列表中。
![](https://img.haomeiwen.com/i10778047/92a1091fb981f06f.png)
RegistryDirectory管理的invoker列表根据服务注册中心的推送变化而变化。
1.RegistryDirectory创建流程
![](https://img.haomeiwen.com/i10778047/ae4be26f68af45e6.png)
![](https://img.haomeiwen.com/i10778047/0c1ff3f573efc176.png)
![](https://img.haomeiwen.com/i10778047/84ba0cf842bfc30e.png)
![](https://img.haomeiwen.com/i10778047/a11a5a8a22102250.png)
当ReferenceConfig.get()的时候,调用到createProxy(),内部需要返回一个invoker,此时回根据Protocol的SPI实现来调用到RegistryProtocol的createProxy(),通过此方法看到,在此处创建了RegistryDirecotry对象
2.RegistryDirectory中invoker列表的更新
![](https://img.haomeiwen.com/i10778047/e6e9000b313b00b1.png)
RouterChain则是再创建RegistryDirectory后创建的
![](https://img.haomeiwen.com/i10778047/ca0463ad7e7aa8e6.png)
RouterChain保存了可用于服务提供者对应的invokers列表和路由规则信息,当消费端的集群容错策略要获取可用服务提供者对应的invoker列表时,会调用RouterChain的route()方法。
总结,在消费端中,每个需要消费的服务都被包装为RegerenceConfig,在应用启动时会调用每个服务对应的RegerenceConfig.get()。然后会为每个服务创建一个自己的RegistryDirectory对象,每个RegistryDirectory管理该服务提供者的地址列表、路由规则、动态配置等信息,当服务提供者的信息发生变化,RegistryDirecotry回动态得到变化的通知,并自动更新。
网友评论