分布式微服务 - 3.服务网关 - 4.Gateway

分布式微服务 - 3.服务网关 - 4.Gateway

项目示例:

  • 项目示例 - 3.服务网关 - 3.Gateway

内容提要:

  • 基本使用:配置方式、代码方式
  • 内置断言、自定义断言
  • 内置局部过滤器、自定义内置和全局过滤器

文档:

  • 官网
  • 官网文档

基本使用

配置方式

  1. 引入依赖:使用gateway依赖时,不能同时引入spring-boot-starter-web依赖。gateway配合nacos使用别名进行路由,需要使用负载均衡(而nacos依赖不包含),因此要单独引入loadbalancer依赖
        <!--gateway--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-loadbalancer</artifactId></dependency>
  1. application.yml配置
spring:cloud:gateway:discovery:locator:# 从服务注册中心根据别名来进行路由enabled: trueroutes:# 路由Id,自定义,唯一即可- id: nacos-provider-test# 成功匹配后,要转换成的路由地址(配合服务注册中心使用别名),需要负载均衡依赖uri: lb://nacos-provider# 成功匹配后,要转换成的路由地址(不配合服务注册中心)#uri: http://localhost:8001# 断言predicates:# 路径匹配的进行路由- Path=/**

代码方式

@Configuration
public class GatewayConfig {@Beanpublic RouteLocator myRouteLocator(RouteLocatorBuilder builder) {RouteLocatorBuilder.Builder routes = builder.routes();routes.route("nacos-provider-test", r -> r.path("/**").uri("lb://nacos-provider"));return routes.build();}}

路由配置

路由是由ID、URI、一系列的断言和过滤器组成的。断言可以匹配请求中的所有内容,如果请求与断言相匹配则进行路由。URI是进行路由时,要转换成的路由地址。在满足断言之后,过滤器可以修改向URI发送的请求和返回的响应。

断言

gateway本身内置许多断言(RoutePredicateFactory接口的实现类),多个断言可以组合使用。

当一个请求可以满足多个路由的断言时,会按定义的顺序找第一个满足断言的路由。

内置断言

内置断言中用到的时间格式可以用代码ZonedDateTime.now() 获取,也可以指定时间区域ZonedDateTime.now(ZoneId.of("Asia/Shanghai"))

