springcloud笔记四hystrix

Posted 今夜月色很美

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了springcloud笔记四hystrix相关的知识,希望对你有一定的参考价值。

一、服务降级(服务提供者)

1.pom.xml

		<dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
        </dependency>

2.启动类添加@EnableCircuitBreaker注解

3.需要服务降级的方法上添加@HystrixCommand

@HystrixCommand(fallbackMethod = "paymentInfo_timeout_handler", commandProperties = {
            @HystrixProperty(name="execution.isolation.thread.timeoutInMilliseconds", value = "2000")
    })

4.提供触发服务降级条件或发生异常时的执行方法

public String paymentInfo_timeout_handler(Long id){
        return "线程:" + Thread.currentThread().getName() + " 系统繁忙请稍后再试,id:" + id + ",hystrix兜底处理";
    }

二、服务降级(服务消费者)

1.pom.xml

		<dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
        </dependency>

2.yaml文件

feign:
  hystrix:
    enabled: true
  client:
    config:
      default:
        ReadTimeout: 15000
        ConnectTimeout: 15000   #设置ribbon超时时间
hystrix:
  command:
    default:
      execution:
        isolation:
          thread:
            timeoutInMilliseconds: 15000 # 设置hystrix的超时时间

3.启动类添加@EnableHystrix注解

4.在需要进行服务降级的调用接口上添加@HystrixCommand

@HystrixCommand(fallbackMethod = "paymentInfo_timeout_fallback", commandProperties = {
            @HystrixProperty(name="execution.isolation.thread.timeoutInMilliseconds", value = "9000")
    })

5.提供触发服务降级条件或调用发生异常时的执行方法

public String paymentInfo_timeout_fallback(@PathVariable("id") Long id){
        return "我是订单模块80,支付模块业务繁忙请稍后再试" + id;
    }

6.注意:hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds和ribbon超时时间默认都是1s,网上有人说只需要配置其中一个,但是本人测试,这两块配置少了任何一个,调用时间超过1s后都会触发服务降级

三、全局服务降级DefaultProperties

1.在接口类上添加注解@DefaultProperties

@DefaultProperties(defaultFallback = "global_fallback")

2.提供触发服务降级时执行的方法

	public String global_fallback(){
        return "全局异常服务降级处理";
    }

3.在需要服务降级的接口上添加@HystrixCommand注解,默认触发服务降级时,即会执行全局服务降级处理方法。

四、通配服务降级

1.提供FeignClient接口的实现类(服务降级处理类)

@Component
public class OrderServiceImpl implements OrderService {
    @Override
    public String paymentInfo(Long id) {
        return "paymentIfo fall back 在服务上配置服务降级";
    }

    @Override
    public String paymentInfo_timeout(Long id) {
        return "paymentIfo time out fall back 在服务上配置服务降级";
    }
}

2.定义@FeignClient的fallback属性指向服务降级处理类

@FeignClient(value = "CLOUD-PROVIDER-HYSTRIX-PAYMENT", fallback = OrderServiceImpl.class)

五、服务熔断

熔断打开:断路器配置以后默认处于closed状态,达到熔断条件后,进入open状态,请求不再调用当前服务,内部设置一般为MTTR(平均故障处理时间,默认5s),当打开长达到所设时钟则进入half open
熔断关闭:熔断关闭不会对服务进行熔断
熔断半开:部分请求根据规则调用当前服务,如果请求成功且符合规则则认为当前服务恢复正常,关闭熔断

模拟代码如下:

@HystrixCommand(fallbackMethod = "paymentCircutHandler", commandProperties = {
            @HystrixProperty(name="circuitBreaker.enabled", value = "true"),  //是否开启断路器
            @HystrixProperty(name="circuitBreaker.requestVolumeThreshold", value = "10"),  //请求次数
            @HystrixProperty(name="circuitBreaker.sleepWindowInMilliseconds", value = "10000"),  //时间窗口期
            @HystrixProperty(name="circuitBreaker.errorThresholdPercentage", value = "60"),   //失败率达到多少后跳闸
    })
    @GetMapping("/payment/hystrix/circut/{id}")
    public String paymentCircutBreaker(@PathVariable Long id){
        if (id < 0){
            throw new RuntimeException("id不合法");
        }
        String result = "线程:" + Thread.currentThread().getName() + " 调用成功,流水号:" + IdUtil.simpleUUID();
        log.info("******result:{}", result);
        return result;
    }

    public String paymentCircutHandler(Long id){
        return "id不合法,请稍后再试";
    }

Hystrix断路器三个重要指标参数

1、circuitBreaker.sleepWindowInMilliseconds

断路器的快照时间窗,也叫做窗口期。可以理解为一个触发断路器的周期时间值,默认为10秒(10000)。

2、circuitBreaker.requestVolumeThreshold

断路器的窗口期内触发断路的请求阈值,默认为20。换句话说,假如某个窗口期内的请求总数都不到该配置值,那么断路器连发生的资格都没有。断路器在该窗口期内将不会被打开。

3、circuitBreaker.errorThresholdPercentage

断路器的窗口期内能够容忍的错误百分比阈值,默认为50(也就是说默认容忍50%的错误率)。打个比方,假如一个窗口期内,发生了100次服务请求,其中50次出现了错误。在这样的情况下,断路器将会被打开。在该窗口期结束之前,即使第51次请求没有发生异常,也将被执行fallback逻辑。

六、Hystrix图形化dashboard

hystrix dashboard项目模块搭建

pom.xml

		<dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId>
        </dependency>

启动类

添加@EnableHystrixDashboard注解

dashboard项目启动后浏览器打开监控页面

http://localhost:9001/hystrix

添加被监控项目

http://localhost:8008/hystrix.stream

注意

根据尚硅谷课程讲解,由于springcloud的坑,在被监控项目启动类中需要添加如下代码

@Bean
    public ServletRegistrationBean getServlet(){
        HystrixMetricsStreamServlet streamServlet = new HystrixMetricsStreamServlet();
        ServletRegistrationBean registrationBean = new ServletRegistrationBean(streamServlet);
        registrationBean.setLoadOnStartup(1);
        registrationBean.addUrlMappings("/hystrix.stream");
        registrationBean.setName("HystrixMetricsStreamServlet");
        return registrationBean;
    }

以上是关于springcloud笔记四hystrix的主要内容,如果未能解决你的问题,请参考以下文章

SpringCloud四:hystrix-propagation

SpringCloud学习--- Hystrix详解(附代码包)

SpringCloud学习--- Hystrix详解(附代码包)

SpringCloud学习笔记——Hystrix

SpringCloud第二季之Hystrix,GateWay,Config以及Bus学习笔记

SpringCloud第二季之Hystrix,GateWay,Config以及Bus学习笔记