目录
Dubbo版本
- Dubbo版本2.6.7
集群作用
-
Dubbo 定义了集群接口 Cluster 以及 Cluster Invoker。集群 Cluster 用途是将多个服务提供者合并为一个 Cluster Invoker,并将这个 Invoker 暴露给服务消费者。服务消费者只需通过这个 Invoker 进行远程调用即可,至于具体调用哪个服务提供者,以及调用失败后如何处理等问题,现在都交给集群模块去处理。
-
集群模块(Cluster)是服务提供者和服务消费者的中间层,为服务消费者屏蔽了服务提供者的情况,这样服务消费者就可以专心处理远程调用相关事宜。比如发请求,接受服务提供者返回的数据等。这就是集群的作用。
-
Dubbo集群层(Cluster层)的总体工作流程
- 生成Invoker对象。
- 筛选可用的服务列表。通过
Directory#list获取所有可用的服务列表。根据不同的ClusterInvoker筛选出不同的Invoker对象,使用Router处理改服务列表,根据路由规则过滤服务列表,最终返回剩余的服务列表 - 做负载均衡。筛选可用的服务列表后,通过不同的负载均衡策略选择出一个服务,然后调用
- 做RPC调用。

集群容错方式
-
Dubbo提供的集群容错方式
- Failover Cluster : 失败自动切换重试,当服务消费方调用服务提供者失败后,会自动切换到其他服务提供者服务器进行重试,这通常用于读操作或者具有幂等的写操作。需要注意的是,重试会带来更长延迟。可以通过
retries="2"来设置重试次数,表示额外的重试2次 - **Failfast Cluster **:快速失败,当服务消费方调用服务提供者失败后,立即报错,即只调用一次。通常,这种模式用于非幂等性的写操作。
- Failsafe Cluster : 失败安全,当服务消费者调用服务出现异常时,直接忽略异常。这种模式一般用于写入日志等操作,即不关心失败
- Failback Cluster: 失败自动恢复,当服务消费端调用服务出现异常后,在后台记录失败的请求,并按照一定的策略后期再进行重试。这种模式通常用于消息通知操作
- Forking Cluster:并行调用多个服务提供者。当消费方调用一个接口方法后,消费者会并行调用多个服务提供者的服务,只要其中有一个成功即返回。这种模式通常用于实时性要求较高的读操作,但需要浪费更多服务资源。可通过
forks="4"来设置最大并行数 - Broadcast Cluster:广播调用,当消费者调用一个接口方法后,Dubbo消费者会逐个调用所有服务提供者,任意一台服务器调用异常则这次调用就标志失败。这种模式通常用于通知所有提供者更新缓存或日志等本地资源信息。由于是广播,所以不需要做负载均衡
- Available Cluster:选择一个可以使用的服务提供者进行调用
- Mergeable Cluster:依次调用所有invokers, 并通过使用一个merger进行结果合并处理以返回结果。
- Failover Cluster : 失败自动切换重试,当服务消费方调用服务提供者失败后,会自动切换到其他服务提供者服务器进行重试,这通常用于读操作或者具有幂等的写操作。需要注意的是,重试会带来更长延迟。可以通过
自定义集群容错策略
-
除了以上默认提供的容错方式,如果有定制化需求,可以根据Dubbo提供的扩展接口Cluster进行定制
-
实现
Cluster接口package com.alibaba.dubbo.spi; import com.alibaba.dubbo.rpc.Invoker; import com.alibaba.dubbo.rpc.RpcException; import com.alibaba.dubbo.rpc.cluster.Cluster; import com.alibaba.dubbo.rpc.cluster.Directory; public class LogCluster implements Cluster { @Override public <T> Invoker<T> join(Directory<T> directory) throws RpcException { return new LogClusterInvoker<>(directory); } } -
创建
LogClusterInvokerpublic class LogClusterInvoker<T> extends AbstractClusterInvoker<T> { private static final Logger logger = LoggerFactory.getLogger(LogClusterInvoker.class); public LogClusterInvoker(Directory<T> directory) { super(directory); } @Override protected Result doInvoke(Invocation invocation, List<Invoker<T>> invokers, LoadBalance loadbalance) throws RpcException { checkInvokers(invokers, invocation); //使用负载均衡策略选择一个服务提供者 Invoker<T> invoker = select(loadbalance, invocation, invokers, null); logger.info(String.format("methodName:%s,url:%s,attachments:%s", invocation.getMethodName(), invoker.getUrl(), invocation.getAttachments())); try { //执行远程调用 Result result = invoker.invoke(invocation); logger.info(String.format("result:%s,attachments:%s", result.getValue(), result.getAttachments())); return result; } catch (Throwable e) { if (e instanceof RpcException && ((RpcException) e).isBiz()) { throw (RpcException) e; } throw new RpcException(e); } } } -
在
src/main/resources/META-INF/dubbo目录下创建com.alibaba.dubbo.rpc.cluster.Cluster文件,内容如下log=com.alibaba.dubbo.spi.LogCluster -
在Consumer端配置
<dubbo:reference id="demoService" check="false" interface="

最低0.47元/天 解锁文章
448

被折叠的 条评论
为什么被折叠?



