1. 问题
如何设计dubbo的集群,如何配置和设计dubbo负载均衡策略,如何路由服务?针对这些问题,我们来理解dubbo的几个类:AbstractClusterInvoker,Directory,LoadBalance,Router这几个类之间的关系。
2. 描述
2.1 AbstractClusterInvoker的invoke流程
AbstractClusterInvoker作为一个Invoker,它是dubbo的核心概念,在dubbo的开发文档中有如下解释:它代表一个可执行体,可向它发起invoke调用,它有可能是一个本地的实现,也可能是一个远程的实现,也可能一个集群实现。而这里就是一种集群实现。其核心过程也是invoke调用的过程。下图就是调用的序列图:
图1这张序列图主要描述了集群Invoker和Directory、Router、LoadBalance之间的交互。最后的Invoker表示抽象集群Invoker的各种具体类。
这里我们主要思考:这个流程中Directory主要解决了什么问题?Rounter又解决了什么的问题?使用EntensionLoader加载具体LoadBalance又什么样的好处?
2.2 Directory的类体系结构
图2RegisterDirectory实现了doList,主要通过invocation对象中获取methodName和argument,并组成key,从localMethodInvokeMap中获取invokes。这里对key做了四种场景考虑:
1. 存在参数时
2. 根据方法名
3.根据匹配符Any(*)
4. 获取localMethodInvokeMap第一个key对应的invokers列表
但是RegisterDirectory还可以做很多其他事情,同时这里要考虑localMethodInvokeMap是什么时候出初始化的,通过什么内容来初始化。
图3这里主要说明在createRegistry的过程中,会调用RegistryDirectory的notify和subscribe的方法,而notify和subscribe主要实现了什么,我们继续分析其里面的源代码。
图4notify首先更加protocol和category来划分invokeUrls、routerUrls和configuratorUrls。然后,根据各个urls来初始化RegistryDirectory中成员变量configurators、routers。配置overrideDirectoryUrl,最后根据invokerUrls来refreshInvoker。
接下去我们需要考虑如何通过url生成configurators、routers和invokers;
网友评论