Spring Cloud gateway - CircuitBreaker GatewayFilte

前面学习Spring cloud gateway的时候,做测试的过程中我们发现,Spring Cloud Gateway不需要做多少配置就可以使用Spring Cloud LoadBalance的功能,比如:

spring:application:name: spring-gatewaycloud:gateway:routes:- id: path_routeuri: lb://orderservicepredicates:- Path=/order/*
eureka:client:service-url: # eureka servicedefaultZone: http://127.0.0.1:10086/eureka/
server:port: 9095

就实现了通过Eureka注册中心进行路由、并自动启用了负载均衡。

其实这个功能是通过Gateway的过滤器实现的。

我们已经知道,Spring Cloud Gateway内置n多过滤器,我们今天就学习其中两个过滤器:

  1. The CircuitBreaker GatewayFilter
  2. The ReactiveLoadBalancerClientFilter

The ReactiveLoadBalancerClientFilter

该Filter原理非常简单,就是上面说过的配置项uri中有 lb 标记,比如上例中的 lb://orderservice 。

ReactiveLoadBalancerClientFilter会查找uri配置中如果包含 lb 的话,会使用Spring Cloud ReactorLoadBalancer解析uri为实际的host和port。

所以只要在配置文件中uri指定lb标记,就会启用Spring Cloud LoadBalancer,简直就是,不要太方便。

ReactiveLoadBalancerClientFilter是Spring Cloud Gateway的全局过滤器,因此你不需要做特殊配置,自动全局生效。

The CircuitBreaker GatewayFilter

CircuitBreaker GatewayFilter是路由过滤器,所以,如果想要其生效,必须在路由下进行配置,比如:

spring:cloud:gateway:routes:- id: circuitbreaker_routeuri: https://example.orgfilters:- CircuitBreaker=myCircuitBreaker

断路器基础

我们前面学习过Hystrix,了解了断路器的作用以及基本原理,知道断路开关有闭合、打开、半开半闭三个状态,以下是Hystrix的断路开关状态描述:

  1. 闭合:默认为闭合状态,可以对服务正常调用。
  2. 打开:服务调用失败达到设定的阈值后打开,一定时间范围(MTTR 平均故障处理时间)内不会调用服务。打开时长达到MTTR设置的时间后,切换到半熔断状态(半开半闭)。
  3. 半开半闭:半熔断状态,此状态下允许请求访问服务一次,如果访问成功则关闭断路器,否则再次打开断路器。

不同的断路器实现都会遵循在以上三个状态下工作的基础原理,只不过开关打开条件、半开半闭状态下变更为开、闭状态的条件可能会有所不同。

CircuitBreaker GatewayFilter

我们今天要学习的是Spring Cloud Gateway的断路过滤器,而不是Spring Cloud CircuitBreaker。

关于CircuitBreaker GatewayFilter,官网描述:

The Spring Cloud CircuitBreaker GatewayFilter factory uses the Spring Cloud CircuitBreaker APIs to wrap Gateway routes in a circuit breaker. Spring Cloud CircuitBreaker supports multiple libraries that can be used with Spring Cloud Gateway. Spring Cloud supports Resilience4J out of the box.

CircuitBreaker GatewayFilter工厂采用Spring Cloud断路器的接口将网关路由包装在Spring Cloud断路器中。Spring Cloud CircuitBreaker 支持众多可用于Spring Cloud网关的库。其中Resilience4J 对于Spring Cloud来说是开箱即用的。

意思除了Resilience4J 之外,Spring Cloud还应该支持其他类型的断路器。但是具体还有哪些,官网并没有说。

Spring Cloud CircuitBreaker

Spring Cloud CircuitBreaker 我们后面会专门进行学习研究,今天的主要目标是Spring Cloud Gateway的CircuitBreaker GatewayFilter。不过既然CircuitBreaker GatewayFilter 官网说Spring Cloud CircuitBreaker支持多个断路器,那我们就大概看一下Spring Cloud CircuitBreaker,简单了解一下官网所说的Spring Cloud CircuitBreaker支持多个断路器的libraries具体是什么意思。

