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=8002
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>
  • 修改application.properties,加入以下内容
management.endpoints.web.exposure.include=*
management.endpoints.web.cors.allowed-origins=*
management.endpoints.web.cors.allowed-methods=*
  • 重新启动,访问http://localhost:8003/hystrix,便看到以下界面:
     
    16204070-09c94061cdef71b3.png
    hystrix dashboard界面

    按图中所示进行操作,点击Monitor Stream,进入以下页面:
     
    16204070-890afeb9888ee70b.png
    监控界面

    以上就是Hystrix断路器的使用。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值