gateway中的局部过滤器_Spring Cloud Gateway中的过滤器工厂:重试过滤器

Spring Cloud Gateway基于Spring Boot 2,是Spring Cloud的全新项目,该项目提供了一个构建在Spring 生态之上的API网关。本文基于的Spring Cloud版本为Finchley M9,Spring Cloud Gateway对应的版本为2.0.0.RC1。

Spring Cloud Gateway入门一文介绍了全新的Spring Cloud Gateway的一些基础应用。本文将会介绍Spring Cloud Gateway重试过滤器。

过滤器

GatewayFilter网关过滤器用于拦截和链式处理web请求,可以实现横切的、与应用无关的需求,比如安全、访问超时的设定等等。

public interface GatewayFilter {

Mono filter(ServerWebExchange exchange, GatewayFilterChain chain);

}

接口中定义了唯一的方法#filter,处理web请求,并且可以通过给定的过滤器链传递到下一个过滤器。该接口有多个实现类,下面看一下该接口的类图。

GatewayFilter.png

从类图可以看到,GatewayFilter有两个实现类,但是在源码中寻找该接口的用法会发现,在GatewayFilterFactory实现类中有内部匿名类,实际是返回了一个 GatewayFilter 内部实现类。

Spring Cloud Gateway提供了很多种类的过滤器工厂,网关过滤器有近二十个实现类,总得说来可以分为七类:Header、Parameter、Path、Status、Redirect跳转、Hystrix熔断和RateLimiter限流等。

重试过滤器

请求的重试

当转发到代理服务时,遇到指定的服务端Error,如httpStatus为500时,我们可以设定重试几次。除了对指定的异常重试之外,还可以指定请求的方法,GET或POST。

实验场景涉及到:网关服务和用户服务。客户端请求经过网关,请求用户服务的API接口,遇到指定的异常时,进行重试。

项目准备

示例启动两个服务:Gateway-Server和user-Server。模拟的场景是,客户端请求后端服务,网关提供后端服务的统一入口。后端的服务都注册到服务发现Consul(搭建zk,Eureka都可以,笔者比较习惯使用consul)。网关通过负载均衡转发到具体的后端服务。

用户服务

用户服务注册到Consul上,并提供一个接口/test。

网关服务

引入网关的依赖,并进行相应配置。上一章已经讲过,这里不重复列出代码,具体见源码。

服务改造

网关服务

网关服务中,新增一个路由的定义retry_java,请求的判定是路径以/test为前缀的请求,并将请求转发到user服务。当遇到内部服务错误(状态码为500)时,设定重试的次数为2。当然该路由也可以通过网关服务的配置文件,效果是一样的。

@Bean

public RouteLocator retryRouteLocator(RouteLocatorBuilder builder) {

return builder.routes()

.route("retry_java", r -> r.path("/test/**")

.filters(f -> f.stripPrefix(1)

.retry(config -> config.setRetries(2).setStatuses(HttpStatus.INTERNAL_SERVER_ERROR)))

.uri("lb://user"))

.build();

}

用户服务

用户服务增加一个API接口,请求中传入参数key和count。

ConcurrentHashMap map = new ConcurrentHashMap<>();

@GetMapping("/exception")

public String testException(@RequestParam("key") String key, @RequestParam(name = "count", defaultValue = "3") int count) {

AtomicInteger num = map.computeIfAbsent(key, s -> new AtomicInteger());

int i = num.incrementAndGet();

log.warn("Retry count: "+i);

if (i < count) {

throw new RuntimeException("temporarily broken");

}

return String.valueOf(i);

}

这里主要是为了能配置网关请求次数的演示,count是指定的重试次数,默认为3,第一次和第二次都会抛出运行时异常(状态码为500),变量 i 是key对应的值,初始为0,每重试一次,i 会递增,直到 i 大于等于count的值。

测试结果

根据上面的实现,我们访问的地址为http://localhost:9090/test/exception?key=abc&count=2。

按照用户服务实现的逻辑,用户服务将会重试一次即可成功。用户服务的控制台日志信息如下:

Retry count: 1

java.lang.IllegalArgumentException: temporarily broken] with root cause

...

Retry count: 2

retry-result.jpg

