news 2026/2/17 2:22:07

4、Gateway

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
4、Gateway

Spring Cloud Gateway主要功能:

  • 反向代理
  • 认证鉴权
  • 流量控制
  • 熔断
  • 日志监控

官方解释:

客户端SpringCloud Gateway发出请求,然后在Gateway Handler Mapping中找到与之请求相匹配的路由,将其发送到Gateway Web Handler,Handler再通过指定的过滤器链来将请求发送到我们实际的服务执行业务逻辑,然后返回。
过滤器之间用虚线分开是因为过滤器可能会发在代理请求之前(“pre”)或之后(“post”)执行业务逻辑,这样,Filter在“pre”类型的过滤器可以做参数校验,权限校验,流量监控,日志输出,协议转换等;在“post”类型的过滤器可以做响应内容,响应头的修改,日志的输出,流量监控等有着非常重要的作用


一、安装

1、新建一个微服务

1.1、新建gateway子模块

1.2、引入依赖
gateway服务依赖

<dependencies> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-loadbalancer</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-gateway</artifactId> </dependency> </dependencies>
2、配置服务

2.1、创建启动类

@SpringBootApplicationpublicclassMdxShopGateWayApplication{publicstaticvoidmain(String[]args){SpringApplication.run(MdxShopGateWayApplication.class,args);}}

2.2、创建application.yml配置文件

spring:application:name:gatewaycloud:nacos:server-addr:http://192.168.88.139:8848discovery:username:nacospassword:nacosserver:port:80

二、配置路由规则

springcloud 提供了两种方式

  • 通过配置文件的方式进行配置
  • 通过编码的方式进行配置

1、配置文件

创建application-route.yml文件

application-route.yml:

spring:cloud:gateway:routes:-id:order-serviceuri:lb://service-order#lb = load balancer(负载均衡)predicates:# 断言-Path=/order/**order:0# 路由的优先级, 越小优先级越高(默认为0)-id:product-serviceuri:lb://service-productpredicates:-Path=/product/**

记得在application.yml中引入:

spring:profiles:include:route
基础原理