还是看官网,找到Spring Cloud CircuitBreaker的官网介绍:

在这里插入图片描述
Spring Cloud CircuitBreaker提供了一个对不同断路器实现的抽象,为应用提供了一组API,使得你(猿类们啊…)可以在自己应用中轻松选择适合你自己应用的断路器实现。

支持的断路器实现包括:

  1. Resilience4J
  2. Sentinel
  3. Spring Retry

官网文档并没有提到Hystrix,Hystrix是属于Netflix的组件,并不属于Spring Cloud CircuitBreaker,所以Spring有了自己的断路器,Hystrix就会被他主动抛弃(并不是说不支持了,只不过是,不亲了啊…)。

所以,概念梳理清楚了,Spring Cloud CircuitBreaker是一个对各断路器实现的抽象,可以灵活支持Resilience4J、Sentinel以及Spring Retry。而CircuitBreaker GatewayFilter 是Spring Cloud网关的一个断路器过滤器,该过滤器内部封装了Spring Cloud CircuitBreaker,可以支持Spring Cloud CircuitBreaker的各实现库包括Resilience4J、Sentinel及Spring Retry。

CircuitBreaker GatewayFilter官网提到Resilience4J是开箱即用的,所以,Resilience4J应该是CircuitBreaker GatewayFilter中断路器的默认实现。

CircuitBreaker GatewayFilter 应用

模块gateway的pom文件中引入Resilience4J:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><parent><artifactId>springCloud</artifactId><groupId>com.example</groupId><version>0.0.1-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><artifactId>springgateway</artifactId><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-circuitbreaker-reactor-resilience4j</artifactId></dependency></dependencies><properties><maven.compiler.source>17</maven.compiler.source><maven.compiler.target>17</maven.compiler.target></properties></project>

模块gateway的配置文件

spring:application:name: spring-gatewaycloud:gateway:routes:- id: path_route
#          uri: http://127.0.0.1:9090uri: lb://orderservicepredicates:- Path=/order/*filters:- name: Myargs:name: My own pre-filter- name: CircuitBreakerargs:name: myCircuitBreakerfallbackUri: forward:/fallbackstatusCodes: 500- id: orderfallback_routeuri: lb://orderservicepredicates:- Path=/fallback
eureka:client:service-url: # eureka servicedefaultZone: http://127.0.0.1:10086/eureka/
server:port: 9095

增加CircuitBreaker的配置,调用发生错误的话、或者返回的status code是500的话,则出发fallback。

fallback也可以通过路由配置到指定位置,比如我们案例中指向orderservice的fallback路径。

orderservice模块增加fallback请求的相应

增加一个controller:

package com.example.controller;import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
@Slf4j
public class FallbackController {@GetMapping("/fallback")public String fallback(){return "this is fallback from orderservice...";}
}

orderservice模块增加一个失败请求

修改orderservice,模拟一个失败请求,以及一个返回500的请求,以便测试:

    @GetMapping("/orderCount")public String orderCount(@RequestParam int count, HttpServletRequest request, HttpServletResponse response){log.info("Come here to get Order....123===");if(count==500 || count==404){response.setStatus(count);}return "10/count:"+10/count+" from:"+serverPort;}

增加一个orderCount方法,判断请求参数后做返回,返回信息中包含了一个除法运算 10/count,这样我们请求参数count如果是500的话,会返回status code 500,请求参数count如果是0的话,将会触发服务端的 / by zero异常。

测试

启动Eureak模块、gateway模块、以及orderservice模块。

在这里插入图片描述
前端访问,首先送入count=0,触发服务端除零错误后,路由的fallback:
在这里插入图片描述
然后传入count=500,触发gateway的statusCode=500的fallback路由:
在这里插入图片描述
最后送入一个正常的count=1的值,获取到正常的返回:
在这里插入图片描述
OK,Spring Cloud gateway的CircuitBreaker GatewayFilte就到这里了,源码没有研究,还有,Spring Cloud的CircuitBreaker 也没有深入研究,下次。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python 自动化之修理PDF文件(二)