控制台的信息和最后的响应结果可以看出,请求的重试执行成功。

小结

本文在Spring Cloud Gateway入门的基础上,介绍了Spring Cloud Gateway的过滤器相关概念,并具体介绍了其中的一个过滤器工厂:RetryGatewayFilterFactory。当转发到代理服务时,遇到指定的服务端Error,如httpStatus为500时,我们可以设定重试几次,应用重试过滤器。Spring Cloud Gateway提供了很多过滤器工厂的实现,后面文章将会介绍其中比较重要的过滤器,敬请关注。

源码地址

订阅最新文章,欢迎关注我的公众号

qrcode_for_gh_ca56415d4966_430.jpg

参考

Spring Cloud Gateway官方文档

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

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

相关文章

cocos2d-x for android配置 运行 Sample on Linux OS

1.从http://www.cocos2d-x.org/download下载稳定版 比如cocos2d-x-2.2 2.解压cocos2d-x-2.2.zip,比如本文将其解压到 /opt 目录下 3.运行 android-buildsetup.sh,运行之前需要先设置3个环境变量,如将以下变量写到文件 /etc/profile中 export ANDROID_SDK_ROOT/opt/android-sdk-…

转变馆藏

您是否曾经想替换过HashSet或HashMap使用的equals和hashCode方法&#xff1f; 或者有一个List的一些元素类型伪装成的List相关类型的&#xff1f; 转换集合使这成为可能&#xff0c;并且本文将展示如何实现。 总览 转换集合是LibFX 0.3.0的一项功能&#xff0c;该功能将在今天…

Spring Boot和Swagger UI

我已经一年没有从头开始开发Spring Web应用程序了&#xff0c;如果我不参加QA自动化工程师的培训&#xff0c;那么这段时间甚至会更长。 由于这个原因&#xff0c;我开发了一个示例REST应用程序。 除了Swagger&#xff0c;一切对我来说都很熟悉。 因此&#xff0c;我将描述我在…

mysql5.7.22打不开_windows下mysql-5.7.22-winx64突然启动不了,报错Could not open log file

本文摘自classinstance.cn。windows下mysql-5.7.22-winx64突然启动不了&#xff0c;感觉启动几秒钟后就自己关闭了&#xff0c;看了下启动日志&#xff1a;2019-08-25T10:57:08.389404Z 0 [Warning] option wait_timeout: unsigned value 31536000 adjusted to 21474832019-08-…

把python37添加到环境变量配置_关于在win 10上成功创建一个Django项目时遇到django-admin的手动配置环境变量问题。...

前言初学Python Web 在创建第一个Djang项目的时候出现了很多的问题&#xff0c;今天和大家分享并记录一下这次艰难的历程&#xff01;一、官网下载Python以及安装Django1、Python的下载安装链接&#xff1a;大家最好使用谷歌浏览器&#xff0c;因为翻译的很到位(大家下载最新版…

在Ant中显示路径

在博客文章Java and Ant Properties Refresher和Ant <echoproperties /> Task中 &#xff0c;我写了一篇关于如何了解Ant构建如何看到属性的文章&#xff0c;这有助于更好地理解构建。 通常情况下&#xff0c;在构建过程中看到构建中使用的各种路径也很有价值&#xff0c…

Azure开发者任务之一:解决Azure Storage Emulator初始化失败

初学Windows Azure&#xff1a; 我打算开始学习Windows Azure。我安装了Azure SDK&#xff0c;然后在“Cloud”标签下选择Windows Azure模板&#xff0c;创建了一个项目&#xff0c;然后又创建了一个Web角色。 在aspx文件上&#xff0c;我只添加了一个标签&#xff0c;但是当我…

java运行python3_python写脚本并用java调用python(三)

1)编写mytest.py完成一个简单加法计算# coding:utf8#def 表示一个方法 adderdef adder(a, b):return ab#这里执行adder方法并打印出结果print adder(1,2)2)运行以上脚本方式如图12 3 打印成功&#xff01;3)java调用python脚本的两种方式Process process Runtime.getRuntime(…

mysql单源多表同步单库单表_MySQL主从复制单表或者多表

