本文参考dubbo官方文档,加上自己的理解由来:
dubbo官网

一、图解
1.左侧invoker为抽象的可调用Service,它内部封装了Provider地址和Service接口信息。
2.Directory:各种invoker,值在动态变化的。
3.Cluster:根据所选择的模式在2中将那么多invoker伪装成1,若失败,可重试另外一个invoker。
4.Router: 根据不同的路由规则(条件路由或脚本路由)筛选invoker,例如读写分离、应用隔离。——详细看
路由规则
5.LoadBalance:在4筛选后,根据负载均衡算法选出实际的一个具体invoker调用,若失败,则重新选择。——详细看
负载均衡
综合上述:
1.调用方:
Cluster(根据调用模式)->Invoker(内部筛选,到具体一个Invoker)->调通服务
2.内部筛选逻辑:
Directory(原本总的invoker)->Router(路由一次筛选)->LoadBalance(负载均衡选)->Invoker(实际上被调用的Invoker)
二、容错模式:
1.Faukiver Cluster(默认缺省):
- 失败就自动切换,重试其他服务器.
- 用于读操作,可重试会带来延迟
- 通过retries=“2”来设置重试次数(不含第一次)
2.Failfast Cluster
- 快速失败,只发起一次调用,失败立刻报错。——报错最好捕获,方便自身后续分析
- 用于非幂等性的写操作,比如新增记录
3.Failsafe Cluster
- 失败自动回复,后台记录失败请求,定时重发。——避免陷入服务器宕机,不断失败,不断定时重发
- 通常用作消息通知操作
4.Forking Cluster
- 并行调用多个服务器,成功一个即返回
- 用于实时性高的读操作,但需要浪费更多服务资源。—— 典型的 性能和硬件 之争,协调好二者,本人还是比较推荐这个模式的。
- 可通过forks=“2”设置最大的并行数
5.Broadcast Cluster
- 广播所有提供者,逐一调用,任意一台报错则报错
- 用于通知各个提供者更新缓存或日志等本地资源
附:
集群模式配置:
< dubbo:service cluster = "failsafe" /> 或 |
重试次数配置:
< dubbo:service retries = "2" /> | <dubbo:reference retries="2" /> |
|