Spring Cloud Gateway如何实现熔断

news2024/11/15 4:46:08

Spring Cloud Gateway熔断集成

熔断应用:
金融市场中的熔断机制:在金融交易系统中,熔断机制(Circuit Breaker)是一种市场保护措施,旨在预防市场剧烈波动时可能导致的系统性风险。当某个基准指数(如股票指数或期货价格)在短时间内发生急剧上涨或下跌达到预先设定的阈值时,交易所会自动暂停交易一段时间或者限制涨跌幅度,类似于电器中的保险丝在电流过载时熔断以切断电流。例如,在美国股市中,曾经存在三级熔断机制,分别在标普500指数下跌7%、13%和20%时触发。
分布式计算中的熔断机制: 在分布式系统或微服务架构中,熔断机制是一种容错设计模式,其目的是防止因依赖的服务出现故障而引发整个系统的雪崩效应。当一个服务调用另一个服务时,如果后者频繁失败或响应时间过长,熔断器组件(如Hystrix、Resilience4j或Alibaba Sentinel)就会“熔断”该调用链路,不再继续请求有问题的服务,而是直接返回预设的错误信息或默认值,同时给调用方提供一个快速的失败反馈,而不是长时间等待或阻塞资源。在后续的一段时间内(冷却期),即使问题服务恢复,熔断器也可能保持打开状态,仅在一段时间后尝试半开状态重新发起调用,以确认服务是否真正恢复正常。这样可以确保整个系统的稳定性,并允许其他健康的服务不受影响地继续运行。

Spring Cloud Gateway 本身并不自带完整的熔断机制,但在早期版本中可以通过集成 Hystrix 来实现服务熔断和降级。然而,随着Hystrix的维护状态变更,社区推荐使用如Resilience4j或Alibaba Sentinel等其他更活跃的容错库。

SpringCloudGateway集成Hystrix实现熔断

第一步添加依赖:

在pom.xml或build.gradle文件中引入Spring Cloud Gateway与Hystrix的相关依赖。

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

第二部添加路由配置

