SpringCloud系列:Hystrix熔断器组件的使用

481 阅读4分钟

作者平台:

| CSDN:blog.csdn.net/qq_41153943…

| 掘金:juejin.cn/user/651387…

| 知乎:www.zhihu.com/people/1024…

| GitHub:github.com/JiangXia-10…

| 微信公众号:1024笔记

本文一共2637字,预计阅读9分钟

前言

我们知道在微服务的项目中,Spring Cloud进行接口调用时,一般时需要使用Feign进行接口调用,如果接口之间的调用触发了某个条件,比如某个接口在10秒内产生超过20次请求,并且如果请求的错误百分比大于阈值(比如50%),这时候需要开启一种保护机制,从而保证整个系统的一个可用性。这种机制就是熔断机制,一般使用熔断机制的组件是Hystrix组件。

前面的文章:SpringCloud系列:服务雪崩、服务熔断、服务降级,介绍了微服务相关的服务雪崩、服务熔断以及服务降级的内容。服务熔断和服务降级是处理服务雪崩的有效手段,今天就一起学习Hystrix熔断器组件如何在项目中使用以及一些需要注意的事项,避免踩坑。

什么是Hystrix

Hystrix是一个应用于处理分布式系统的延迟和容错的开源库,在分布式系统里,许多依赖不可避免的会调用失败,比如超时,异常等,Hystrix能够保证在一个依赖出问题的情况下,不会导致整个体系服务失败,避免服务雪崩,从而提高整个分布式系统的弹性。

比如系统中有很多服务,当某些服务不稳定的时候,使用这些服务的用户线程将会阻塞,如果没有隔离机制,系统随时就有可能会挂掉,从而带来很大的风险。SpringCloud使用Hystrix组件提供断路器、资源隔离与自我修复功能。

Hystrix的使用

在一个spring cloud的微服务的项目中使用Hystrix其实很简单,和其他组件的使用一样,首先创建一个基本的springcloud项目,然后引入springcloud以及这里需要的Hystrix相关的依赖,这里主要涉及到的依赖如下:

        <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!--引入consul依赖,用于服务注册发现-->
        <!--Consul Discovery-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-consul-discovery</artifactId>
        </dependency>
        <!--引入健康检查的依赖,用于健康检查监控-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <!--引入hystrix依赖-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
        </dependency>
    </dependencies>

然后需要在application.properties配置文件中配置相关配置,比如端口号,服务名称等等:

server.port=8087
spring.application.name=hystrix

#向consul server 服务注册地址
spring.cloud.consul.host=localhost
spring.cloud.consul.port=8500
spring.cloud.consul.discovery.service-name=${spring.application.name}

在项目中引入了hystrix依赖之后,其实项目就已经具备了服务熔断的功能,这时候只需要在项目启动类上加上@EnableCircuitBreaker注解开启hystrix服务熔断即可,这里的项目启动类如下:

@SpringBootApplication //代表springboot应用
@EnableDiscoveryClient //代表服务注册中心客户端 consul client
@EnableCircuitBreaker //开启hystrix服务熔断
public class HystrixApplication {
    public static void main(String[] args) {
        SpringApplication.run(HystrixApplication.class,args);
    }
}

启动项目,服务已经注册consul:

接下来进行测试。创建一个controller,并且设置请求失败的条件,具体如下:

@RestController
public class DemoController {

    /**
     * @author:江夏
     * @date 2022/7/3 21:34
     * @version 1.0
     * @description: 如果某个时间段内(10s内)20次请求失败或者请求失败比例超过50%,则熔断器打开,5s之后如果请求正确则正确请求,如果还是错误请求,则熔断器继续
     */
    @GetMapping("/demo")//?id=
    //自定义的处理方法
 //   @HystrixCommand(fallbackMethod = "demoFallbackMethod")//熔断之后的处理,fallbackMethod表示失败之后的方法名,即失败之后调用该方法
    @HystrixCommand(defaultFallback = "defaultFallBackMethod") //熔断之后默认的处理方法
    public String demo(Integer id){
        System.out.println("demo ok!");
        if(id<0){
            throw new RuntimeException("id无效!");
        }
        return "demo ok";
    }

