• 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%

  • 相关阅读:
    poj 1182:食物链(种类并查集,食物链问题)
    hdu 1556:Color the ball(第二类树状数组 —— 区间更新,点求和)
    南阳理工 题目9:posters(离散化+线段树)
    poj 1195:Mobile phones(二维树状数组,矩阵求和)
    poj 3984:迷宫问题(广搜,入门题)
    poj 3278:Catch That Cow(简单一维广搜)
    《重构与模式》简化(策略模式)-积木系列
    builder模式-积木系列
    spring事务管理-Spring 源码系列(6)
    思考如何阅读
  • 原文地址:https://www.cnblogs.com/sheng-se/p/14070374.html
Copyright © 2020-2023  润新知