Dubbo高可用之集群容错
集群容错类型
在集群调用失败时,Dubbo 提供了多种容错方案,缺省为 failover 重试。
1)Failover Cluster
失败自动切换,当出现失败,重试其它服务器。通常用于读操作,但重试会带来更长延迟。可通过 retries="2" 来设置重试次数(不含第一次)。
2)Failfast Cluster
快速失败,只发起一次调用,失败立即报错。通常用于非幂等性的写操作,比如新增记录。
3)Failsafe Cluster
失败安全,出现异常时,直接忽略。通常用于写入审计日志等操作。
4)Failback Cluster
失败自动恢复,后台记录失败请求,定时重发。通常用于消息通知操作。
5)Forking Cluster
并行调用多个服务器,只要一个成功即返回。通常用于实时性要求较高的读操作,但需要浪费更多服务资源。可通过 forks="2" 来设置最大并行数。
6)Broadcast Cluster
广播调用所有提供者,逐个调用,任意一台报错则报错。通常用于通知所有提供者更新缓存或日志等本地资源信息。
可以通过 broadcast.fail.percent 配置节点调用失败的比例,当达到这个比例后,BroadcastClusterInvoker 将不再调用其他节点,直接抛出异常。 broadcast.fail.percent 取值在 0~100 范围内。默认情况下当全部调用失败后,才会抛出异常。 broadcast.fail.percent 只是控制的当失败后是否继续调用其他节点,并不改变结果(任意一台报错则报错)。broadcast.fail.percent 参数 在 dubbo2.7.10 及以上版本生效。
Broadcast Cluster 配置 broadcast.fail.percent。
broadcast.fail.percent=20 代表了当 20% 的节点调用失败就抛出异常,不再调用其他节点。
集群容错可选值
- failover:失败重试其他服务器
- failfast:只发起一次调用,失败立即报错
- failsafe:出现异常直接忽略
- failback:失败定时重发
- forking:并行调用多个服务器,有一个成功即可
- broadcast:所有提供者逐个调用,任意一台报错则报错
集群容错演示
1、dubbo-samples-xml-provider
dubbo-provider.xml
<!--具体为某个方法设置超时时间-->
<dubbo:service interface="com.harvey.samples.client.OrderService" ref="orderServiceImpl"
protocol="dubbo" group="one">
<dubbo:method name="getOrderInfo" timeout="5000"/>
</dubbo:service>
OrderServiceImpl.java
private AtomicLong atomicLong = new AtomicLong();
@Override
public Order getOrderInfo(long orderId) throws InterruptedException {
System.out.println("调用第" + atomicLong.incrementAndGet() + "次");
RpcContext rpcContext = RpcContext.getContext();
System.out.println("当前调用的服务端口:" + rpcContext.getLocalPort() + ", 获取订单:" + orderId);
//休眠,主要是让服务提供者的超时时间生效,超时触发了消费者的重试机制
TimeUnit.SECONDS.sleep(6);
return orderMap.get(orderId);
}
2、dubbo-samples-xml-consumer
ConsumerStarter.java
public class ConsumerStarter {
public static void main(String[] args) throws IOException, InterruptedException {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[]{"spring/dubbo-consumer.xml"});
context.start();
System.out.println("consumer start.....");
//dubbo
OrderService orderService1 = context.getBean("orderService", OrderService.class);
System.out.println("接口:getOrderInfo");
System.out.println("SUCCESS: got getOrderInfo " + orderService1.getOrderInfo(10L));
}
}
dubbo-consumer.xml
1)failsafe
<dubbo:reference id="orderService" interface="com.harvey.samples.client.OrderService" protocol="dubbo" group="one"
cluster="failsafe" />
输出日志:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!