一、服务熔断介绍
1.1 服务雪崩
在微服务架构中,服务与服务之间通过远程调用的方式进行通信,一旦某个被调用的服务发生了故障,依赖其的服务也会发生故障,此时就会发生故障的蔓延,最终导致系统瘫痪,这就是所谓的”雪崩效应”。
1.2 服务熔断
熔断机制是应对雪崩效应的一种微服务链路保护机制。当链路的某个微服务不可用或者响应时间太长时,会进行服务的降级,进而熔断该节点微服务的调用,快速返回”错误”的响应信息。当检测到该节点微服务响应正常后,重新恢复调用链路。
二、Hystrix
2.1 Hystrix 介绍
Hystrix 是一个用于分布式系统的延迟和容错的开源库。Hystrix 实现了断路器模式,当某个服务发生故障时,通过断路器的监控,给调用方返回一个错误响应,而不是长时间的等待,这样就不会使得调用方由于长时间得不到响应而占用线程,从而防止故障的蔓延。Hystrix 具备服务降级、服务熔断、线程隔离、请求缓存、请求合并及服务监控等强大功能。
2.2 Hystrix 使用方法
通过在方法上使用注解 @HystrixCommand ,常用参数:
* fallbackMethod:指定服务降级处理方法;
* ignoreExceptions:忽略某些异常,不发生服务降级;
* commandKey:命令名称,用于区分不同的命令;
* groupKey:分组名称,Hystrix会根据不同的分组来统计命令的告警及仪表盘信息;
* threadPoolKey:线程池名称,用于划分线程池。
二、服务降级实例
注:本实例在 ribbon-service 项目基础上演示。
2.1 在 pom 文件中新增 Hystrix 依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
2.2 开启断路器功能
在 RibbonServiceApplication 中添加 @EnableCircuitBreaker 注解启用 Hystrix 断路器功能
@EnableCircuitBreaker
@SpringBootApplication
public class RibbonServiceApplication {
......
}
2.3 新增失败降级回调方法
@RestController
public class UserRibbonController {
@Value("${service-url.user-service}")
private String userServiceUrl;
private final RestTemplate restTemplate;
public UserRibbonController(RestTemplate restTemplate) {
this.restTemplate = restTemplate;
}
@GetMapping("/get/{username}")
@HystrixCommand(fallbackMethod = "fallbackMethod")
public User getUser(@PathVariable String username) {
return restTemplate.getForObject(userServiceUrl + "/user/{1}", User.class, username);
}
public User fallbackMethod(@PathVariable String username) {
return new User("服务调用失败");
}
}
2.4 启动服务
访问 http://localhost:8210/user/get/marklogzhu
,返回如下 JSON 数据:
{
username: "marklogzhu"
}
停止 user-service ,再次访问 http://localhost:8210/user/get/marklogzhu
,返回如下 JSON 数据:
{
username: "服务调用失败"
}
可以发现已经发生了服务降级。