路由断言主要用来判断路由的规则。
配置文件中写的断言规则只是字符串,这些字符串会被Predicate Factory读取并处理。
例如Path=/user/**是按照路径匹配,这个规则是由org.springframework.cloud.gateway.handler.predicate.PathRoutePredicateFactory类来处理。

像这样的断言工厂在SpringCloudGateway还有十几个:

名称说明示例
After是某个时间点后的请求- After=2022-01-20T14:32:27.789-07:00[Asia/Shanghai]
Before是某个时间点之前的请求- Before=2022-04-13T15:14:47.433+08:00[Asia/Shanghai]
Between是某两个时间点之前的请求- Between=2021-01-20T17:42:47.789-07:00[Asia/Shanghai], 2023-01-21T17:42:47.789-07:00[Asia/Shanghai]
Cookie请求必须包含某些cookie- Cookie=chocolate
Header请求必须包含某些header- Header=asd, cas
Host请求必须是访问某个host(域名)- Host=baidu.com, jd.com
Method请求方式必须是指定方式- Method=GET,POST
Path请求路径必须符合指定规则- Path=/user/{params},/card/**
Query请求参数必须包含指定参数- Query=name, Jack
RemoteAddr请求者的ip必须是指定范围- RemoteAddr=192.168.1.1/24
Weight权重处理

实际使用时,根绝业务要求选择使用即可。
不过一般来讲,最常用的是使用Path这种断言工厂,仅用它就能满足常见的需求了。

2、编码配置


三、过滤器

过滤器执行的顺序:

  1. 请求先 依次通过每个过滤器的前置过滤
  2. 然后 倒序的通过每个过滤器的后置过滤

常用的几个有:

名称说明
AddRequestHeader给当前请求添加一个请求头
RemoveRequestHeader移除请求中的一个请求头
AddResponseHeader给响应结果中添加一个响应头
RemoveResponseHeader从响应结果中移除有一个响应头
RequestRateLimiter限制请求的流量
RewritePath进行路由转发

1、局部过滤器

2、全局过滤器

spring:cloud:gateway:routes:-id:user-serviceuri:lb://userservicepredicates:-Path=/user/**default-filters:# 默认过滤器配置-AddRequestHeader=token,test# 添加请求头

四、自定义全局路由过滤器

有时候SpringCloudGateWay提供的过滤器工厂不能满足自己的要求。
可能有时候需要在过滤时做一些其它的逻辑操作。
那么这时候可以选择使用java代码自定义全局过滤器。

代码示例:

@Component@Slf4jpublicclassRtGlobalFilterimplementsGlobalFilter,Ordered{@OverridepublicMono<Void>filter(ServerWebExchangeexchange,GatewayFilterChainchain){ServerHttpRequestrequest=exchange.getRequest();ServerHttpResponseresponse=exchange.getResponse();StringrequestURI=request.getURI().getPath();longstartTime=System.currentTimeMillis();log.info("请求【{}】开始:时间:{}",requestURI,startTime);// =========== 以上是前置逻辑 ===========Mono<Void>filter=chain.filter(exchange).doFinally((result)->{// =========== 以下是后置逻辑 =========== long endTime = System.currentTimeMillis();log.info("请求【{}】结束时间:{},耗时:{}ms",requestURI,endTime,endTime-startTime);});// 放行returnfilter;}@OverridepublicintgetOrder(){return0;}}

当有多个过滤器时,Order的值决定了过滤器的执行顺序。

数值越大优先级越低, 负的越多, 优先级越高。
主要有两种方式
1,如上述代码这样
2,使用@Order注解

五、全局跨域

只需要修改一下配置即可

spring:cloud:gateway:globalcors:cors-configurations:'[/**]':# 匹配所有路径allowed-origin-patterns:"*"# 允许所有源allowed-headers:"*"# 允许所有请求头allowed-methods:"*"# 允许所有请求方法

请求就携带了 跨域的请求头

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/2/7 7:08:20

Dify部署实战:用Qwen3-8B构建企业级对话机器人

Dify部署实战&#xff1a;用Qwen3-8B构建企业级对话机器人 在智能客服、内部知识助手和自动化办公日益普及的今天&#xff0c;越来越多企业希望拥有一个既懂业务又能“说人话”的AI对话系统。然而&#xff0c;现实往往令人却步&#xff1a;一边是调用大厂API带来的高昂成本与数…

作者头像 李华
网站建设 2026/2/12 13:33:26

揭秘低代码平台中PHP组件兼容性陷阱:90%开发者忽略的2个细节

第一章&#xff1a;低代码平台中PHP组件兼容性的核心挑战在低代码开发环境中&#xff0c;PHP作为后端逻辑的重要实现语言&#xff0c;其组件的兼容性问题日益凸显。由于低代码平台通常封装了底层运行时环境&#xff0c;开发者对PHP版本、扩展模块及依赖库的控制能力被大幅削弱&…

作者头像 李华
网站建设 2026/2/7 22:21:03

zookeeper基础概念及集群部署

目录 前言&#xff1a; 一.Zookeeper 概述 二.Zookeeper 工作机制 三.Zookeeper 特点 四.Zookeeper 数据结构 五.Zookeeper 应用场景 六.zookeeper选举机制 1.第一次启动选举机制 2.非第一次启动选举机制 七.部署 Zookeeper 集群 1.部署环境ZK 2.安装前准备 3.安装…

作者头像 李华
网站建设 2026/2/16 21:28:31

DSP 28377 锁相环代码

dsp 28377 锁相环代码半夜调试电机控制板的时候&#xff0c;最怕遇到时钟信号飘得亲妈都不认识。DSP 28377这货的锁相环配置说难不难&#xff0c;但手册里那些寄存器名字看得人眼晕。今天咱们直接扒开TI官方例程的裤衩&#xff0c;看看PLL到底怎么驯服。先甩个祖传配置函数镇楼…

作者头像 李华
网站建设 2026/2/10 2:54:47

【上海理工大学】VC试题集合[2025-12-08]

【上海理工大学】VC试题集合[2025-12-08] 规则 时间&#xff1a;12月1日1月5日&#xff0c;1月5日&#xff08;周一上午第35节&#xff09;上交程序&#xff0c;提交的方式可以发送邮件&#xff08;ghanmingvip.sina&#xff09;&#xff0c;注明成员名称及学号。提供报告&am…

作者头像 李华
网站建设 2026/2/3 0:58:05

普源DM3068万用表 vs 是德34461A万用表如何选择?

在电子测量领域&#xff0c;普源DM3068万用表和是德34461A万用表都是备受关注的高性能数字万用表。两者均具备高精度与多功能性&#xff0c;但细节差异决定了它们在不同场景下的适用性。以下从核心参数、功能特点、应用场景等方面对比两款产品&#xff0c;帮助你做出选择。一、…

作者头像 李华