    /**
     * @author:江夏
     * @date 2022/7/3 21:49
     * @version 1.0
     * @description: 自定义熔断处理方法
     */
    public String demoFallbackMethod(Integer id){
        return "当前系统繁忙,请稍后再试!!!";
    }

    /**
     * @author:江夏
     * @date 2022/7/3 21:52
     * @version 1.0
     * @description: 默认的熔断之后的处理方法
     */
    public String defaultFallBackMethod(){
        return "当前系统繁忙,请稍后再试(默认)!!!";
    }
}

这里设置条件,获取输入的id的值,如果id<0,则抛出异常,并且进行服务熔断。输入参数大于0,则请求成功。

如果id参数小于0,则请求失败,并且进行服务熔断。

这里需要注意的是@HystrixCommand注解,该注解是方法级别的,使用在方法之上,则一旦服务发生熔断则请求@HystrixCommand注解中指定的方法。@HystrixCommand注解有两个重要的属性,一个是fallbackMethod属性、一个是defaultFallback属性,都是表示发生了服务熔断之后请求的处理方法,一个表示指定的处理方法,一个则是默认的处理方法,有点类似404页面的感觉。

OpenFeign整合Hystrix

如果是使用OpenFeign进行服务调用进行服务熔断,那么就需要使用两个服务,所以除了上述项目之外,重新创建一个项目,并且在该项目中调用上面项目的接口。这个项目中需要的依赖除了上面的之外,还需要引入openfeign相关的依赖:

 <!--引入openfeign依赖-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>

然后在配置文件中配置相关的配置,这里和其他的配置一样:

server.port=8088
spring.application.name=hystrixofopenfeign

#向consul server 服务注册地址
spring.cloud.consul.host=localhost
spring.cloud.consul.port=8500
spring.cloud.consul.discovery.service-name=${spring.application.name}

#开启openfeign在调用服务过程中开启hystrix支持,如果是开启可以不写,因为默认事开启的
feign.hystrix.enabled=true

入口类上加上EnableFeignClients注解开启openfeign调用

@SpringBootApplication
@EnableDiscoveryClient //开启服务客户端 consul server
@EnableFeignClients //开启openfeign调用
public class HystrixOfOpenfeignApplication {
    public static void main(String[] args) {
        SpringApplication.run(HystrixOfOpenfeignApplication.class,args);
    }
}

openfeign调用的使用可以参考之前的文章:SpringCloud系列:OpenFeign组件。这里需要创建一个feignclient:

@FeignClient(value="hystrix",fallback = HystrixClientFallBack.class)//调用hystrix服务,fallback属性表示当调用的服务不可用时,默认的备选处理方式
public interface HystrixClient {

    @GetMapping("/demo")
    String demo(@RequestParam("id") Integer id);
}

feignclient注解中的fallback属性配置回调处理类,该处理类是作为 Feign 熔断器的逻辑处理类表示当调用的服务不可用时,默认的备选处理方式,value为类,默认的处理如下需要实现openfeign接口,并实现其中的方法:

/**
 * @author jiangxia
 * @date 2022年07月09日 21:08
 * desc:自定义的处理方式
 */
@Configuration
public class HystrixClientFallBack implements HystrixClient {
    @Override
    public String demo(Integer id) {
        return "当前服务忙,请稍后再试!";
    }
}

测试

接下来进行测试。分别启动上面的两个项目,则服务在consul中注册了。

地址栏分别输入错误id的url如下:

输入正确id的url的结果如下:

则表示正确实现了服务熔断。

总结

本文主要介绍了什么是hystrix熔断器以及其在springcloud项目中的简单使用。hystrix熔断器主要是指在项目中引入hystrix依赖,则在一定的时间范围内如果请求的次数达到一定的失败比例,那么hystrix就会主动拒绝服务,并采用备选方案返回请求信息,从而有效的缓解了服务雪崩的问题,有效的控制服务之间链路调用的响应时间,保证整个微服务的健康。

相关推荐

我正在参与掘金技术社区创作者签约计划招募活动,点击链接报名投稿