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

这篇具有很好参考价值的文章主要介绍了【微服务笔记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为其他的值,可以正常调用。

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

(5)fallbackMethod属性

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

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

二、服务熔断

2.1、什么是服务熔断

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

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

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

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

【微服务笔记10】微服务组件之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的请求,查看控制台输出结果。

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

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

综上,这篇文章结束了,主要介绍微服务组件之Hystrix实现服务降级和服务熔断。文章来源地址https://www.toymoban.com/news/detail-410363.html

到了这里,关于【微服务笔记10】微服务组件之Hystrix实现服务降级和服务熔断的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 云原生微服务 Spring Cloud Hystrix 降级、熔断实战应用

    第一章 Java线程池技术应用 第二章 CountDownLatch和Semaphone的应用 第三章 Spring Cloud 简介 第四章 Spring Cloud Netflix 之 Eureka 第五章 Spring Cloud Netflix 之 Ribbon 第六章 Spring Cloud 之 OpenFeign 第七章 Spring Cloud 之 GateWay 第八章 Spring Cloud Netflix 之 Hystrix 多个微服务之间调用的时候,假如微服

    2024年02月08日
    浏览(31)
  • 【微服务笔记21】微服务组件之Sentinel服务熔断、服务降级、流量控制介绍

    这篇文章,主要介绍微服务组件之Sentinel服务熔断、服务降级、流量控制。 目录 一、Sentinel组件 1.1、Sentinel介绍 1.2、Sentinel环境搭建 (1)引入依赖 (2)资源和规则 1.3、使用SphU定义资源 (1)定义资源 (2)定义规则 1.4、使用SphO定义资源 (1)定义资源 (2)定义规则 1.5、

    2024年04月17日
    浏览(50)
  • 【OpenFeign】OpenFeign结合Hystrix和Sentinel实现熔断降级

    OpenFeign可以与Hystrix和Sentinel结合使用,实现降级和熔断。 使用OpenFeign需要引入OpenFeign的依赖: spring-cloud-starter-openfeign 引入的依赖如下: 默认已经自动引入了hystrix的依赖,不再需要单独再引入hystrix了。 降级方法的类需要实现FeignClient的接口,同时这个类需要注入到Spring容器

    2024年02月11日
    浏览(27)
  • 【从0到1设计一个网关】基于Hystrix实现熔断降级

    上文我们已经成功实现了请求重试与请求限流,接下来我们开始实现熔断与服务降级。 熔断与服务降级,在SpringCloud中设计到的就是我们的hystrix,这里我们也将会考虑配合hystrix来实现熔断与服务降级。 如果不了解hystix的可以先进行一下了解。 由于这里我是用的是基于hystr

    2024年02月05日
    浏览(36)
  • SpringCloud-Hystrix服务熔断与降级工作原理&源码 | 京东物流技术团队

    在微服务架构中,根据业务来拆分成一个个的服务,服务与服务之间可以相互调用(RPC),在Spring Cloud可以用RestTemplate+Ribbon和Feign来调用。为了保证其高可用,单个服务通常会集群部署。由于网络原因或者自身的原因,服务并不能保证100%可用,如果单个服务出现问题,调用这

    2024年02月14日
    浏览(30)
  • 微服务springcloud 06.feign框架,配合ribbon 负载均衡和重试,配合hystrix 降级,监控和熔断测试

    feign是ribbon +hystrix 的整合 01.新建 sp09-feign 项目 第一步: 第二步:选择依赖: pom.xml 需要添加 sp01-commons 依赖: 第三步:修改sp09-feign项目的application.yml 第四步:sp09-feign的主程序添加 @EnableDiscoveryClient 和 @EnableFeignClients 02.feign 声明式客户端 第一步:声明三个代理接口 这里的

    2024年02月10日
    浏览(40)
  • Dubbo hystrix 熔断降级 示例

    目录 Pom 应用启动类 接口 服务提供者 消费者 总结 因为jar包冲突问题报错 java.lang.NoSuchMethodError: org.springframework.boot.builder.SpringApplicationBuilder.([Ljava/lang/Object;)V 解决方式修改低版本springboot 改成如下 版本对照 全代码 pom 启动 实现 yml 有需要加上这个 有超时熔断跳转到 reliable

    2024年02月12日
    浏览(33)
  • Hystrix和Sentinel熔断降级设计理念

    Sentinel 和 Hystrix 的原则是一致的: 当检测到调用链路中某个资源出现不稳定的表现,例如请求响应时间长或异常比例升高的时候,则对这个资源的调用进行限制,让请求快速失败,避免影响到其它的资源而导致级联故障。 Sentinel 对这个问题采取了两种手段: 通过并发线程数进

    2024年02月09日
    浏览(32)
  • 高版本Spring Cloud中OpenFeign整合Hystrix熔断降级不生效的问题及解决方案

    本文将介绍在使用高版本Spring Cloud(2020.0.x及以后),由于取消了Hystrix的集成,导致OpenFeign与Hystrix熔断降级不生效的问题。同时,也将给出解决该问题的方案,即添加feign.circuitbreaker.enabled=true配置。 随着Spring Cloud框架的发展,高版本Spring Cloud(2020.0.x及以上)中取消了对Hy

    2024年02月22日
    浏览(34)
  • springcloud3 hystrix实现服务降级的案例配置2

    \\\"服务器忙,请稍后在试\\\"不让客户达等待,立即返回一个友好的提示。 1.程序运行异常; 2.超时; 3.服务熔断触发服务降级; 4.线程池/信号量打满也会导致服务降级 2.1.1 pom文件 2.1.2 设置降级规则 代码  2.1.3 开启hystrix熔断 添加:@EnableHystrix 注解 2.2.1 pom文件 2.2.2 设置降级规

    2024年02月12日
    浏览(28)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包