这篇文章,主要介绍微服务组件之Hystrix实现服务降级和服务熔断。
目录
一、服务降级
1.1、什么是服务降级
1.2、实现服务降级
(1)引入依赖
(2)编写Service层代码
(3)编写Controller层代码
(4)运行测试
(5)fallbackMethod属性
二、服务熔断
2.1、什么是服务熔断
2.2、实现服务熔断
(1)引入依赖
(2)编写Service层代码
(3)编写Controller层代码
(4)运行测试
一、服务降级
1.1、什么是服务降级
服务降级:发生在客户端侧,当某个微服务自身出现大量的请求,从而没办法处理过来的时候,这个时候可以采取某种策略,将那些不重要的请求直接中断,返回事先定义好的fallback方法(可以叫做兜底方法),这样就可以为那些核心业务接口提供更多的资源。
服务降级是最简单的一种实现方式,那什么情况下会出发服务降级呢???
- 第一种情况:当出现【HystrixBadRequestException】之外的异常时候,就会触发服务降级。
- 第二种情况:当接口方法调用超时,触发服务降级。
- 第三种情况:熔断器开启的时候。
- 第四种情况:线程池、队列、信号量已经达到最大值的时候。
1.2、实现服务降级
(1)引入依赖
<!--hystrix 依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
(2)编写Service层代码
- 在service层中需要开启服务降级的方法上面,使用【@HystrixCommand】注解,并且通过【fallbackMethod】属性指定降级之后的兜底方法。
package com.gitcode.hystrix.service;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import org.springframework.stereotype.Service;
/**
* @version 1.0.0
* @Date: 2023/4/10 21:47
* @Author ZhuYouBin
* @Description 服务降级
*/
@Service
public class HystrixFallbackService {
/**
* 标记当前方法开启服务降级
*/
@HystrixCommand(fallbackMethod = "reductionGradeFallback")
public String reductionGrade(String id) {
if (id.equals("1001")) {
throw new RuntimeException("模拟业务异常");
}
System.out.println("模拟调用其他微服务接口......");
return "success.";
}
/**
* fallback 方法,必须和 @HystrixCommand 注解标记的方法具备相同的【参数列表】、【返回值类型】
*/
private String reductionGradeFallback(String id) {
System.out.println("服务降级,请稍后重试!");
return "服务降级,请稍后重试!";
}
}
(3)编写Controller层代码
package com.gitcode.hystrix.controller;
import com.gitcode.hystrix.service.HystrixFallbackService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @version 1.0.0
* @Date: 2023/4/10 21:46
* @Author ZhuYouBin
* @Description 服务降级
*/
@RestController
@RequestMapping("/hystrix/fallback")
public class HystrixFallbackController {
@Autowired
private HystrixFallbackService hystrixFallbackService;
@GetMapping("/reduce")
public String reductionGrade(String id) {
return hystrixFallbackService.reductionGrade(id);
}
}
(4)运行测试
启动工程,浏览器访问【http://127.0.0.1:9898/hystrix/fallback/reduce?id=1001】时候,此时会抛出异常,触发服务降级功能;修改id为其他的值,可以正常调用。
(5)fallbackMethod属性
fallbackMethod属性用于指定服务降级或者熔断之后,调用的备选方法,在这个方法里面,我们可以根据具体的业务场景返回一些模拟数据。例如:当接口出现降级或者熔断之后,可以从缓存里面、从数据库里面查询备选数据,返回给客户端。fallbackMethod 属性指定的方法必须满足下面这些规则:
- 1. 方法必须和 @HystrixCommand 注解标记的方法在【同一个类】里面。
- 2. 方法的【参数列表】必须和 @HystrixCommand 注解标记的方法参数列表相同。
- 3. 方法的【返回值类型】必须和 @HystrixCommand 注解标记的方法返回值相同。
二、服务熔断
2.1、什么是服务熔断
服务熔断:发生在服务端侧,当某个微服务出现故障导致服务不可用的时候,此时调用端服务发现服务不可用,此时就会开启熔断机制,阻断所有请求服务端的请求,直接返回事先定义好的fallback方法。
服务熔断,就像是电路中的保险丝一样,当发现下游系统服务不可用的时候,此时hystrix就会开启熔断器,阻断所有调用下游系统的接口,直接返回fallback方法。如果没有设置fallback方法,则会执行默认的返回策略。
熔断器机制,hystrix提供了熔断器,它的工作原理大致如下所示:
- 当调用下游服务接口正常时候,不会开启熔断器机制。
- 当调用下游服务接口的次数超过20个,并且接口调用失败率超过50%,那么此时就会开启熔断器。
- 一旦熔断器开启之后,微服务就不会继续调用下游系统接口,而是直接返回fallback指定的兜底方法(默认指定就执行默认的方式)。
- 但是熔断器不能一直处于熔断状态,必须有重新开启的时候,所以hystrix会默认每隔【5秒】尝试调用下游系统,判断下游系统服务是否可用。
- 当hystrix发现下游系统服务重新可用的时候,此时就会关闭熔断器。
服务降级和服务熔断都可以使用一个事先准备好的fallback方法,这就相当于是一个后备方案,只不过这个方案不是正确的业务结果,但是通过这种方式,可以提高系统的可用性,为什么可以提高性能呢?可以这么想,因为每次请求到达服务器之后,都是直接返回fallback的结果,而不需要发起一个HTTP请求去调用另外一个微服务,所以这就减少了请求的次数。
2.2、实现服务熔断
(1)引入依赖
<!--hystrix 依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
(2)编写Service层代码
package com.gitcode.hystrix.service;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixProperty;
import com.netflix.hystrix.contrib.javanica.conf.HystrixPropertiesManager;
import org.springframework.stereotype.Service;
import java.time.LocalDateTime;
/**
* @version 1.0.0
* @Date: 2023/4/10 21:47
* @Author ZhuYouBin
* @Description 服务熔断
*/
@Service
public class HystrixCircuitBreakerService {
/**
* 标记当前方法开启服务降级
*/
@HystrixCommand(
commandProperties = {
// 启用熔断器
@HystrixProperty(name = HystrixPropertiesManager.CIRCUIT_BREAKER_ENABLED, value = "true"),
// 设置请求线程数量,默认是20个时候,发生熔断,这设置成5个
@HystrixProperty(name = HystrixPropertiesManager.CIRCUIT_BREAKER_REQUEST_VOLUME_THRESHOLD, value = "5"),
// 请求线程失败的比率,默认是大于50%时候发生熔断
@HystrixProperty(name = HystrixPropertiesManager.CIRCUIT_BREAKER_ERROR_THRESHOLD_PERCENTAGE, value = "50"),
// 熔断机制重试策略的时间间隔,默认是5秒重试一次
@HystrixProperty(name = HystrixPropertiesManager.CIRCUIT_BREAKER_SLEEP_WINDOW_IN_MILLISECONDS, value = "5"),
},
fallbackMethod = "circuitBreakFallback"
)
public String circuitBreaker(String id) {
if (id.equals("1001")) {
throw new RuntimeException("模拟业务异常");
}
System.out.println("模拟调用其他微服务接口......当前时间:" + LocalDateTime.now());
return "success.";
}
/**
* fallback 方法,必须和 @HystrixCommand 注解标记的方法具备相同的【参数列表】、【返回值类型】
*/
private String circuitBreakFallback(String id) {
System.out.println("服务熔断降级,请稍后重试!");
return "服务熔断降级,请稍后重试!";
}
}
(3)编写Controller层代码
package com.gitcode.hystrix.controller;
import com.gitcode.hystrix.service.HystrixCircuitBreakerService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @version 1.0.0
* @Date: 2023/4/10 21:46
* @Author ZhuYouBin
* @Description 服务熔断
*/
@RestController
@RequestMapping("/hystrix/fallback")
public class HystrixCircuitBreakerController {
@Autowired
private HystrixCircuitBreakerService service;
@GetMapping("/breaker")
public String circuitBreaker(String id) {
return service.circuitBreaker(id);
}
}
(4)运行测试
启动工程,浏览器访问【http://127.0.0.1:9898/hystrix/fallback/breaker?id=1001】,多访问几次,此时会导致hystrix开启熔断器,然后在访问id不是1001的请求,查看控制台输出结果。
到此,Hystrix中服务降级和服务熔断功能就介绍完啦。
综上,这篇文章结束了,主要介绍微服务组件之Hystrix实现服务降级和服务熔断。