美文网首页
dubbo源码阅读之集群

dubbo源码阅读之集群

作者: L寻欢 | 来源:发表于2017-04-01 00:15 被阅读107次

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的类体系结构

图2

RegisterDirectory实现了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主要实现了什么,我们继续分析其里面的源代码。

图4

notify首先更加protocol和category来划分invokeUrls、routerUrls和configuratorUrls。然后,根据各个urls来初始化RegistryDirectory中成员变量configurators、routers。配置overrideDirectoryUrl,最后根据invokerUrls来refreshInvoker。

接下去我们需要考虑如何通过url生成configurators、routers和invokers;


相关文章

网友评论

      本文标题:dubbo源码阅读之集群

      本文链接:https://www.haomeiwen.com/subject/kprmottx.html