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

news2024/11/16 1:36:17

这篇文章,主要介绍微服务组件之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实现服务降级和服务熔断。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/410729.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CesiumForUnreal实现鹰眼地图(MiniMap)效果

文章目录 1.实现目标2.实现过程3.参考资料1.实现目标 基于CesiumForUnreal插件加载的在线地形和影像数据,使用Widget实现鹰眼小地图的效果,GIF动图如下: 2.实现过程 在UE开发中,常用的以Widget方法实现小地图的形式有两种。一种是动态的小地图,即地图的纹理图片会发生变化…

【Spark】RDD缓存机制

1. RDD缓存机制是什么&#xff1f; 把RDD的数据缓存起来&#xff0c;其他job可以从缓存中获取RDD数据而无需重复加工。 2. 如何对RDD进行缓存&#xff1f; 有两种方式&#xff0c;分别调用RDD的两个方法&#xff1a;persist 或 cache。 注意&#xff1a;调用这两个方法后并不…

腾讯云轻量服务器和云服务器区别对比(超详细全方位)

腾讯云轻量服务器和云服务器有什么区别&#xff1f;为什么轻量应用服务器费用更低&#xff1f;是因为轻量服务器CPU内存性能比云服务器CVM性能差吗&#xff1f;轻量应用服务器适合中小企业或个人开发者搭建企业官网、博客论坛、微信小程序或开发测试环境&#xff0c;云服务器CV…

Parcel 实践:轻松打包前端项目

结论 Parcel 是一个功能强大且易于使用的前端构建工具&#xff0c;它可以帮助您快速地构建 Web 项目。本文提供了关于如何开始使用 Parcel、配置和优化性能的实践方法。希望这些内容对您有所帮助&#xff01; Parcel 是一个快速&#xff0c;零配置的 Web 应用打包工具。它的简单…

7nm舱泊一体SoC的新玩家

2016年&#xff0c;高通推出基于14纳米工艺的汽车座舱芯片骁龙820A&#xff0c;彼时&#xff0c;传统座舱SoC霸主NXP主推的是28纳米工艺的iMX8系列。不过&#xff0c;两款芯片都没有能够达到预期的量产效果。 真正的时代变革&#xff0c;来自于高通在2019年发布的全球首款量产7…

【产品设计】电商后台系统设计--订单管理

电商后台产品&#xff0c;涉及众多模块&#xff0c;而以商品、订单、库存&#xff0c;为核心模块&#xff0c;模块之间存在大量交互。订单较为重要&#xff0c;它记录了所有的交易数据 对电商公司来讲&#xff0c;最核心最难做的有三部分&#xff1a;商品、订单、库存。商品与店…

记一次中大规模数据库迁移过程,从MySql到PostgreSQL.

从MySql到PostgreSQL迁移的决策过程就不说了。我也是第一次用PostgreSQL&#xff0c;也没法说好不好。决策已经定了&#xff0c;下面介绍一下执行过程。 一、数据基本情况 服务器&#xff1a;4核CPU&#xff0c;8G内存&#xff0c;1T硬盘&#xff0c;8Mbit网速。 数据库&…

【建站】手把手教你搭建惊艳的博客

系列文章目录 第一章 手把手教你搭建自己的博客 文章目录系列文章目录前言一、网站软件的选择二、网站空间的选择1. 建议选择有名、大厂的2. 上手容易&#xff0c;丰富而详实的文档3. 要稳定&#xff0c;少出问题4. 及时处理并有能力处理问题三、 环境准备四、 安装PHP81. 首先…

sql知识点复习以及项目中的例子

常见的聚合函数&#xff1a; avg&#xff08;&#xff09;&#xff0c;求平均值&#xff1b; sum&#xff08;&#xff09; 求和&#xff1b; count&#xff08;&#xff09;&#xff0c;计算和&#xff1b; min&#xff08;&#xff09;求最小值&#xff1b; max&#xff…

ChatGPT想干掉开发人员,做梦去吧

很多人都发现ChatGPT可以做一些代码相关的工作&#xff0c;不仅可以写一些基础的类似python、java、js的代码段&#xff0c;还可以做一定量的调优&#xff0c;于是就开始担忧起来&#xff0c;到哪天我的开发工作会不会被ChatGPT这个工具给取代了&#xff1f; 目录 1. ChatGPT…

