插播面试题
看源码我比较喜欢带着目的性,带着问题看源码
- dubbo中"读接口"和"写接口"有什么区别?
- 谈谈dubbo中的不同容错机制及特点?
集群容错架构设计
首先上一张Dubbo官网的集群容错的架构设计图
其中有几个关键角色
- Directory:其用途是保存 Invoker,可简单类比为 List。其实现类 RegistryDirectory 是一个动态服务目录,可感知注册中心配置的变化,它所持有的 Invoker 列表会随着注册中心内容的变化而变化
- Router:可以简单理解为过滤器(路由),用户可以配置自己的路由规则,从而过滤掉不符合规则的Invoker
- LoadBalance:LoadBalance是负载均衡的抽象接口,负责从Router路由规则过滤后的Invoker列表中选择一个最终调用的Invoker
- Invoker:这里的 Invoker 是 Provider 的一个可调用 Service 的抽象,Invoker 封装了 Provider 地址及 Service 接口信息
还有一个Cluster没介绍,Cluster又是什么作用呢?
集群 Cluster 用途是将多个服务提供者合并为一个 Cluster Invoker,并将这个 Invoker 暴露给服务消费者。这样一来,服务消费者只需通过这个 Invoker 进行远程调用即可,至于具体调用哪个服务提供者,以及调用失败后如何处理等问题,现在都交给集群模块去处理
Cluster 将 Directory 中的多个 Invoker 伪装成一个 Invoker,对上层透明,伪装过程包含了容错逻辑,调用失败后,重试另一个
既然Cluter中包含了集群容错的场景,那么就从接口层面入手,看下Cluster到底有几种容错机制
可以看到Cluster接口的默认实现是FailoverCluster(失败重试),容错机制共有10种,从经常使用的开始介绍
FailoverCluster
失败自动切换,当出现失败,重试其它服务器 。通常用于读操作,但重试会带来更长延迟。可通过 retries=“2” 来设置重试次数(不含第一次)
FailoverClusterInvoker#doInvoke方法实现如下
FailfastCluster
快速失败,只发起一次调用,失败立即报错。通常用于非幂等性的写操作,比如新增记录。
FailfastClusterInvoker#doInvoke方法如下