MySQL数据库安装不过多的介绍了&#xff1a;必须保证2个数据库的版本一致。 主数据库&#xff1a;192.168.0.43 从数据库&#xff1a;192.168.0.53 修改43主数据MySQL数据库安装不过多的介绍了&#xff1a;必须保证2个数据库的版本一致。主数据库&#xff1a;192.168.0.43从数据…

xshell 秘钥连接_如何使用PuTTY和xshell 分别远程连接linux,并配置秘钥认证

使用PuTTY 连接并配置密钥认证第一步&#xff1a;下载PuTTY下载 .zip 64位的电脑 32位的putty也能用第二步&#xff1a;配置基本信息打开 PuTTY端口默认是22 (端口是可以改的)ip 地址如果忘记&#xff0c;ifconfig 查看一下Load >Open输入登录名 密码即可完成登录若出现上…

滨河新区(黄河楼)夜景

转载于:https://www.cnblogs.com/ysx4221/p/3454517.html

java 门面模式_Java门面模式

一、简介隐藏系统的复杂性&#xff0c;对外提供统一的访问入口&#xff0c;外部系统访问只通过此暴露出的统一接口访问。是一种结构型模式。封装子系统接口的复杂性&#xff0c;提供统一的对外接口&#xff0c;能够使子系统更加简单的被使用。二、结构及使用场景如上所示&#…

selenium java测试_java+selenium 自动化测试

在项目上使用自动化测试&#xff0c;是为了跑主流程的回归测试&#xff0c;提高测试效率&#xff0c;在每个测试版本中把主要的精力放在发版内容新增的需求中&#xff1b;根据项目的功能模块&#xff0c;把业务主流程和使用频率高的功能抽取出来进行自动化测试&#xff0c;作为…

java 文件上传 servlet_java文件上传-原始的Servlet方式

前言&#xff1a;干了这几个项目&#xff0c;也做过几次文件上传下载&#xff0c;要么是copy项目以前的代码&#xff0c;要么是百度的&#xff0c;虽然做出来了&#xff0c;但学习一下原理弄透彻还是很有必要的。刚出去转了一圈看周围有没有租房的&#xff0c;在北京出去找房子…

基于SharePoint 的企业信息平台架构

转载于:https://www.cnblogs.com/jackljf/p/3589224.html

java freemarker 分页_10小时入门java开发04 springboot+freemarker+bootstrap快速实现分页功能...

本节是建立在上节的基础上&#xff0c;上一节给大家讲了管理后台表格如何展示数据&#xff0c;但是当我们的数据比较多的时候我们就需要做分页处理了。这一节给大家讲解如何实现表格数据的分页显示。准备工作还是老规矩&#xff0c;看效果图可以看出我们实现了如下功能1&#x…

java $p_javap -c命令详解

一直在学习Java,碰到了很多问题&#xff0c;碰到了很多关于i和i的难题&#xff0c;以及最经典的String str "abc" 共创建了几个对象的疑难杂症。 知道有一日知道了java的反汇编 命令 javap。现将学习记录做一小结&#xff0c;以供自己以后翻看。如果有错误的地方&a…

hibernate 映射四多对一双向映射

学生和班级的例子来说&#xff0c;多个学生可以对应一个班级。 1.站在学生角度来说&#xff0c;学生就是多端。那么我们可以通过多对一来维护2者的关系。 2.站在班级的角度来说&#xff0c;班级就是一端。那么我们可以通过一对多啦维护2者的关系。 3.我们也可以双向关联两者的关…

django mysql 表单_Python Django 表单提交数据到mysql并展示

首先1&#xff1a; 新建项目userproject&#xff0c; 新建应用childName2&#xff1a; 这是childName文件目录&#xff0c;templates文件夹放insert.html 与 show.html3&#xff1a; insert.html 与 show.html/**insert.html**/用户登录12345678910111213141516Title信息展示用…

体验最火的敏捷——SCRUM(厦门,2014.1.4)

1.概述SCRUM是当前最火的一种敏捷开发方法&#xff0c;有用户故事、冲刺、燃尽图等很多很酷的玩法&#xff0c;有牛B的产品负责人、SCRUM Master&#xff0c;有超强的自组织团队。本沙龙将为您展现当前最火最酷的敏捷开发方法&#xff01;内容大纲&#xff1a;1)SCRUM是神马东西…