SpringCloud不归路——Hystrix

Hystix是Netflix开源的一个延迟和容错库,用于隔离访问远程服务、第三方库,防止出现级联失败。

 

 

 

雪崩问题

问题描述:A调用了B,C,D;但是B的响应比较慢,当大量请求访问的时候请求会堆积在B的地方,日积月累内存占用率过高,导致崩溃。

解决方式:

  • 线程隔离
    Hystrix为每个依赖服务调用分配一个小的线程池,如果线程池已满调用将被立即拒绝;默认不使用排队,加速失败判定时间。用户的请求将不再直接访问服务,而是通过线程池的空闲线程进行访问,如果线程池已满,或请求超时,则会进行服务降级处理;即优先保证核心服务,而非核心服务不可用或弱可用,服务降级最多影响当前服务,不会造成宕机。
     
  • 服务熔断

熔断配置使用

  1. pom引用

     <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
            </dependency>
  2. 配置更改

    可以不做设置
  3. 开启熔断

    在启动类上加@EnableCircuitBreaker注解
  4. 熔断使用

    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:
command:
default:
      execution:
        isolation:
          thread:
            timeoutInMillisecond: 6000 # 设置hystrix的超时时间为6000ms


熔断的恢复

三个状态:

Closed:关闭状态,所有请求都正常访问

Open:打开状态,所有请求都会被降级。Hystrix会对请求情况技术,当一定时间内失败的请求百分比达到阈值,则触发熔断,断路器会完全打开。默认失败比例的阈值是50%,请求次数最少不低于20次。

Half Open:半开状态,open状态不是永久的,打开后会进入休眠时间(默认是5S),随后断路器会自动进入半开状态。此时会释放部分请求通过,若这些请求都是健康的,则完全关闭断路器,否则继续保持打开,再次进入休眠倒计时。

配置文件修改默认配置:

circuitBreaker.requestVolumeThreshold=10,触发熔断的最小请求次数;默认20

circuitBreaker.sleepWindowInMilliseconds=10000,休眠时长,默认5000毫秒

circuitBreaker.errorThresholdPercentage=50,触发熔断的失败请求最小占比,默认50%

posted @ 2020-12-01 19:52  别无所求---  阅读(115)  评论(0编辑  收藏  举报