dubbo源码4-cluster

cluster包定义了dubbo集群相关封装,主要使用在消费端。

cluster包根目录下类定义了集群相关的顶层抽象,主要包括:

Router: 消费时实现服务端机器过滤功能。 参见 https://dubbo.apache.org/zh/docs/v2.7/user/examples/routing-rule/。代码上体现为传入invoker list返回一个过滤后的invoker list。

RouteChain: 通过传入的url配置信息获取RouteFactory列表,然后通过RouteFactory列表获取Router列表,该类会维护一个invoker列表,对外提供的接口就是一个route方法,返回经过router列表过滤后的invoker list。

Directory: 定义一个服务,内部维护该服务的提供者列表(invoker list)。 对外接口主要是获取当前服务的interface和获取该服务的提供者列表(list)。具体实现在cluster包里有StaticDirectory。 

Cluster:可以理解为集群版本invoker的工厂,该接口主要对外输出的是invoker,接收Directory作为参数。

LoadBalance: 多服务提供者的负载均衡。 传入服务者列表(invoker list), 返回单个invoker。

Router和LoadBalance的功能定义比较类似,都是对服务提供者的选择。 Router是实现过滤功能,而LoadBalance是实现选择,比如LoadBalance的实现有一致性hash选择、随机选择、顺序选择等。

下面从消费者代码看这些类是如何串联起来的:

首先在服务消费者引用外部服务时会调用ReferenceConfig的get方法。

 

 

 get方法内部会调用ReferenceConfig的init方法。

 

 

 

init内部再调用createProxy方法创建代理:

 

 createProxy内部通过protocol传入url创建invoker list。 然后通过如下代码创建最终的invoker:

 

 > 首先创建StaticDirectory。 静态Directory是Directory的一个实现类,主要实现的逻辑是先通过静态传入invoker list,然后通过调用RouteChain进行invoker的过滤获得过滤后的invoker。

1. 获取静态invoker list

 

 2. RouteChain过滤:

 

 

> 然后获取指定集群,这里以AvailableCluster为例,直接返回对应的invoker,比如availableCluster直接返回availableClusterInvoker。

 

最后在availableclusterinvoker中顺序找到一个available的invoker执行:

 

 

有个疑问点,就是如何通过url获取到invoker list,url中只存储了register的信息,如何通过register最终生成invoker list? todo:

 

posted @ 2021-06-21 10:41  Birding  阅读(49)  评论(0编辑  收藏  举报