Dubbo 集群容错
前言
大家好,今天开始给大家分享 — Dubbo 专题之 Dubbo 集群容错。那么我们首先得知道什么是集群?一般我们在微服务应用中都是多实例部署,也就是说同一份代码部署多台机器或容器中,这样做的好处是提高服务处理能力。同时由于集群部署,所以整个集群也有容错的能力。那么什么是容错呢?其实可以这样简单的理解:当我们在调用集群中一个实例时出错,我们可以重试另外一个实例这样大大提高了应用的可靠性。假设我们没有容错处理能力那么即使有集群的部署我们在调用应用失败情况下不能重试其他实例,这样可靠性大大降低。
1. 容错简介
那么怎样来做容错处理呢?一般常见的两种方式:第一种是在客户端做一个容错处理、第二种是通过一个中间件来做容错处理。如下图:
第一张图采用的客户端的容错处理,第二张图是采用中间件进行容错处理。从上图中可知道无论采用那种方式,我们都需要知道调用的可用服务的列表然后根据相应的策略去选择服务。我们的Dubbo也是这么来做的。下图来自Dubbo官网:
- 这里的真实
Invoker
是远程服务Provider
暴露的一个可调用Service
的抽象,Invoker
封装了Provider
地址及Service
接口信息。 Directory
代表多个Invoker
,可以把它看成List<Invoker>
,但与List
不同的是,它的值可能是动态变化的,比如注册中心推送变更会更新Directory
。Cluster
将Directory
中的多个Invoker
伪装成一个Invoker
,对上层透明,伪装过程包含了容错逻辑,调用失败后,重试另一个。Router
负责从多个Invoker
中按路由规则选出子集,比如读写分离,应用隔离等LoadBalance
负责从多个Invoker
中选出具体的一个用于本次调用,选的过程包含了负载均衡算法,调用失败后,需要重选
2. 容错模式
在Dubbo中有5种容错模式分别是:
-
Failover Cluster
失败自动切换:当我们在调用Dubbo服务时出现失败,容错策略会重试其它服务器 。
使用场景:对于一些必达性要求高的服务调用,但是服务提供方要求做幂等处理 。
-
Failfast Cluster
快速失败:只发起一次调用,如果调用Dubbo服务失败立即报错。
使用场景:通常用于非幂等性的写操作,比如新增记录。
-
Failsafe Cluster
失败安全:当调用Dubbo服务出现异常时,直接忽略。
使用场景:通常用于运行数据丢失常见,例如:日志记录等操作。
-
Failback Cluster
失败自动恢复:当调用Dubbo服务失败,后台记录失败请求并定时重发。
使用场景:通常用于必达通知场景,例如:消息通知操作。
-
Forking Cluster
集群并行:并行调用多个Dubbo服务,只要其中有一个成功即返回。
使用场景:通常用于从多个源获取相同数据,以获取最快的响应速度,例如:同时从多个备库查询数据。
-
Broadcast Cluster
集群广播:循环调用所有Dubbo服务提供者,任意一台报错则报错。
使用场景:通用用于向多个实例通知消息,例如:更新集群中所有应用缓存或日志。
3. 示例演示
同样我们以获取图书列表为例,代码结构如下:
Tips:我们在配置集群容错模式有两种方式:一种是在消费端配置、另一种是在服务提供者配置。下面分别是消费端配置和服务端配置,两种方式选择一种即可:
消费端配置文件:dubbo-consumer-xml.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:dubbo="http://dubbo.apache.org/schema/dubbo"
xmlns="http://www.springframework.org/schema/beans"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd">
<dubbo:application name="demo-consumer" logger="log4j"/>
<dubbo:registry address="zookeeper://127.0.0.1:2181"/>
<!-- <dubbo:consumer check="false" />-->
<!-- <dubbo:registry check="false" />-->
<!--当cluster="failover"指定集群容错模式-->
<dubbo:reference id="bookFacade"
interface="com.muke.dubbocourse.common.api.BookFacade" cluster="broadcast"></dubbo:reference>
</beans>
服务端配置文件:dubbo-provider-xml.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:dubbo="http://dubbo.apache.org/schema/dubbo"
xmlns="http://www.springframework.org/schema/beans"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd">
<dubbo:application name="demo-provider" metadata-type="remote"/>
<dubbo:registry address="zookeeper://127.0.0.1:2181"/>
<bean id="bookFacade" class="com.muke.dubbocourse.serviceconfig.provider.BookFacadeImpl"/>
<!--暴露本地服务为Dubbo服务 ,当cluster="failover"指定集群容错模式-->
<dubbo:service interface="com.muke.dubbocourse.common.api.BookFacade" ref="bookFacade" cluster="broadcast"/>
</beans>
测试步骤:我们启动com.muke.dubbocourse.clustererror.provider.XmlApplication#main
方法2次,运行2个服务提供者,然后启动一个消费者调用com.muke.dubbocourse.clustererror.provider.BookFacadeImpl#queryAll
,查看2个服务者是否有日志输出。
4. 小结
在本小节中我们主要学习了 Dubbo 中的集群容错,在Dubbo中为我们提供6种集群容错处理方式,它们分别是:Failover Cluster
、Failfast Cluster
、Failsafe Cluster
、Failback Cluster
、Forking Cluster
、Broadcast Cluster
。同时也了解到Dubbo中集群容错的原理。
本节课程的重点如下:
-
理解什么是集群容错
-
了解 Dubbo 中6种集群容错方式
-
了解集群容错原理
-
了解集群容错使用场景
作者
个人从事金融行业,就职过易极付、思建科技、某网约车平台等重庆一流技术团队,目前就职于某银行负责统一支付系统建设。自身对金融行业有强烈的爱好。同时也实践大数据、数据存储、自动化集成和部署、分布式微服务、响应式编程、人工智能等领域。同时也热衷于技术分享创立公众号和博客站点对知识体系进行分享。
博客地址:http://youngitman.tech
微信公众号:
知识星球: