【微服务笔记10】微服务组件之Hystrix实现服务降级和服务熔断

这篇文章,主要介绍微服务组件之Hystrix实现服务降级和服务熔断。

目录

一、服务降级

1.1、什么是服务降级

1.2、实现服务降级

(1)引入依赖

(2)编写Service层代码

(3)编写Controller层代码

(4)运行测试

(5)fallbackMethod属性

二、服务熔断

2.1、什么是服务熔断

2.2、实现服务熔断

(1)引入依赖

(2)编写Service层代码

(3)编写Controller层代码

(4)运行测试


一、服务降级

1.1、什么是服务降级

服务降级:发生在客户端侧,当某个微服务自身出现大量的请求,从而没办法处理过来的时候,这个时候可以采取某种策略,将那些不重要的请求直接中断,返回事先定义好的fallback方法(可以叫做兜底方法),这样就可以为那些核心业务接口提供更多的资源。

服务降级是最简单的一种实现方式,那什么情况下会出发服务降级呢???

  • 第一种情况:当出现【HystrixBadRequestException】之外的异常时候,就会触发服务降级。
  • 第二种情况:当接口方法调用超时,触发服务降级。
  • 第三种情况:熔断器开启的时候。
  • 第四种情况:线程池、队列、信号量已经达到最大值的时候。

1.2、实现服务降级

(1)引入依赖

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

(2)编写Service层代码

  • 在service层中需要开启服务降级的方法上面,使用【@HystrixCommand】注解,并且通过【fallbackMethod】属性指定降级之后的兜底方法。
package com.gitcode.hystrix.service;

import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import org.springframework.stereotype.Service;

/**
 * @version 1.0.0
 * @Date: 2023/4/10 21:47
 * @Author ZhuYouBin
 * @Description 服务降级
 */
@Service
public class HystrixFallbackService {

    /**
     * 标记当前方法开启服务降级
     */
    @HystrixCommand(fallbackMethod = "reductionGradeFallback")
    public String reductionGrade(String id) {
        if (id.equals("1001")) {
            throw new RuntimeException("模拟业务异常");
        }
        System.out.println("模拟调用其他微服务接口......");
        return "success.";
    }

    /**
     * fallback 方法,必须和 @HystrixCommand 注解标记的方法具备相同的【参数列表】、【返回值类型】
     */
    private String reductionGradeFallback(String id) {
        System.out.println("服务降级,请稍后重试!");
        return "服务降级,请稍后重试!";
    }
}

(3)编写Controller层代码

package com.gitcode.hystrix.controller;

import com.gitcode.hystrix.service.HystrixFallbackService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @version 1.0.0
 * @Date: 2023/4/10 21:46
 * @Author ZhuYouBin
 * @Description 服务降级
 */
@RestController
@RequestMapping("/hystrix/fallback")
public class HystrixFallbackController {

    @Autowired
    private HystrixFallbackService hystrixFallbackService;

    @GetMapping("/reduce")
    public String reductionGrade(String id) {
        return hystrixFallbackService.reductionGrade(id);
    }

}

(4)运行测试

启动工程,浏览器访问【http://127.0.0.1:9898/hystrix/fallback/reduce?id=1001】时候,此时会抛出异常,触发服务降级功能;修改id为其他的值,可以正常调用。

(5)fallbackMethod属性

fallbackMethod属性用于指定服务降级或者熔断之后,调用的备选方法,在这个方法里面,我们可以根据具体的业务场景返回一些模拟数据。例如:当接口出现降级或者熔断之后,可以从缓存里面、从数据库里面查询备选数据,返回给客户端。fallbackMethod 属性指定的方法必须满足下面这些规则:

  • 1. 方法必须和 @HystrixCommand 注解标记的方法在【同一个类】里面。
  • 2. 方法的【参数列表】必须和 @HystrixCommand 注解标记的方法参数列表相同。
  • 3. 方法的【返回值类型】必须和 @HystrixCommand 注解标记的方法返回值相同。

二、服务熔断

2.1、什么是服务熔断

服务熔断:发生在服务端侧,当某个微服务出现故障导致服务不可用的时候,此时调用端服务发现服务不可用,此时就会开启熔断机制,阻断所有请求服务端的请求,直接返回事先定义好的fallback方法。

服务熔断,就像是电路中的保险丝一样,当发现下游系统服务不可用的时候,此时hystrix就会开启熔断器,阻断所有调用下游系统的接口,直接返回fallback方法。如果没有设置fallback方法,则会执行默认的返回策略。