腾讯云轻量应用服务器镜像修改限制说明(必看)

腾讯云轻量应用服务器镜像可以更换或修改吗&#xff1f;可以&#xff01;镜像可以修改&#xff0c;镜像是指轻量服务器的预装操作系统&#xff0c;轻量服务器创建成功后镜像也是可以更换的&#xff0c;如下图&#xff1a; 腾讯云轻量应用服务器镜像可以修改 目录 轻量服务器修…

计算机系统基本组成于基本功能

什么是计算机系统 计算机系统中的各个抽象层&#xff1a; C语言程序设计层 数据的机器级表示&#xff0c;运算语句和过程调用的机器级表示操作系统、编译和链接指令集体系架构&#xff08;ISA&#xff09;和汇编层 指令系统、机器代码&#xff0c;汇编语言微体系结构和硬件层 …

365天深度学习训练营-第J9周:Inception v3算法实战与解析

目录 一、前言 二、论文解读 1、Inception网络架构描述 2、Inception网络架构的优点 3、InceptionV3的改进 三、模型搭建 1、Inception-A 2、Inception-B 3、Inception-C 4、Reduction-A 5、Reduction-B 6、辅助分支 7、InceptionV3实现 一、前言 &#x1f368; 本…

ASP一个简单的网上教务系统模型的设计与实现

对于一个学校来说&#xff0c;大量教师信息&#xff0c;学生信息管理&#xff0c;学生成绩管理&#xff0c;基本数据的维护都难于通过传统的方法进行管理&#xff1a;这就迫切需要利用计算机技术来帮助学校管理者处理这些日常管理。本系统正是为了简化教学任务的管理&#xff0…

FreeRTOS 任务调度及相关函数详解(一)

文章目录一、任务调度器开启函数 vTaskStartScheduler()二、内核相关硬件初始化函数 xPortStartScheduler()三、启动第一个任务 prvStartFirstTask()四、中断服务函数 xPortPendSVHandler()五、空闲任务一、任务调度器开启函数 vTaskStartScheduler() 这个函数的功能就是开启任…

【ROS2指南-1】配置ROS2环境

资料来源Configuring your ROS 2 environment — ROS 2 Documentation: Dashing documentationhttp://docs.ros.org/en/dashing/Tutorials/Configuring-ROS2-Environment.html 目标&#xff1a;本教程将向您展示如何准备 ROS 2 环境。 教程级别&#xff1a;初学者 时间&…

js控制页面随浏览器放大缩小,页面布局不变

一.给App.vue设置minWidth、minHeight、maxWidth以及maxHeight,值为浏览器的可视窗口大小(我的浏览器不全屏的时候是1920*937,全屏的时候是1920*1080) 1.在main.js中获取浏览器的宽高,并挂载到全局变量上以便使用 // 浏览器窗口,这个地方值不会变,你任意拉扯浏览器也不会改变…

【数据库基本操作】打开数据库

一、启动与关闭 只介绍一种方法&#xff1a; 打开命令行工具&#xff0c;以管理员身份运行 1.启动数据库 net start mysql80 //80是在安装的时候设置的名字&#xff08;默认&#xff09;&#xff0c;不用在意 2.关闭数据库 net stop mysql80 如题已经成功&#…

场景搭建、素材库、在线标绘等,四维轻云地理空间数据云管理平台新增了这些功能

四维轻云是一款地理空间数据云管理平台&#xff0c;具有地理空间数据在线管理、展示及分享等功能。在四维轻云平台中&#xff0c;用户可以不受时间地点的限制&#xff0c;随时随地管理、查看及分享各类地理空间数据。 为了更好地满足用户需求和进行地理空间数据在线管理&#…

【C++从入门到放弃】string全方面分析(常用接口、模拟实现)

&#x1f9d1;‍&#x1f4bb;作者&#xff1a; 情话0.0 &#x1f4dd;专栏&#xff1a;《C从入门到放弃》 &#x1f466;个人简介&#xff1a;一名双非编程菜鸟&#xff0c;在这里分享自己的编程学习笔记&#xff0c;欢迎大家的指正与点赞&#xff0c;谢谢&#xff01; strin…