开发者学堂课程【阿里巴巴分布式服务框架 Dubbo 快速入门:重试次数】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/624/detail/9475
服务容错&;Hystrix
内容简介:
一、集群容错
二、集群容错模式
三、集群模式配置
四、整合 Hystrix
五、进行测试
一、集群容错
在集群调用失败时,Dubbo 提供了多种容错方案,缺省为 fallover 重试。
二、集群容错模式
1、Failover Cluster:
失败自动切换,例如 A 服务调 B 服务,当 B 服务超时后,配置一个重试次数 retries=“2”,可以重新切换到能提供 B 服务的其他机器。
2、Failfast Cluster:
快速失败,只发起一次调用,失败即立即报错,通常用于非幂等性的写操作,比如新增记录。
3、Failsafe Cluster:
失败安全,出现异常时,直接忽略。通常勇于写入审计日志等操作。
4、Failback Cluster:
失败自动恢复,后台记录失败请求,定时重发。通常用于消息通知操作,一次成功调用的操作。
5、Forking Cluster:
并行调用多个服务器,只要一个成功即返回。通常用于实时性要求较高的读操作,但需要浪费更多服务资源。可通过 forks=“2”来设置最大并行数。
6、Broadcast Cluster:
广播调用所有提供者,逐个调用,任意一台报错则报错。通常用于通知所有提供者更新缓存或日志等本地资源信息。
三、集群模式配置
按照以下示例在服务提供方和消费方配置集群模式:
<dubbo:service cluster=”failsafe”/>
或<dubbo:reference cluster=”failsafe:/>
,标签中不写默认为失败自动切换。
四、整合 Hystrix
Hystrix 旨在通过控制那些访问远程系统、服务和第三方库的节点,从而对延迟和故障提供更强大的容错能力。
Hystrix 具备拥有回退机制和断路器功能的线程和信号隔离,请求缓存和请求打包,以及监控和被指等功能。(此技术的详细细节已在 spring-boot 课程中讲过)
如何用 Hystrix 进行服务容错?
第一步导入 spring-cloud hystix starter 依赖
<dependency>
<groupld>org.springframework.cloud</groupld>
<artifactld>spring-cloud-starter-netflix-hystrix</artifactld>
<version>1 4.4.RELEASE</version>
</dependency>
第二步在 Application 类上增加@EnableHystrix 来启用 hystrix starter:
@SpringBootApplication
@EnableHystrix
public class ProviderApplication {
五、进行测试
1、在服务提供者处导入相关依赖
首先编辑 Edit starters 功能,选中 spring-cloudery 里的短路保护(如下两张图)
第二步开启服务容错:@EnableHystrix
第三步提供的服务,获取用户地址列表的,让其超时,服务可能在运行期间出现异常,判断是否出现异常,代码为
if(Math.random()>0.5){
throw new RuntimeException();
}
服务可能会不定期出现异常,若出现异常,只需要将方法写上注解,代码为@HystrixCommand
,如果出现异常就可以直接进行补错。
2、启动提供者
如果出现错误,也是远程调用出现错误,解决方法为:在调用消费者中也导入 Edit Starter,同时在 BootOrderServiceConsumer 加上服务容错的功能,代码为@EnableHystrix
,
也在 OrderServiceImpl.java 中加上注解。
代码为:
@ HystrixCommand(fallbackMethod=“hello“)
//有一个hello方法进行容错
public Listhello (String userId) {
//TODO Auto- generated method stub
//出错的时候进行调用
return Arrays.asList(new UserAddress(10,”测试地址”,“1“,”测试“,”测试“,isDefault)
//出错时返回另外一个用户
3、启动消费者
由于远程调用 userService 有可能出错,多次调用,看出错了是否能走 hello 方法,多次刷新,测试结果有正确的,也有出错的,因此可以用 Hystrix 方便地模拟出,方法出错之后,会返回什么效果。