zoukankan      html  css  js  c++  java
  • 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%

  • 相关阅读:
    深度学习
    !gcc !vi
    条件、循环及其他语句
    当索引行不通时
    我的排班日期
    Linux使用storcli工具查看服务器硬盘和raid组信息
    storcli64和smartctl定位硬盘的故障信息
    Shell-四剑客
    iostat
    /VAR/LOG/各个日志文件分析
  • 原文地址:https://www.cnblogs.com/sheng-se/p/14070374.html
Copyright © 2011-2022 走看看