常用内置断言

  • Path
    • 请求满足路径正则表达式则匹配
    • 如:Path=/product-serv/segment,/server-b/**
  • Method
    • 请求满足指定请求方式则匹配
    • 如:Method=GET,POST
  • Cookie
    • 请求cookie中存在指定key且value满足正则表达式则匹配
    • 如:Cookie=key, valueReg
  • Header
    • 请求头中存在指定key且value满足正则表达式则匹配
    • 如:Header=X-Request-Id, \d+
  • Query
    • 请求带有指定参数且value满足正则表达式则匹配
    • 如:Query=name, fly
  • RemoteAddr
    • 请求的ip在指定ip/mask内则匹配
    • 如:RemoteAddr=192.168.1.0/24
  • Host
    • 请求的host满足正则表达式则匹配
    • 如:Host=localhost:8080,localhost:8081
  • After
    • 请求时间在指定时间之后则匹配,可用于在未来指定时间上线服务
    • 如:After=2024-01-01T23:59:59.123+08:00[Asia/Shanghai]
  • Before
    • 请求时间在指定时间之前则匹配,可用于服务在指定时间内可访问
    • 如:Before=2024-01-01T23:59:59.123+08:00[Asia/Shanghai]
  • Between
    • 请求时间在指定时间之间则匹配,可用于服务在指定时间内可访问
    • 如:Between=2024-01-01T23:59:59.123+08:00[Asia/Shanghai], 2024-01-02T23:59:59.123+08:00[Asia/Shanghai]
自定义断言
  1. 创建类并@Component注入:类名要求是XxxRoutePredicateFactory(配置文件中使用断言时,断言名为Xxx)
@Component
public class CustomRoutePredicateFactory
  1. 创建静态内部类:用于接收参数,因此要有属性值和对应的getter和setter
    @Getter@Setterpublic static class Config {private String key;private String value;}
  1. 继承抽象类:继承断言工厂类AbstractRoutePredicateFactory并确定泛型为内部类
@Component
public class CustomRoutePredicateFactory extends AbstractRoutePredicateFactory<CustomRoutePredicateFactory.Config>
  1. 构造方法
    public CustomRoutePredicateFactory() {super(Config.class);}
  1. 重写读配置文件方法:方法读取配置文件的参数值,赋值到内部类中的属性上(顺序必须与yml文件中的配置顺序对应)
    @Overridepublic List<String> shortcutFieldOrder() {return Arrays.asList("key", "value");}
  1. 重写apply方法:返回true路由成功,返回false返回404(serverWebExchange可以获取很多内容)
    @Overridepublic Predicate<ServerWebExchange> apply(Config config) {return new Predicate<ServerWebExchange>() {@Overridepublic boolean test(ServerWebExchange serverWebExchange) {List<String> strings = serverWebExchange.getRequest().getHeaders().get(config.key);if (strings==null || strings.isEmpty())return false;return config.value.equals(strings.get(0));}};}
  1. yml文件中配置断言
Custom=test, a

过滤器

过滤器分为局部过滤器和全局过滤器,局部过滤器仅在配置的路由上起效,而全局过滤器对所有的路由都起效。

内置局部过滤器

常用内置过滤器

  • StripPrefix

    • 转换成路由之前,去掉URL中前面几节
    • 如:StripPrefix=1
  • PrefixPath

    • 给请求路径path添加前缀
    • 如:PrefixPath=/nacos
  • AddRequestParameter

    • 添加请求参数
    • 如:AddRequestParameter=name,test
  • RemoveRequestParameter

    • 删除请求参数
    • 如:RemoveRequestParameter=name
  • AddRequestHeader

    • 在请求头上添加参数
    • 如:AddRequestHeader=key,value
  • SetRequestHeader

    • 修改请求头上指定参数的值,参数不存在时创建
    • 如:SetRequestHeader=myHeader, test
  • RemoveRequestHeader

    • 删除请求头上的指定参数
    • 如:RemoveRequestHeader=MyHeader
  • AddResponseHeader

    • 在响应头上添加参数
    • 如:AddRequestHeader=key,value
  • SetResponseHeader

    • 修改响应头上指定参数的值,参数不存在时创建
    • 如:SetResponseHeader=addHeader, test
  • RewriteResponseHeader

    • 修改响应头上指定参数的值,第一个参数是key,第二个参数是正则表达式匹配修改前的值,第三个参数是修改后的值
    • 如:RewriteResponseHeader=addHeader,test1,test
  • RemoveResponseHeader

    • 删除响应头上的指定参数
    • 如:RemoveResponseHeader=addHeader
  • SetStatus

    • 设置返回的响应码
    • 如:SetStatus=500
  • RedirectTo

    • 重定向,两个参数分别是重定向300系列状态码和URL
    • 如:RedirectTo=302, https://www.baidu.com
  • RewritePath

    • 重写请求路径
    • 如:RewritePath=/test1/?(?.*), /nacos/${segment}
自定义局部过滤器
  1. 创建类并@Component注入:类名要求是XxxGatewayFilterFactory(配置文件中使用过滤器时,过滤器名为Xxx)
@Component
public class CustomGatewayFilterFactory
  1. 创建静态内部类:用于接收参数,因此要有属性值和对应的getter和setter
    @Getter@Setterpublic static class Config {private String key;private String value;}
  1. 继承抽象类:继承过滤器工厂类AbstractGatewayFilterFactory并确定泛型为内部类
@Component
public class CustomGatewayFilterFactory extends AbstractGatewayFilterFactory<CustomGatewayFilterFactory.Config>
  1. 构造方法
    public CustomRoutePredicateFactory() {super(Config.class);}
  1. 重写读配置文件方法:方法读取配置文件的参数值,赋值到内部类中的属性上(顺序必须与yml文件中的配置顺序对应)
    @Overridepublic List<String> shortcutFieldOrder() {return Arrays.asList("key", "value");}
  1. 重写apply方法:可以在chain.filter(exchange).then之前操作request,之后操作response(serverWebExchange可以获取很多内容)
    @Overridepublic GatewayFilter apply(Config config) {return new GatewayFilter() {@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {// pre操作return chain.filter(exchange).then(Mono.fromRunnable(() -> {// 异步post操作}));}};}
  1. yml文件中配置断言
Custom=test, a
自定义全局过滤器
  1. 创建GlobalFilter、Ordered接口实现类并@Component注入
@Component
public class CustomGlobalFilter implements GlobalFilter, Ordered
  1. 重写getOrder方法:方法返回的值越小,过滤器的优先级越高
    @Overridepublic int getOrder() {return 0;}
  1. 重写filter方法
    @Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {// pre操作return chain.filter(exchange).then(Mono.fromRunnable(() -> {// 异步post操作}));}

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

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

相关文章

重建3D结构方式 | 显式重建与隐式重建(Implicit Reconstruction)

在3D感知领域&#xff0c;包括3D目标检测在内&#xff0c;显式重建和隐式重建是两种不同的方法来表示和处理三维数据。它们各自有优势和局限&#xff0c;适用于不同的场景和需求。 显式重建&#xff08;Explicit Reconstruction&#xff09; 显式重建是指直接构建场景或物体的三…

云计算 3月12号 (PEX)

什么是PXE&#xff1f; PXE&#xff0c;全名Pre-boot Execution Environment&#xff0c;预启动执行环境&#xff1b; 通过网络接口启动计算机&#xff0c;不依赖本地存储设备&#xff08;如硬盘&#xff09;或本地已安装的操作系统&#xff1b; 由Intel和Systemsoft公司于199…

DEAP 自定义交叉操作

在遗传算法中&#xff0c;使用DEAP库来实现自定义的交叉操作可以非常灵活。如果你想模拟多个染色体的情况&#xff0c;通过在染色体的特定区间进行交叉&#xff0c;你需要自定义一个交叉函数。以下是一个示例&#xff0c;展示如何实现一个自定义的交叉函数&#xff0c;该函数允…

libigl 网格面片随机赋色

文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 libigl的赋色方式非常简单,它统一由一个Eigen矩阵来进行管理,我们在进行赋色等操作时,只需要修改该矩阵即可(法向量等特征也是类似的操作)。 二、实现代码 //igl #include <igl/readOBJ.h> #include &l…

JVM简单调优

jdk自带了许多对jvm进行监控的程序&#xff0c;例如JVisualVM、jstack等等。 现在进行一些简单的对jvm的监控。 我们可以使用JVisualVM来对堆区进行图形化监控。 我们可以在命令行输入jvisualvm&#xff0c;然后就进入了jvisualvm的图形化界面。 然后我们随便执行一个主方法…

CDQ分治+树状数组,LOJ6270. 数据结构板子题

一、题目 1、题目描述 有 n 个区间&#xff0c;第 i 个区间是 [l_i,r_i]&#xff0c;它的长度是 r_i-l_i。 有 q 个询问&#xff0c;每个询问给定 L,R,K&#xff0c;询问被 [L,R] 包含的且长度不小于 K 的区间数量。 你想&#xff0c;像这种板子题&#xff0c;你随手写&#x…

gen_arrow_contour_xld

生成一个箭头轮廓算子 gen_arrow_contour_xld( : Arrow : Row1, Column1, Row2, Column2, HeadLength, HeadWidth : ) 该算子一般配合 area_center (region, Area, Row, Column) orientation_region (region, Phi) 算子使用&#xff0c;生成一个箭头轮廓。 area_center_xld…

C#+datax实现定时增量同步

要使用C#和DataX实现定时增量同步&#xff0c;你可以使用以下步骤&#xff1a; 1. 安装DataX&#xff1a;首先&#xff0c;确保你已经安装了DataX。你可以从DataX的官方仓库中获取最新版本。 2. 配置DataX 任务&#xff1a;创建一个DataX任务&#xff0c;定义源&#xff08;sou…

springcloud gateway网关动态配置限流

上一篇记录了gateway网关的基础功能和配置&#xff0c;并且使用了默认的限流功能。 springcloud gateway网关-CSDN博客 这里简单记录一下gateway网关集成mybatisPlus实现动态限流。gateway网关默认的限流方式各项限流参数都是在配置文件中配置&#xff0c;不够灵活&#xff0…

【LLMs+小羊驼】23.03.Vicuna: 类似GPT4的开源聊天机器人( 90%* ChatGPT Quality)

官方在线demo: https://chat.lmsys.org/ Github项目代码&#xff1a;https://github.com/lm-sys/FastChat 官方博客&#xff1a;Vicuna: An Open-Source Chatbot Impressing GPT-4 with 90% ChatGPT Quality 模型下载: https://huggingface.co/lmsys/vicuna-7b-v1.5 | 所有的模…

STM32输入捕获频率和占空比proteus仿真失败

这次用了两天的时间来验证这个功能&#xff0c;虽然实验没有成功&#xff0c;但是也要记录一下&#xff0c;后面能解决了&#xff0c;回来再写上解决的办法&#xff1a; 这个程序最后的实验结果是读取到的CCR1和CCR2的值都是0&#xff0c;所以没有办法算出来频率和占空比。 还…

如何创建Gitflow图表

如何创建Gitflow图表 drawio是一款强大的图表绘制软件&#xff0c;支持在线云端版本以及windows, macOS, linux安装版。 如果想在线直接使用&#xff0c;则直接输入网址drawon.cn或者使用drawon(桌案), drawon.cn内部完整的集成了drawio的所有功能&#xff0c;并实现了云端存储…

排序算法之快速排序算法介绍

目录 快速排序介绍 时间复杂度和稳定性 代码实现 C语言实现 c实现 java实现 快速排序介绍 快速排序(Quick Sort)使用分治法策略。 它的基本思想是&#xff1a;选择一个基准数&#xff0c;通过一趟排序将要排序的数据分割成独立的两部分&#xff1b;其中一部分的所有数据…

确定比赛名次-拓扑排序

题目链接&#xff1a;https://vjudge.net/problem/HDU-1285 邻接矩阵存储版 #include<iostream> #include<queue> #include<cstring> #include<functional> #include<vector> using namespace std; const int N 510; int n, m;int g[N][N], i…

CSS 面试题及答案

CSS 面试题及答案 问题&#xff1a;什么是盒模型&#xff08;Box Model&#xff09;&#xff1f; 答案&#xff1a; 盒模型是指在网页布局时&#xff0c;每个元素都被看作一个矩形盒子&#xff0c;包括内容区域、内边距、边框和外边距。这些部分组合在一起构成了元素的盒模型。…

C++Qt学习——添加资源文件

目录 1、创建好了文件之后&#xff0c;在左边空白处按下CtrlN&#xff0c;创建Qt 以及Qt Resource File 2、写入名称&#xff0c;点击下一步 3、可以发现已经创建好啦。 4、点击Add Prefix 5、写上前缀&#xff0c;最好加上斜杠 6、选择提前放好的图片或者icon 7、发…

安卓Java面试题 91- 100

91. 请描述一下Intent 和 IntentFilter ?Intent是组件的通讯使者,可以在组件间传递消息和数据。 IntentFilter是intent的筛选器,可以对intent的action,data,catgory,uri这些属性进行筛选,确定符合的目标组件🚀🚀🚀🚀🚀🚀92. 阐述什么是IntentService?有何优…

Python异步编程探究:深入理解asyncio的使用和原理【第130篇—asyncio】

Python异步编程探究&#xff1a;深入理解asyncio的使用和原理 随着计算机应用程序的复杂性不断增加&#xff0c;对于高效处理I/O密集型任务的需求也越来越迫切。在Python中&#xff0c;asyncio模块提供了一种强大的异步编程方式&#xff0c;使得开发者能够轻松地处理并发任务&…

Vulnhub - DC-1

希望和各位大佬一起学习&#xff0c;如果文章内容有错请多多指正&#xff0c;谢谢&#xff01; 个人博客链接&#xff1a;CH4SER的个人BLOG – Welcome To Ch4sers Blog DC-1 靶机下载地址&#xff1a;DC: 1 ~ VulnHub 0x01 信息收集 Nmap扫描目标主机&#xff0c;发现开…

Springboot 使用【过滤器】实现在请求到达 Controller 之前修改请求体参数和在结果返回之前修改响应体

文章目录 前情提要解决方案自定义 HttpServletRequest 包装类 RequestWrapper自定义 HttpServletResponse 包装类 ResponseWrapper自定义过滤器 MiddlewareFilter配置过滤器注解配置类 编写 Controller 测试 前情提要 在项目中需要使用过滤器 在请求调用 Controller 方法前修改…