SpringCloud不归路——Hystrix
Hystix是Netflix开源的一个延迟和容错库,用于隔离访问远程服务、第三方库,防止出现级联失败。
雪崩问题
问题描述:A调用了B,C,D;但是B的响应比较慢,当大量请求访问的时候请求会堆积在B的地方,日积月累内存占用率过高,导致崩溃。
解决方式:
- 线程隔离
Hystrix为每个依赖服务调用分配一个小的线程池,如果线程池已满调用将被立即拒绝;默认不使用排队,加速失败判定时间。用户的请求将不再直接访问服务,而是通过线程池的空闲线程进行访问,如果线程池已满,或请求超时,则会进行服务降级处理;即优先保证核心服务,而非核心服务不可用或弱可用,服务降级最多影响当前服务,不会造成宕机。
- 服务熔断
熔断配置使用
-
pom引用
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-hystrix</artifactId> </dependency>
-
配置更改
可以不做设置 -
开启熔断
在启动类上加@EnableCircuitBreaker注解 -
熔断使用
package cn.itcast.service.controller; import cn.itcast.service.feign.TestControllerServer; import cn.itcast.service.pojo.User; import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand; 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.RequestParam; import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping("consumer/user") public class UserController { @Autowired public TestControllerServer testControllerServer; @GetMapping @HystrixCommand(fallbackMethod = "queryUserByIdFullBack") public String queryUserById(@RequestParam("id") long id) { User list = testControllerServer.getUserById(id); return "list"; } public String queryUserByIdFullBack(long id){ return "服务器正忙,请稍后重试"; } }
如果多个方法需要熔断可以在类上使用@DefaultProperties(defaultFallback = "")
指定类的熔断默认方法,在类内方法使用@HystrixCommand如果指定值那么就以指定的为准,若不指定则以类上的为准
总结:
1.引入pom
2.在引导类添加注解
3.定义熔断方法;局部的(返回值、参数列表一致);全局(返回值类型要被熔断的方法一致,参数列表必须为空)
4.@HystrixCommand(fallbackMethod=“熔断方法名”):声明被熔断的方法,如果不指定则使用全局默认的熔断方法
5.@DefaultProperties(defaultFallback=“全局熔断方法名”)
6.
我们可以通过hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds
来设置Hystrix超时时间。
hystrix
熔断的恢复
三个状态:
Closed:关闭状态,所有请求都正常访问
Open:打开状态,所有请求都会被降级。Hystrix会对请求情况技术,当一定时间内失败的请求百分比达到阈值,则触发熔断,断路器会完全打开。默认失败比例的阈值是50%,请求次数最少不低于20次。
Half Open:半开状态,open状态不是永久的,打开后会进入休眠时间(默认是5S),随后断路器会自动进入半开状态。此时会释放部分请求通过,若这些请求都是健康的,则完全关闭断路器,否则继续保持打开,再次进入休眠倒计时。
配置文件修改默认配置:
circuitBreaker.requestVolumeThreshold=10,触发熔断的最小请求次数;默认20
circuitBreaker.sleepWindowInMilliseconds=10000,休眠时长,默认5000毫秒
circuitBreaker.errorThresholdPercentage=50,触发熔断的失败请求最小占比,默认50%