05 使用Hystrix断路器

当一个服务不能使用时,该服务的调用者应该及时收到消息,而不是过一阵才收到服务未响应,这就是Hystrix断路器的作用。Hystrix断路器有两种级别,一种是某一个方法提供断路,另一种是某个接口中的方法全部提供断路。本文将介绍断路器的使用。

1、环境约束

  • win10 64为操作系统
  • idea2018.1.5
  • maven-3.0.5
  • jdk-8u162-windows-x64

2、前提约束

3、操作步骤

3.1 方法断路

  • 创建一个springcloud项目,包括springweb、eureka client、feign、hystrix模块,关键依赖如下:
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>

注意:springboot的版本是2.1.8.RELEASE,springcloud的版本是Greenwich.SR2

  • 设置application.properties
server.port=8003
eureka.client.service-url.defaultZone=http://localhost:7561/eureka
spring.application.name=consumer-service
  • 在主启动类上面出@SpringBootApplication外加入以下注解:
@EnableEurekaClient
@EnableFeignClients
@EnableHystrix
  • 在主启动类同级目录下,创建ProviderClient.java
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;


@FeignClient(value="user-service")//此处user-service就是笔者provider的服务名称
public interface ProviderClient {

    @GetMapping("/query")//此处/query就是憋着provider中的接口名称
    String provider();
}
  • 在主启动类同级目录下,创建ConsumerController.java

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

import javax.annotation.Resource;

@RestController
public class ConsumerController {

    @Resource
    private ProviderClient providerClient;

    @GetMapping("/consumer")
    @HystrixCommand(fallbackMethod = "handler")
    public String consumer() {
        //当provider服务挂掉以后,这个方法会进入断路处理        
        return providerClient.provider();
    }

    @GetMapping("/consumer1")
    public String consumer1() {
        //当provider服务挂掉以后,这个方法不会进入断路处理
        return providerClient.provider();
    }

    public String handler() {
        return "providerClient中的服务不能访问到,hystrix被触发";
    }
}
  • 测试
    (1)当provider启动成功,访问consumer以及consumer1接口都成正常访问。
    (2)当provider没有启动,访问consumer接口将立刻执行handler方法,访问consumer1接口将进入异常。

3.2 接口断路

  • 以操作完毕3.1为基础,在主启动类同级目录下创建ProviderClient1.java
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;


@FeignClient(value="provider-service",fallbackFactory = HystrixFactory.class)
public interface ProviderClient1 {
    @GetMapping("/query")
    public String provider();
}
  • 在主启动类统计目录下创建ConsumerController1.java
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;

@RestController
public class ConsumerController1 {
    @Resource
    private ProviderClient1 providerClient;

    @GetMapping("/consumer3")
    public String consumer() {
        return providerClient.provider();
    }

    @GetMapping("/consumer4")
    public String consumer1() {
        return providerClient.provider();
    }
}
  • 在主启动类同级目录下创建HystrixFactory.java
import feign.hystrix.FallbackFactory;
import org.springframework.stereotype.Component;

@Component
public class HystrixFactory implements FallbackFactory<ProviderClient1> {
    @Override
    public ProviderClient create(Throwable throwable) {
        return new ProviderClient1() {
            @Override
            public String provider() {
                return "provider-service服务不能访问,hystrix被触发";
            }
        };
    }
}
  • 修改application.properties,加入以下内容:
feign.hystrix.enabled=true
  • 重启,测试
    (1)当provider启动成功,访问consumer3以及consumer4接口都成正常访问。
    (2)当provider没有启动,访问consumer4以及consumer4接口都将立刻执行handler方法。

3.3 dashboard

hystrix有一个监控页面,需要借助actuator监控模块实现。

  • 以操作完毕3.2为基础,加入以下依赖
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId>
        </dependency>
  • 在主启动类加入dashboard开关
@EnableHystrixDashboard
  • 修改application.properties,加入以下内容
management.endpoints.web.exposure.include=*
management.endpoints.web.cors.allowed-origins=*
management.endpoints.web.cors.allowed-methods=*
  • 重新启动,访问http://localhost:8003/hystrix,便看到以下界面:
    hystrix dashboard界面

    按图中所示进行操作,点击Monitor Stream,进入以下页面:
    监控界面

    以上就是Hystrix断路器的使用。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容