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.hqwc.cn/news/264663.html

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

相关文章

DSP外部中断笔记

中断原理 三部分 注意 &#xff0c;外部中断使能&#xff0c;PIE使能&#xff0c;CPU中断使能 外部中断有7个&#xff0c;PIE有12组&#xff0c;一个组有8个中断复用。只有一个CPU中断可执行。 外部中断原理 1、外部中断概述 外部中断结构图 外部中断XINT1对应的是0到31GPIO…

C/C++常见面试题(二)

接前面C/C常见面试题&#xff08;一&#xff09;&#xff0c;继续巩固 目录 1 sizeof和strlen的区别 2 宏定义的陷进 3 不使用sizeof计算出类型或者变量所占的内存的字节数 4 给定一个数判断是否其是2的N次幂 5 C/C打印所在文件、行号、函数、日期&#xff0c;时间、遵循的…

Android P 9.0 增加以太网静态IP功能

效果图 一、Settings添加以太网的配置&#xff1a; 1、vendor\mediatek\proprietary\packages\apps\MtkSettings\res\xml\network_and_internet.xml <com.android.settingslib.RestrictedPreferenceandroid:key"ethernet_settings"android:title"string/et…

TailwindCSS 配置可视化检查器

问题 TailwindCSS 框架为我们提供了大量默认的类和属性&#xff0c;而且开发者也能够自定义类和配置。 对于初学者来说&#xff0c;这些配置其实是比较复杂的&#xff0c;这也是tailwindcss最大的入手成本&#xff0c;开发者的记忆负担和心智负担也都比较大。 有没有办法能够…

C语言动态内存经典笔试题分析

C语言动态内存经典笔试题分析 文章目录 C语言动态内存经典笔试题分析1. 题目一2. 题目二3. 题目三4. 题目四 1. 题目一 void GetMemory(char *p){p (char *)malloc(100);} void Test(void){char *str NULL;GetMemory(str);strcpy(str, "hello world");printf(str)…

html通过CDN引入Vue使用Vuex以及Computed、Watch监听

html通过CDN引入Vue使用Vuex以及Computed、Watch监听 近期遇到个需求&#xff0c;就是需要在.net MVC的项目中&#xff0c;对已有的项目的首页进行优化&#xff0c;也就是写原生html和js。但是咱是一个写前端的&#xff0c;写html还可以&#xff0c;.net的话&#xff0c;开发也…

309. 买卖股票的最佳时机含冷冻期(leetcode) 动态规划思想

文章目录 前言一、题目分析二、算法原理1.状态表示2.状态转移方程3.初始化边界条件4.填表顺序5.返回值是什么 三、代码实现总结 前言 在本文章中&#xff0c;我们将要详细介绍一下Leetcode中买卖股票的最佳时机含冷冻期相关的内容&#xff0c;本题采用动态规划的思想解决 一、…

mybatis多表映射-对多关联

1、建库建表 create database mybatis-example; use mybatis-example; create table t_book (bid varchar(20) primary key,bname varchar(20),stuid varchar(20) ); insert into t_book values(b001,Java,s001); insert into t_book values(b002,Python,s002); insert into …

基于Pytorch框架深度学的垃圾分类智能识别系统

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 垃圾分类智能识别系统是一种基于深度学习技术的智能系统&#xff0c;用于对垃圾进行分类和识别。它使用Pytorch框架…

php实现个性化域名(短网址)和个性化登录模版的解决方案

在PHP中&#xff0c;个性化域名通常指的是根据用户或业务需求动态生成具有特定规律的子域名。实现个性化域名的方法主要依赖于服务器配置和路由规则。下面是一些基本的步骤和考虑因素&#xff0c;以帮助你了解如何个性化域名&#xff0c;并了解这样做的好处。 如何实现个性化域…

XML学习及应用

介绍XML语法及应用 1.XML基础知识1.1什么是XML语言1.2 XML 和 HTML 之间的差异1.3 XML 用途 2.XML语法2.1基础语法2.2XML元素2.3 XML属性2.4XML命名空间 3.XML验证3.1xml语法验证3.2自定义验证3.2.1 XML DTD3.2.2 XML Schema3.2.3PCDATA和CDATA区别3.2.4 参考 1.XML基础知识 1…

App备案、ios备案Bundle ID查询、公钥信息、SHA-1值

App备案、ios备案Bundle ID查询、公钥信息、SHA-1值 Bundle ID这个就不说了&#xff0c;都知道是啥&#xff0c;主要说公钥信息和SHA-1值的获取 打开钥匙串访问&#xff0c;找到当前需要备案App的dis证书&#xff0c;如下&#xff1a; #####右键点击显示简介 #####可以看…