本文将主要围绕Invocation这个抽象概念进行讲解,首先来看一下相关的类图结构。
整体概念
- Invocation,一次具体的调用,包含方法名、参数类型、参数
- Result,一次调用结果,包含value和exception
- Invoker,调用者,对应一个服务接口,通过invoke方法执行调用,参数为Invocation,返回值为Result
DubboInvoker
- 通过ExchangeClient发送调用请求(Invocation)
- doInvoke()分为oneWay、async、sync调用
- 对client的选择采用轮询的方式
ThriftInvoker
与sync调用基本相同
AbstractClusterInvoker
- 多个服务端实例组成的集群,可以设定针对多组实例的选择策略
- 维护Directory对象,通过list方法查找一个Invocation对应的Invokers
- 具有select方法,invokers作为参数传递给select()
选择策略:通过LoadBalance来选取Invoker,若选出的Invoker已经被选择过,则进行reselct()
7种集群调用策略
FailfastClusterInvoker
select之后只调用一次,失败立即返回错误
FailoverClusterInvoker
重试n次,每次更新selected集合,保证失败后切换到另一个Invoker
FailbackClusterInvoker
select后发起一次调用,若失败则将Invoker加入失败列表,定期重试
FailsafeClusterInvoker
select后发起一次调用,若失败忽略异常,返回一个空Result
AvailableClusterInvoker
不进行select,仅选取第一个available的Invoker
BroadcastClusterInvoker
不进行select,每个Invoker都调用一次
ForkingClusterInvoker
不进行select,对所有分组并行发起调用,最快的调用完成后返回结果