熔断器机制,hystrix提供了熔断器,它的工作原理大致如下所示:

  • 当调用下游服务接口正常时候,不会开启熔断器机制。
  • 当调用下游服务接口的次数超过20个,并且接口调用失败率超过50%,那么此时就会开启熔断器。
  • 一旦熔断器开启之后,微服务就不会继续调用下游系统接口,而是直接返回fallback指定的兜底方法(默认指定就执行默认的方式)。
  • 但是熔断器不能一直处于熔断状态,必须有重新开启的时候,所以hystrix会默认每隔【5秒】尝试调用下游系统,判断下游系统服务是否可用。
  • 当hystrix发现下游系统服务重新可用的时候,此时就会关闭熔断器。

服务降级和服务熔断都可以使用一个事先准备好的fallback方法,这就相当于是一个后备方案,只不过这个方案不是正确的业务结果,但是通过这种方式,可以提高系统的可用性,为什么可以提高性能呢?可以这么想,因为每次请求到达服务器之后,都是直接返回fallback的结果,而不需要发起一个HTTP请求去调用另外一个微服务,所以这就减少了请求的次数。

2.2、实现服务熔断

(1)引入依赖

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

(2)编写Service层代码

package com.gitcode.hystrix.service;

import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixProperty;
import com.netflix.hystrix.contrib.javanica.conf.HystrixPropertiesManager;
import org.springframework.stereotype.Service;

import java.time.LocalDateTime;

/**
 * @version 1.0.0
 * @Date: 2023/4/10 21:47
 * @Author ZhuYouBin
 * @Description 服务熔断
 */
@Service
public class HystrixCircuitBreakerService {

    /**
     * 标记当前方法开启服务降级
     */
    @HystrixCommand(
            commandProperties = {
                    // 启用熔断器
                    @HystrixProperty(name = HystrixPropertiesManager.CIRCUIT_BREAKER_ENABLED, value = "true"),
                    // 设置请求线程数量,默认是20个时候,发生熔断,这设置成5个
                    @HystrixProperty(name = HystrixPropertiesManager.CIRCUIT_BREAKER_REQUEST_VOLUME_THRESHOLD, value = "5"),
                    // 请求线程失败的比率,默认是大于50%时候发生熔断
                    @HystrixProperty(name = HystrixPropertiesManager.CIRCUIT_BREAKER_ERROR_THRESHOLD_PERCENTAGE, value = "50"),
                    // 熔断机制重试策略的时间间隔,默认是5秒重试一次
                    @HystrixProperty(name = HystrixPropertiesManager.CIRCUIT_BREAKER_SLEEP_WINDOW_IN_MILLISECONDS, value = "5"),
            },
            fallbackMethod = "circuitBreakFallback"
    )
    public String circuitBreaker(String id) {
        if (id.equals("1001")) {
            throw new RuntimeException("模拟业务异常");
        }
        System.out.println("模拟调用其他微服务接口......当前时间:" + LocalDateTime.now());
        return "success.";
    }

    /**
     * fallback 方法,必须和 @HystrixCommand 注解标记的方法具备相同的【参数列表】、【返回值类型】
     */
    private String circuitBreakFallback(String id) {
        System.out.println("服务熔断降级,请稍后重试!");
        return "服务熔断降级,请稍后重试!";
    }
}

(3)编写Controller层代码

package com.gitcode.hystrix.controller;

import com.gitcode.hystrix.service.HystrixCircuitBreakerService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @version 1.0.0
 * @Date: 2023/4/10 21:46
 * @Author ZhuYouBin
 * @Description 服务熔断
 */
@RestController
@RequestMapping("/hystrix/fallback")
public class HystrixCircuitBreakerController {

    @Autowired
    private HystrixCircuitBreakerService service;

    @GetMapping("/breaker")
    public String circuitBreaker(String id) {
        return service.circuitBreaker(id);
    }

}

(4)运行测试

启动工程,浏览器访问【http://127.0.0.1:9898/hystrix/fallback/breaker?id=1001】,多访问几次,此时会导致hystrix开启熔断器,然后在访问id不是1001的请求,查看控制台输出结果。

到此,Hystrix中服务降级和服务熔断功能就介绍完啦。

综上,这篇文章结束了,主要介绍微服务组件之Hystrix实现服务降级和服务熔断。

猜你喜欢

转载自blog.csdn.net/qq_39826207/article/details/130038452
今日推荐