SpringCloud 2.0 之 Hystrix

2018-08-29  本文已影响0人  rommy020

Hystrix 介绍

中文名: "豪猪",豪猪周身长满了刺,能保护自己不受天敌的伤害, 代表了一种防御机制, 因此Netflix团队将该框架命名为Hystrix.


Hystrix.png

为什么要用Hystrix:

在一个分布式系统里,许多依赖不可避免的会调用失败,比如超时、异常等,如何能够保证在一个依赖出问题的情况下,不会导致整体服务失败,这个就是Hystrix需要做的事情。Hystrix提供了熔断、隔离、Fallback、cache、监控等功能,能够在一个、或多个依赖同时出现问题时保证系统依然可用。

如何使用:

使用非常简单, 只需要2步:
1: 引入依赖

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

2: 在启动类上增加@EnableCircuitBreaker

下面我们对Hystrix的具体功能加以讲解:

1: 服务降级

服务降级是指server端不能正常服务的时候, 可以使用服务降级, 内部服务问题(RuntimeException)的也可以降级, 降级到自己的处理方法中.

HystrixController.java

import com.netflix.hystrix.contrib.javanica.annotation.DefaultProperties;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

@RestController
@DefaultProperties(defaultFallback = "defaultFallback") //如果没有在降级的方法中指定fallbackMethod, 就使用default的
public class HystrixController {
    //当http://localhost:8083/getProduct不可访问的时候, 发生降级

    //@HystrixCommand(fallbackMethod = "fallback")
    @HystrixCommand
    @GetMapping("/getProductList")
    public String getProductList(){
        RestTemplate restTemplate = new RestTemplate();
        String result = restTemplate.getForObject("http://localhost:8083/getProduct", String.class);

        return result;
    }

    private String fallback(){
        return "请稍后再试~~~";
    }

    private String defaultFallback(){
        return "默认fallback,请稍后再试~~~";
    }
}

2: 超时

当访问的服务需要很久的时候, 就可以设置, 当超时的时候如何处理), 下面可以设置超时的时间, 可以通过注解实现和yml实现
a:在方法上增加注解

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

b: 在application.yml中配置

hystrix:
  commond:
    default:
      execution:
        isolation:
          thread:
            timeoutInMilliseconds: 2000

3: 熔断

在一定时间内,用户请求超过一定的比例失败时(timeout, failure, reject),断路器就会打开;短路器打开后所有请求直接走fallback

enter code here
@HystrixCommand(commandProperties = {
        @HystrixProperty(name="execution.isolation.thread.timeoutInMilliseconds", value="1000"),
        @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("/getProductList2")

4: 和Feign结合

feign.hystrix.enabled = true

Hystrix的可视化

1: 在启动类上增加
@EnableHystrixDashboard

2: 引入依赖

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

3: yml中增加

management:
  endpoints:
    web:
      exposure:
        include: "*"

4: 浏览器中输入
http://localhost:8085/hystrix
5: 输入
http://localhost:8085/actuator/hystrix.stream
2000, title(随便写)

6: 就可以进入到监控画面


HystrixDashboard.jpg
上一篇下一篇

猜你喜欢

热点阅读