PDF文件_合并与拆分PDF文档Pro版本 文章目录 PDF文件_合并与拆分PDF文档Pro版本前言一、要做成什么样子二、主要用到的函数三、基本思路1.引入库2.创建用户输入模块3.确定主框架 四、文档合并代码模块1.用户输入和函数调用2.引导用户输入文档信息3.合并文档内容4.命名新文档生成…

玩转大数据13: 数据伦理与合规性探讨

1. 引言 随着科技的飞速发展&#xff0c;数据已经成为了现代社会的宝贵资产。然而&#xff0c;数据的收集、处理和利用也带来了一系列的伦理和合规性问题。数据伦理和合规性不仅关乎个人隐私和权益的保护&#xff0c;还涉及到企业的商业利益和社会责任。因此&#xff0c;数据…

RocketMQ-源码架构二

梳理一些比较完整&#xff0c;比较复杂的业务线 消息持久化设计 RocketMQ的持久化文件结构 消息持久化也就是将内存中的消息写入到本地磁盘的过程。而磁盘IO操作通常是一个很耗性能&#xff0c;很慢的操作&#xff0c;所以&#xff0c;对消息持久化机制的设计&#xff0c;是…

Ubuntu 22安装PHP环境

参考博客为《练习 0&#xff08;2/2&#xff09;&#xff1a;Ubuntu 环境下安装PHP&#xff08;PHP-FPM&#xff09;》和《原生态Ubuntu部署LAMP环境 PHP8.1MySQLApache》 sudo apt-get install -y php7.4想要安装php7.4&#xff0c;发现安装的是php8.1。 完成如下图&#xf…

轮转数组00

题目链接 轮转数组 题目描述 注意点 使用空间复杂度为 O(1) 的 原地 算法解决这个问题 解答思路 本题有多种思路&#xff0c;一种是复制nums数组&#xff0c;然后将k个位置后的值赋值给当前位置即可&#xff0c;但是空间复杂度为O(n)还有一种思路是先将整个数组进行翻转&a…

21、命令执行

文章目录 一、命令执行概述1.1 基本定义1.2 原理1.3 两个条件1.4 命令执行漏洞产生的原因1.5 管道符号和通用命令符 二、远程命令执行2.1 远程命令执行相关函数2.2 远程命令执行漏洞的利用 三、系统命令执行3.1 相关函数3.2 系统命令执行漏洞利用 四、命令执行漏洞防御 一、命令…

LeetCode力扣每日一题(Java):58、最后一个单词的长度

一、题目 二、解题思路 1、我的思路 先将字符串转换成字符数组 由于我们需要获取最后一个单词的长度&#xff0c;所以我们从后往前遍历字符数组 我们还需判断所遍历的字符是不是字母&#xff0c;即判断每个字符对应的ASCII值即可&#xff0c;用计数器count来储存单词长度 …

数据结构中处理散列冲突的四种方法

1 开放定址法 1.1 定义 开放定址法就是一旦发生了冲突&#xff0c;就去寻找下一个空的散列地址 1.2 要求 只要散列表足够大 空的散列地址总能找到&#xff0c;并将记录存入 1.3 线性探测法 使用该公式用于解决冲突的开放定址法称为线性探测法 对于线性探测法&#xff0c…

PCL点云处理之判断某一点在三角形的内部、外部、还是边上(二百二十二)

PCL点云处理之判断某一点在三角形的内部、外部、还是边上(二百二十二) 一、算法介绍二、算法实现1.代码2.结果一、算法介绍 点与三角形的位置共有三种: 1 内部 2 外部 3 点刚好在边上 (这个判断还是很有必要的,应用广泛,下面代码复制粘贴即可使用,纯C++实现) 二、算…

C语言union联合体(共用体)