在Spring Cloud Gateway配置中添加Hystrix过滤器,并定义相关的路由规则

  spring:
     cloud:
       gateway:
         routes:
           - id: your_route_id
             uri: lb://your_service_id
             predicates:
               - Path=/api/** # 例如,匹配所有/api开头的路径
             filters:
               - name: Hystrix
                 args:
                   name: fallbackcmd
                   fallbackUri: forward:/fallback  # 当熔断发生时转发到的本地fallback处理逻辑

第三步添加回退提示

创建一个Controller或Endpoint来处理当Hystrix触发熔断时的回退操作。

  @RestController
   public class FallbackController {

       @GetMapping("/fallback")
       public Mono<String> fallback() {
           return Mono.just("Fallback response due to service unavailable.");
       }
   }

第四步添加Hystrix熔断配置

确保Hystrix的全局配置已启用,并根据需要配置熔断阈值、超时时间等参数。

import com.netflix.hystrix.HystrixCommandProperties;

@Configuration
public class HystrixConfiguration {

    @Bean
    public HystrixCommandProperties.Setter hystrixCommandProperties() {
        return HystrixCommandProperties.Setter()
                .withExecutionTimeoutInMilliseconds(5000) // 设置命令执行超时时间为5秒
                .withCircuitBreakerEnabled(true) // 启用熔断器
                .withCircuitBreakerErrorThresholdPercentage(50) // 当错误率达到50%时触发熔断
                .withCircuitBreakerSleepWindowInMilliseconds(30000); // 熔断后的休眠窗口期为30秒
    }
}
hystrix:
  command:
    default: # 这里是全局默认配置,也可以针对特定命令键做单独配置
      execution:
        isolation:
          thread:
            timeoutInMilliseconds: 5000 # 设置命令执行超时时间为5秒
      circuitBreaker:
        enabled: true # 启用熔断器
        errorThresholdPercentage: 50 # 当错误率达到50%时触发熔断
        sleepWindowInMilliseconds: 30000 # 熔断后的休眠窗口期为30秒

第五步实现熔断逻辑

自定义熔断 Hystrix Gateway Filter来完成熔断逻辑的适配。

参考
import com.netflix.hystrix.HystrixCommand;
import com.netflix.hystrix.exception.HystrixRuntimeException;
import org.springframework.cloud.gateway.filter.GatewayFilter;
import org.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory;
import org.springframework.http.HttpStatus;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;

public class HystrixGatewayFilterFactory extends AbstractGatewayFilterFactory<HystrixGatewayFilterFactory.Config> {

    public static class Config {
        // 可配置属性,如命令名称、组键等
        private String commandKey;
        // 其他可能的配置项...

        // 构造函数和getters/setters省略...
    }

    @Override
    public GatewayFilter apply(Config config) {
        return (exchange, chain) -> {
            // 创建Hystrix Command,封装请求处理逻辑
            HystrixCommand<String> command = new HystrixCommand<String>(Setter.withGroupKey(HystrixCommandGroupKey.Factory.asKey(config.getCommandKey()))) {
                @Override
                protected String run() throws Exception {
                    // 执行原始请求并获取响应
                    return chain.filter(exchange).block();
                }

                // 自定义fallback逻辑
                @Override

SpringCloudGateway集成Sentinel实现熔断

第一步配置依赖

 <dependency>
       <groupId>com.alibaba.cloud</groupId>
       <artifactId>spring-cloud-starter-alibaba-sentinel-gateway</artifactId>
       <version>{latest_version}</version>
   </dependency>

  implementation 'com.alibaba.cloud:spring-cloud-starter-alibaba-sentinel-gateway:{latest_version}'

第二步配置拦截器

  spring:
     cloud:
       gateway:
         routes:
           - id: your_route_id
             uri: lb://your_service_id
             predicates:
               - Path=/your-api-path/**
             filters:
               - name: SentinelGatewayFilter
                 args:
                   resource: your_api_resource_name
                   limitApp: default # 可选,限制调用来源应用,默认不限制
                   fallbackUri: forward:/fallback  # 可选,设置降级处理逻辑路径

第三步启动sentinel服务

在这里插入图片描述

通过 Docker 镜像快速部署 Sentinel 控制台

拉取 Sentinel 控制台镜像: 在终端中运行以下命令从 Docker Hub 拉取最新的 Sentinel 控制台镜像:

docker pull bladex/sentinel-dashboard

运行 Sentinel 控制台容器: 使用以下命令创建并启动一个 Docker 容器,其中 -p 参数用于映射宿主机端口到容器内部的 Sentinel 控制台端口(默认为 8080),–name 参数用于指定容器名称,-d 参数表示在后台运行。

 docker run -d --name sentinel-dashboard -p 8080:8080 bladex/sentinel-dashboard

访问 Sentinel 控制台: Sentinel 控制台服务启动后,可以通过浏览器访问 http://localhost:8080 来登录控制台。默认用户名和密码都是 sentinel。

手动下载编译后的 jar 包运行

下载 Sentinel 控制台 jar 包: 访问 Sentinel GitHub Release 页面 下载最新版本的 sentinel-dashboard.jar 文件。
运行 Sentinel 控制台: 在下载目录下,使用 Java 运行该 jar 包,并指定端口号(例如 8080)

 java -jar sentinel-dashboard.jar --server.port=8080

访问 Sentinel 控制台: 同样地, Sentinel 控制台服务启动后,可以在浏览器中输入 http://localhost:8080 来访问和管理 Sentinel 策略。

配置熔断规则

登录 Sentinel 控制台,为之前定义的资源名称(例如 your_api_resource_name)配置流控、降级、系统保护等策略。
在这里插入图片描述

编写降级处理逻辑

如果在配置中指定了 fallbackUri,则需要在服务端实现对应的降级处理逻辑,当触发熔断时将执行这个逻辑。

yaml配置

在 Spring Cloud Gateway 的路由配置中,为 SentinelGatewayFilter 添加 fallbackUri 参数,指定一个本地处理熔断或降级的 URI。

 spring:
     cloud:
       gateway:
         routes:
           - id: your_route_id
             uri: lb://your_service_id
             predicates:
               - Path=/your-api-path/**
             filters:
               - name: SentinelGatewayFilter
                 args:
                   resource: your_api_resource_name
                   fallbackUri: forward:/fallback
具体实现

在您的 Spring Boot 应用中创建一个 Controller 或者 Endpoint 来处理这个 /fallback 请求。

@RestController
   public class FallbackController {

       @GetMapping("/fallback")
       public Mono<String> fallback(ServerWebExchange exchange) {
           // 这里可以根据需要自定义降级返回的内容
           return Mono.just("Fallback response due to service unavailable.");
       }
   }

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

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

相关文章

【微服务-Nacos】Nacos集群的工作原理及集群间数据同步过程

上篇文章我们介绍了Nacos集群的搭建方法及步骤&#xff0c;下面我们来看一下Nacos集群的工作原理&#xff0c;一共有两部分&#xff1a;Leader节点选举及各节点数据同步。 1、Nacos集群中Leader节点是如何产生的 Nacos集群采用了Raft算法实现。它是一种比较简单的选举算法&am…

【javaWeb】在webapp中手动发布一个应用

标题 &#x1f432;一、为什么要在webapp中手动发布一个应用&#x1f389;二、手动发布步骤1.下载Tomcat2.解压并安装3.在webapps中创建文档 ✨三、总结 &#x1f432;一、为什么要在webapp中手动发布一个应用 好处解释灵活性手动发布应用程序可以根据自己的需求进行自定义配置…

Abaqus三维梯度泰森多边形插件:Voronoi FGM 3D(Mesh)- AbyssFish

插件介绍 Voronoi FGM 3D (Mesh) V1.0 - AbyssFish 插件可在Abaqus软件内生成梯度分布的三维泰森多边形长方体模型。插件可用于梯度功能材料(Functionally Gradient Materials)、梯度纳米金属材料、梯度金属结构等梯度晶体模型的建立。模型基于背景网格实现&#xff0c;通过单…

YOLO_项目环境配置

YOLOv5官方项目地址 https://github.com/ultralytics/yolov5 下载 5.0和1.0源码 5.0 master-Tags-v5.0 Code-Download.ZIP 切换到1.0下载 解压缩提取 打开V5.0 使用Pycharm打开V5.0的文件夹 环境配置 参考 http://t.csdnimg.cn/Zdfh2 http://t.csdnimg.cn/Nqkwr 然后在Pyc…

学习JAVA的二十二天(基础)

目录 网络编程 三要素&#xff1a; IP InetAddress类 端口号 协议 UDP协议 TCP协议 前言&#xff1a;学习JAVA的第二十一天&#xff08;基础&#xff09;-CSDN博客 网络编程 在网络通信协议下&#xff0c;不同计算机上运行的程序,进行的数据传输。 三要素&#xff1a;…

Qt篇——QChartView获取鼠标停留位置的数值

需求&#xff1a;鼠标停留在QChartView上时&#xff0c;想要计算停留位置的数值。 一开始的方法是想要通过鼠标移动事件计算鼠标在QChartView上的坐标&#xff0c;在换算成数值&#xff0c;后来发现QChartView中除了图表数据&#xff0c;还有坐标轴与坐标轴数值标签占了高度&a…

Python数据分析-Matplotlib1

一、折线图的绘制 1.数据分析流程 2.运用Matplot绘制折线图 #encodingutf-8 import random from matplotlib import pyplot as plt #绘图工具库 from matplotlib import font_manager #解决中文显示问题 from cProfile import label #设置字体方式 my_font font_manager.Fon…

个人简历主页搭建系列-02:github 仓库作为联系方式

这篇文章暂时没有开始正式搭建网站。首先是最重要的注意事项&#xff1a;隐私。 真实姓名如果大家自己不介意的话其实我觉得还好&#xff0c;现在在互联网上想扒个姓名挺简单的&#xff0c;而且很多人都实名上网hh&#xff08;比如我的几位田径队学弟笑&#xff09;。 电话&a…

怎样基于“用户”思维让内容营销更有效

当下互联网流量见顶&#xff0c;内容已经成为互联网竞争新的制高点&#xff0c;可以说在数字化驱动的新时代下&#xff0c;“内容为王”仍然是真理。然后信息泛滥的时代下&#xff0c;如何让内容营销脱颖而出呢&#xff1f;媒介盒子认为“用户思维”是关键&#xff0c;今天就和…

2024.3.14jsp

一、实验目的 1、安装配置JSP运行环境 2、设置web服务目录&#xff0c;修改TomCAT服务器的端口号、访问web服务目录下的jsp页面。 二、实验项目内容&#xff08;实验题目&#xff09; 1、编写两个简单的JSP页面&#xff1b;参考第一章上机实验1、2 &#xff08;1&#xff09…

Spring Cloud Alibaba微服务从入门到进阶(四)(服务发现-Nacos )

Nacos是服务发现组件和配置服务器 作为服务发现注册组件Nacos Server 搭建Nacos Server 下载、启动 访问nacos,默认 用户/密码 nacos/nacos 将应用注册到nacos 加依赖 在SpringCloud子项目中&#xff0c;Feign是属于OpenFeign&#xff0c;Sentinel、Nacos是属于alibaba的&…

搭建个人智能家居 3 -第一个设备“点灯”

搭建个人智能家居 3 -第一个外设“点灯” 前言ESPHome点灯 HomeAssistant 前言 前面我们已经完成了搭建这个智能家居所需要的环境HomeAssistant和ESPHome&#xff0c;今天我们开始在这个智能家居中添加我们的第一个设备&#xff08;一颗LED灯&#xff09;&#xff0c;如果环境…

Mysql---库表操作

文章目录 前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据总结 一.Mysql数据库简介 MySQL是一种关系型数据库管理系统&#xff0c;是最流行的开源数据库之一。它是由瑞典MySQL AB公司开发的&#xff0c;后来被Sun Microsystems收购&#xff0c;之后又被Oracl…

数码管的动态显示(三)

1.原理 data_reg寄存&#xff0c;只寄存符号位和数据位不包含小数点位。 动态数码管每个显示1ms&#xff0c;所以计数到5*10^4-1 为了将sel和seg同步&#xff0c;把sel打了一拍。 6位都使用到了可以这么计算&#xff0c;6位都显示的是数据。或者最高位显示的是小数点&#xff…

微软远程桌面RD Client:连接与管理的新境界

微软远程桌面RD Client&#xff1a;连接与管理的新境界 在数字化日益深入的今天&#xff0c;远程工作与管理已成为许多企业和个人的首选。微软远程桌面RD Client作为一款功能强大的远程连接工具&#xff0c;凭借其出色的性能和便捷的操作&#xff0c;受到了广泛的关注和好评。…

C# EPPlus导出dataset----Excel2绘制图像

一、生成折线图方法 /// <summary> ///生成折线图 /// </summary> /// <param name="worksheet">sheet页数据 </param> /// <param name="colcount">总列数</param> /// &l…

一、C#冒泡排序算法

一、C#冒泡排序算法 简介 冒泡排序算法是一种基础的排序算法&#xff0c;它的实现原理比较简单。核心思想是通过相邻元素的比较和交换来将最大&#xff08;或最小&#xff09;的元素逐步"冒泡"到数列的末尾。 实现原理 冒泡排序是一种简单的排序算法&#xff0c;其…

PGA高端项目:FPGA基于GS2971+GS2972架构的SDI视频收发,提供3套工程源码和技术支持

目录 1、前言免责声明 2、相关方案推荐本博已有的 SDI 编解码方案本方案的SDI接收图像缩放应用本方案的SDI接收纯verilog图像缩放纯verilog多路视频拼接应用本方案的SDI接收HLS图像缩放HLS多路视频拼接应用本方案的SDI接收OSD动态字符叠加输出应用本方案的SDI接收HLS多路视频融…

x6.js 从流程图组件库中拖拽组件到画布dnd使用

上一篇已经了解到了x6.js常用功能以及使用方法。但我们使用流程图的时候还少不了一个非常重要的功能那就是拖拽组件库里的组件进来。如下图&#xff1a; 首先是布局这块&#xff0c;拖拽组件库的视图中布局无需我们去写&#xff0c;我们只需把界面搭建好。 添加组件库 1.搭建布…

先验分布、后验分布、极大似然的一点思考

今天和组里同事聊天的时候&#xff0c;无意中提到了贝叶斯统计里先验分布、后验分布、以及极大似然估计这三个概念。同事专门研究如何利用条件概率做系统辨识的&#xff0c;给我画了一幅图印象非常深刻&#xff1a; 其中k表示时序关系。上面这个图表示后验分布是由先验分布与似…