一、定义 联合体&#xff08;共用体&#xff09;是一种特殊的自定义的数据类型&#xff0c;它包含一系列的成员变量&#xff0c;这些成员变量共用一块内存空间。 语法&#xff1a; union 标识符 { data_type 标识符1; data_type 标识符2; . . . dat…

leetcode 144. 二叉树的前序遍历

这里面有一个知识点我没有详细讲&#xff08;求节点个数&#xff09;&#xff0c;大概我后期会讲一下&#xff0c;先了解这题思路即可 144. 二叉树的前序遍历 题目 给你二叉树的根节点 root &#xff0c;返回它节点值的 前序 遍历。 题目链接 力扣&#xff08;LeetCode&#xf…

【初阶C++】入门(超详解)

C入门 前言1. C关键字(C98)2. 命名空间2.1 命名空间定义2.2 命名空间使用2.3嵌套命名空间 3. C输入&输出4. 缺省参数4.1 缺省参数概念4.2 缺省参数分类 5. 函数重载5.1 函数重载概念5.2 C支持函数重载的原理--名字修饰(name Mangling) 6. 引用6.1 引用概念6.2 引用特性6.3 …

ARM day8

1.题目&#xff1a;主机获取从机里面的温湿度数据&#xff0c;并打印出来 结果&#xff1a; 代码&#xff1a; main.c #include "iic.h"#include "si7006.h"void delay(int ms){int i,j;for(i0;i<ms;i){for(j0;j<2000;j);}}int main(){short tem;…

【价值几十万的仿抖音直播电商系统源码共享】

当下&#xff0c;传统的图文电商模式已经走向没落&#xff0c;以抖音为首的直播电商模式备受用户追捧&#xff0c;它具有实时直播和强互动的特点&#xff0c;是传统电商所不具备的优势。而且&#xff0c;当前正是直播电商的红利期&#xff0c;很多主播和品牌商都通过直播电商业…

17.认识下Docker之docker的核心原理(2)

1.容器-我的小世界 不知道大家看没看过小说《完美时间》&#xff0c;里面石昊经常进入一个小世界在里面与世隔绝的修炼或者战斗&#xff0c;总之就是在一个完全封闭的空间里做他想做的事情而与外界隔离&#xff0c;不受侵扰。通过前面的分析我们知道&#xff0c;Namepace让应用…

7.25 SpringBoot项目实战【我的借阅记录】

文章目录 前言一、编写控制器二、编写服务层三、Git提交前言 至此,我们已经实现 图书借阅、收藏、评论等场景,最后来到【还书】场景,首先 还书的 入口 一般 是【我的借阅记录】,在这里可以根据产品设计,对于需要归还的书 操作【还书】,所以本文来实现【我的借阅记录】。…

arm平台编译so文件回顾

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、几个点二、回顾过程 1.上来就执行Makefile2.编译第三方开源库.a文件 2.1 build.sh脚本2.2 Makefile3.最终编译三、其它知识点总结 前言 提示&#xff1a;这…

Python 小程序之PDF文档加解密

PDF文档的加密和解密 文章目录 PDF文档的加密和解密前言一、总体构思二、使用到的库三、PDF文档的加密1.用户输入模块2.打开并读取文档数据3.遍历保存数据到新文档4.新文档进行加密5.新文档命名生成路径6.保存新加密的文档 四、PDF文档的解密1.用户输入模块2.前提准备2.文件解密…

css 纯样式实现绘出进度条

效果&#xff1a; css代码&#xff1a; .bar{height: 14px;width: 100%;font-size: 10px;margin-top: 5px;background-color: #f5f5f5;}.bar::before{display: block;counter-reset: progress var(--precent); content: ;width: calc(1% * var(--precent));color: #fff;height:…

无公网IP环境Windows系统使用VNC远程连接Deepin桌面

&#x1f525;博客主页&#xff1a; 小羊失眠啦. &#x1f3a5;系列专栏&#xff1a;《C语言》 《数据结构》 《Linux》《Cpolar》 ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;…