GateWay使用手册
好的,下面是优化后的版本。为了提高可读性和规范性,我对内容进行了结构化、简化了部分代码,同时增加了注释说明,便于理解。
1. 引入依赖
在 pom.xml 中添加以下依赖:
<dependencies><!-- Spring Cloud Gateway:提供API网关功能 --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId></dependency><!-- Spring Cloud Alibaba Nacos Discovery:用于服务发现 --><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency><!-- Spring Cloud Loadbalancer:提供客户端负载均衡 --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-loadbalancer</artifactId></dependency>
</dependencies>
2. 启动类 (GateApplication.java)
定义主启动类,启动 Spring Boot 应用:
@SpringBootApplication // 标明这是Spring Boot应用的入口
public class GateApplication {public static void main(String[] args) {SpringApplication.run(GateApplication.class, args); // 启动应用}
}
3. 配置文件 (application.yml)
配置网关的基本设置、Nacos 服务发现以及路由规则。
server:port: 8080 # 配置网关监听的端口spring:application:name: gateway # 应用名称,用于 Nacos 等服务发现cloud:nacos:discovery:server-addr: xiaotianlong.xyz:8848 # 配置 Nacos 服务器地址gateway:routes: # 配置网关的路由规则# 路由规则 1- id: service_name # 路由的唯一IDuri: lb://service_name # 使用负载均衡访问注册到 Nacos 中的服务predicates:- Path=/user/** # 请求路径以 `/user/` 开头时触发此路由filters:- AddRequestHeader=X-Request-Foo, Bar # 添加请求头# 路由规则 2- id: service_name2uri: lb://service_name2predicates:- Path=/order/** # 请求路径以 `/order/` 开头时触发此路由
4. 自定义全局过滤器
定义一个全局过滤器,记录请求的时间并打印日志。
@Component // 声明为Spring组件
public class MyGlobalFilter implements GlobalFilter, Ordered {@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {// 记录请求开始时间System.out.println("请求开始时间: " + System.currentTimeMillis());// 放行请求return chain.filter(exchange).then(Mono.fromRunnable(() -> {// 记录请求结束时间System.out.println("请求结束时间: " + System.currentTimeMillis());}));}@Overridepublic int getOrder() {// 过滤器的执行顺序,数字越小优先级越高return 0;}
}
5. 自定义Gateway过滤器
创建一个自定义的 Gateway 过滤器工厂,允许动态配置过滤器的参数。
@Component
public class MyGatewayFilterFactory extends AbstractGatewayFilterFactory<MyGatewayFilterFactory.Config> {// 内部配置类,允许用户配置过滤器的参数@Datapublic static class Config {private String pattern = "yyyy-MM-dd"; // 设置默认日期格式private String message = "默认日志信息"; // 自定义日志信息}public MyGatewayFilterFactory() {super(Config.class); // 指定配置类类型}@Overridepublic List<String> shortcutFieldOrder() {return List.of("pattern", "message"); // 设置快捷字段顺序}@Overridepublic GatewayFilter apply(Config config) {// 创建过滤器逻辑return new OrderedGatewayFilter((exchange, chain) -> {DateTimeFormatter formatter = DateTimeFormatter.ofPattern(config.getPattern());System.out.println("请求开始时间: " + formatter.format(LocalDateTime.now()));System.out.println(config.getMessage()); // 打印自定义日志信息return chain.filter(exchange).then(Mono.fromRunnable(() -> {System.out.println("请求结束时间: " + formatter.format(LocalDateTime.now()));}));}, 1);//在这里设置顺序}
}
6. 配置自定义过滤器
在 application.yml 文件中配置自定义的 MyGatewayFilterFactory 过滤器,使其生效:
spring:cloud:gateway:routes:- id: example_routeuri: lb://some-servicepredicates:- Path=/somepath/** # 路径匹配条件filters:- name: My # 使用自定义过滤器args:pattern: "yyyy-MM-dd~HH:mm:ss" # 自定义日期格式message: "这是一个统计时间的gateway过滤器" # 自定义日志信息
或者
spring:cloud:gateway:routes:- id: example_routeuri: lb://some-servicepredicates:- Path=/somepath/** # 路径匹配条件filters:# 由于设置了shortcutfieldorder,所以可以这样写- My="yyyy-MM-dd~HH:mm:ss", "这是一个统计时间的gateway过滤器"
案例1:登录检验
@Component
@EnableConfigurationProperties(AuthProperties.class)
public class AuthGlobalFilter implements GlobalFilter, Ordered {@Resourceprivate AuthProperties authProperties;@Resourceprivate JwtTool jwtTool;private final AntPathMatcher antPathMatcher = new AntPathMatcher();@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {//1.获取requestServerHttpRequest request = exchange.getRequest();//2.判断路径是否需做登录拦截List<String> excludePaths = authProperties.getExcludePaths();if (isExclude(request.getPath())) {//此时不需要拦截,直接放行return chain.filter(exchange);}//3.获得tokenString token = request.getHeaders().getFirst("authorization");//4.检验并解析tokenLong userId = null;try {userId = jwtTool.parseToken(token);} catch (Exception e) {//设置响应状态码为401ServerHttpResponse response = exchange.getResponse();response.setStatusCode(HttpStatus.UNAUTHORIZED);//拦截return response.setComplete();}//todo 5.传递用户信息//6.放行return chain.filter(exchange);}private boolean isExclude(RequestPath path) {List<String> excludePaths = authProperties.getExcludePaths();for (String pattern : excludePaths) {if (antPathMatcher.match(pattern, path.toString())) {return true;}}return false;}@Overridepublic int getOrder() {return 0;}
}
7.结合Nacos实现动态路由
在Spring Cloud Gateway中,路由的配置默认是在项目启动时通过 org.springframework.cloud.gateway.route.CompositeRouteDefinitionLocator 进行加载的。这些配置一旦加载到内存中(通常是通过一个 Map 缓存),就不会随路由变化而更新,也不支持热更新功能。因此,我们需要借助 Nacos 来实现动态的路由更新功能。
这涉及到两个关键问题:
- 如何监听Nacos配置变更?
- 如何把新的路由信息更新到路由表中?
7.1 引入依赖
首先,我们需要在项目中引入Nacos的配置和启动依赖:
<!-- 统一配置管理 -->
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency><!-- 加载bootstrap配置 -->
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>
7.2 配置bootstrap.yaml
在网关项目的 resources 目录下,创建 bootstrap.yaml 文件,配置Nacos的服务地址和路由配置的相关信息:
spring:application:name: gatewaycloud:nacos:discovery:server-addr: xiaotianlong.xyz:8848config:server-addr: xiaotianlong.xyz:8848
7.3 定义配置监听器
接下来,我们编写一个配置监听器类,用于监听Nacos配置变更并更新路由。监听器需要通过 NacosConfigManager 获取配置内容,并在路由配置更新时,动态更新路由表。
package com.hmall.gateway.route;import cn.hutool.json.JSONUtil;
import com.alibaba.cloud.nacos.NacosConfigManager;
import com.alibaba.nacos.api.config.listener.Listener;
import com.alibaba.nacos.api.exception.NacosException;
import com.hmall.common.utils.CollUtils;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.cloud.gateway.route.RouteDefinition;
import org.springframework.cloud.gateway.route.RouteDefinitionWriter;
import org.springframework.stereotype.Component;
import reactor.core.publisher.Mono;import javax.annotation.PostConstruct;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.concurrent.Executor;@Slf4j
@Component
@RequiredArgsConstructor
public class DynamicRouteLoader {private final RouteDefinitionWriter writer;private final NacosConfigManager nacosConfigManager;// 路由配置文件的dataId和groupprivate final String dataId = "gateway-routes.json";private final String group = "DEFAULT_GROUP";// 保存已更新的路由IDprivate final Set<String> routeIds = new HashSet<>();@PostConstructpublic void initRouteConfigListener() throws NacosException {// 注册Nacos配置监听器并拉取配置String configInfo = nacosConfigManager.getConfigService().getConfigAndSignListener(dataId, group, 5000, new Listener() {@Overridepublic Executor getExecutor() {return null; // 默认执行器为null}@Overridepublic void receiveConfigInfo(String configInfo) {updateConfigInfo(configInfo); // 配置变更时更新路由}});// 首次启动时加载配置updateConfigInfo(configInfo);}private void updateConfigInfo(String configInfo) {log.debug("监听到路由配置变更:{}", configInfo);// 1. 反序列化配置List<RouteDefinition> routeDefinitions = JSONUtil.toList(configInfo, RouteDefinition.class);// 2. 清除旧路由配置routeIds.forEach(routeId -> writer.delete(Mono.just(routeId)).subscribe());routeIds.clear();// 3. 判断并更新新的路由配置if (CollUtils.isEmpty(routeDefinitions)) {// 如果没有新的路由配置,直接结束return;}// 4. 更新新的路由配置routeDefinitions.forEach(routeDefinition -> {// 保存新路由writer.save(Mono.just(routeDefinition)).subscribe();// 记录路由ID,方便未来删除routeIds.add(routeDefinition.getId());});}
}
在Nacos控制台,我们可以添加路由配置文件 gateway-routes.json,类型选择JSON。路由配置的示例内容如下:

[{"id": "item","predicates": [{"name": "Path","args": {"_genkey_0":"/items/**", "_genkey_1":"/search/**"}}],"filters": [],"uri": "lb://item-service"},{"id": "cart","predicates": [{"name": "Path","args": {"_genkey_0":"/carts/**"}}],"filters": [],"uri": "lb://cart-service"},{"id": "user","predicates": [{"name": "Path","args": {"_genkey_0":"/users/**", "_genkey_1":"/addresses/**"}}],"filters": [],"uri": "lb://user-service"},{"id": "trade","predicates": [{"name": "Path","args": {"_genkey_0":"/orders/**"}}],"filters": [],"uri": "lb://trade-service"},{"id": "pay","predicates": [{"name": "Path","args": {"_genkey_0":"/pay-orders/**"}}],"filters": [],"uri": "lb://pay-service"}
]
通过以上配置,网关将能够动态地加载和更新路由配置,使得路由在Nacos配置变更时自动同步更新。
相关文章:
GateWay使用手册
好的,下面是优化后的版本。为了提高可读性和规范性,我对内容进行了结构化、简化了部分代码,同时增加了注释说明,便于理解。 1. 引入依赖 在 pom.xml 中添加以下依赖: <dependencies><!-- Spring Cloud Gate…...
MySQL1.0
1.数据库的三大范式 范式是为了使数据库设计更加合理,规范,减少数据冗余和数据不一致等问题指定的一系列规则。 第一范式:第一范式要求数据表中的每一列都是不可分割的原子数据项。例如:有一个学生信息表,包含 “学生…...
IDEA使用HotSwapHelper进行热部署
目录 前言JDK1.8特殊准备DECVM安装插件安装与配置参考文档相关下载 前言 碰到了一个项目,用jrebel启动项目时一直报错,不用jrebel时又没问题,找不到原因,又不想放弃热部署功能 因此思考能否通过其他方式进行热部署,找…...
简单web项目自定义部署Dockerfile
本意就是弄清楚如何做web自定义项目的镜像。 基础镜像是java:8u261-jdk,其中java路径为/opt/java webdemo1.0.0.1-SNAPSHOT.jar文件里面已经包含了lib文件。 可以设置PATH也可以不设置,但是建议设置JAVA_HOME FROM swr.cn-north-4.myhuaweicloud.com…...
基础Web安全|SQL注入
基础Web安全 URI Uniform Resource Identifier,统一资源标识符,用来唯一的标识一个资源。 URL Uniform Resource Locator,统一资源定位器,一种具体的URI,可以标识一个资源,并且指明了如何定位这个资源…...
SpringBoot -拦截器Interceptor、过滤器 Filter 及设置
Spring Boot拦截器(Interceptor)的概念 - 在Spring Boot中,拦截器是一种AOP的实现方式。它主要用于<font style"color:#DF2A3F;">拦截请求</font>,在请求处理之前和之后执行特定的代码逻辑。与过滤器不同的…...
C++小问题
怎么分辨const修饰的是谁 是限定谁不能被改变的? 在C中,const关键字的用途和位置非常关键,它决定了谁不能被修改。const可以修饰变量、指针、引用等不同的对象,并且具体的作用取决于const的修饰位置。理解const的规则能够帮助我们…...
avcodec_alloc_context3,avcodec_open2,avcodec_free_context,avcodec_close
avcodec_alloc_context3 是创建编解码器上下文,需要使用 avcodec_free_context释放 需要使用avcodec_free_context 释放 /** * Allocate an AVCodecContext and set its fields to default values. The * resulting struct should be freed with avcodec_free_co…...
强化学习的几个主要方法(策略梯度、PPO、REINFORCE实现等)(下)
由于平台字数限制,上文:https://blog.csdn.net/ooblack/article/details/144198538 4. PPO算法 近端策略优化(proximal policy optimization,PPO)算法是OpenAI的默认强化学习算法,在RLHF中也用到了这个算…...
计算机网络:IP协议详细讲解
目录 前言 一、IP网段划分 二、IP报头 三、解决IP地址不足-->NAT技术 前言 在之前,我们学习了传输层中的TCP和UDP,重点是TCP协议,他帮我们解决具体到主机的哪个应用(端口)、传输的可靠(序列号、校验和…...
2024信创数据库TOP30之华为Gauss DB
近日,由DBC联合CIW/CIS共同发布的“2024信创数据库TOP30”榜单正式揭晓,汇聚了国内顶尖的数据库企业及其产品,成为展示中国信创领域技术实力与发展潜力的重要平台。在这份榜单中,华为的GaussDB凭借其卓越的技术实力、广泛的行业应…...
在线家具商城基于 SpringBoot:设计模式与实现方法探究
第3章 系统分析 用户的需求以及与本系统相似的在市场上存在的其它系统可以作为系统分析中参考的资料,分析人员可以根据这些信息确定出本系统具备的功能,分析出本系统具备的性能等内容。 3.1可行性分析 尽管系统是根据用户的要求进行制作,但是…...
九、Spring Boot集成Spring Security之授权概述
文章目录 往期回顾:Spring Boot集成Spring Security专栏及各章节快捷入口前言一、授权概述二、用户权限三、用户授权流程三、Spring Security授权方式1、请求级别授权2、方法级别授权 往期回顾:Spring Boot集成Spring Security专栏及各章节快捷入口 Spr…...
python之Flask入门—路由参数
语法: /routerName/<string:parameter_name> 其中:routerName代表路由名称<>中的string是参数类型,parameter_name为参数名称 参数类型: (1) string 接收任何没有斜杠(/&#x…...
txt地图格式处理
1、txt地图格式 [属性描述] 坐标系2000国家大地坐标系 几度分带3 投影类型高斯克吕格 计量单位米 带号38 精度0.001 转换参数,,,,,, [地块坐标] 5,475.888,1,测试地块1,面,J50G077061,公路用地,地下, J1,1,113.22222222222222,23.129111721551794 J2,1,113.2722314…...
《数据挖掘:概念、模型、方法与算法(第三版)》
嘿,数据挖掘的小伙伴们!今天我要给你们介绍一本超级实用的书——《数据挖掘:概念、模型、方法与算法》第三版。这本书是数据挖掘领域的经典之作,由该领域的知名专家编写,系统性地介绍了在高维数据空间中分析和提取大量…...
GitLab CVE-2024-8114 漏洞解决方案
漏洞 ID 标题严重等级CVE ID通过 LFS 令牌提升权限高CVE-2024-8114 GitLab 升级指南GitLab 升级路径查看版本漏洞查询 漏洞解读 此漏洞允许攻击者使用受害者的个人访问令牌(PAT)进行权限提升。影响从 8.12 开始到 17.4.5 之前的所有版本、从 17.5 开…...
request和websocket
当然,可以为你详细介绍 FastAPI 中的 Request 对象。Request 对象在 FastAPI 中扮演着重要的角色,负责封装来自客户端的 HTTP 请求信息。了解 Request 对象的使用方法和属性,有助于你更高效地处理请求数据、访问请求上下文以及进行各种操作。…...
一键生成后端服务,MemFire Cloud重新定义开发效率
作为开发者,特别是独立开发者和小团队成员,大家都知道开发的最大难题之一就是搭建后端服务。要让一个应用从零开始,除了前端的开发工作外,还需要考虑数据库、接口、认证、存储等等一系列繁琐的后台工作。而MemFire Cloud这款神器&…...
短视频矩阵的营销策略:批量混剪实现高效传播
在当今的商业环境中,短视频营销已成为企业获得市场份额的关键策略。随着消费者注意力的分散,传统营销方法的效果逐渐减弱。因此,短视频营销的重要性不言而喻。通过短视频,品牌能够以更为生动和直观的方式传递信息,从而…...
Phi-4-mini-reasoning效果实测:在高考数学压轴题上的分步推导与结论匹配度
Phi-4-mini-reasoning效果实测:在高考数学压轴题上的分步推导与结论匹配度 1. 模型能力概述 Phi-4-mini-reasoning是一款专注于推理任务的文本生成模型,特别擅长处理需要多步逻辑推导的数学题和逻辑题。与通用聊天模型不同,它被设计为直接接…...
战争鼓点响起:AI生成大片感战斗音乐作品
战争鼓点响起:AI生成大片感战斗音乐作品 1. 从文字到战歌:AI音乐生成初体验 想象一下这样的场景:你正在制作一部史诗级的战斗短片,画面中千军万马奔腾,刀光剑影交错,但总觉得缺少点什么。没错,…...
MusePublic圣光艺苑惊艳效果:大气照明+表达性纹理细节放大展示
MusePublic圣光艺苑惊艳效果:大气照明表达性纹理细节放大展示 1. 引言:当古典艺术遇见AI算力 想象一下,你走进一间19世纪的画室。空气中弥漫着亚麻籽油和矿物颜料的味道,阳光透过高窗洒在亚麻画布上,墙上挂着鎏金画框…...
STM32CubeIDE工程复制粘贴保姆级教程:告别重复配置,5分钟搞定新项目
STM32CubeIDE工程复制粘贴保姆级教程:告别重复配置,5分钟搞定新项目 每次启动新项目时,你是否还在重复那些繁琐的初始化步骤?从零开始配置时钟树、外设参数、中断优先级,不仅耗时费力,还容易出错。对于经验…...
当知识有了‘关系网‘:LightRAG如何让大模型‘秒懂‘你的文档?
想象一下,你有一座藏书万卷的图书馆,但你找书的方式只有一种——记住每本书某个页面的关键词,然后靠"猜"来定位。 这,就是传统RAG系统的尴尬处境。 今天要介绍的这个开源项目LightRAG,被顶会EMNLP 2025接收…...
原神高帧率解锁终极方案:一键突破60帧限制的完全指南
原神高帧率解锁终极方案:一键突破60帧限制的完全指南 【免费下载链接】genshin-fps-unlock unlocks the 60 fps cap 项目地址: https://gitcode.com/gh_mirrors/ge/genshin-fps-unlock 想象一下这样的场景:你在蒙德的原野上自由奔跑,角…...
告别手动重复!用Python+ArcPy实现多要素批量裁剪年度影像的保姆级教程
PythonArcPy自动化遥感影像裁剪:从原理到实战的完整解决方案 遥感影像处理是GIS工程师的日常必修课。每当拿到新一年的土地利用数据或行政区划影像时,最头疼的莫过于要为每个行政单元单独裁剪每年的数据。我曾花费整整一周时间手动处理30个乡镇5年的NDVI…...
实战指南:基于快马平台与Touchgal,从零开发移动端手写绘图应用
今天想和大家分享一个实战项目:基于Touchgal开发移动端手写绘图应用。这个项目特别适合需要复杂手势交互的场景,比如绘图软件、地图导航等。下面我会详细介绍整个开发流程和关键实现点。 项目初始化与环境搭建 首先需要创建一个基础的HTML5项目结构。画…...
pdfsizeopt如何实现PDF文件无损压缩?3大行业案例与高级技巧全解析
pdfsizeopt如何实现PDF文件无损压缩?3大行业案例与高级技巧全解析 【免费下载链接】pdfsizeopt PDF file size optimizer 项目地址: https://gitcode.com/gh_mirrors/pd/pdfsizeopt 在数字化办公环境中,PDF文件已成为信息传递的标准格式ÿ…...
HiOmics平台:零代码实现ChIP-Seq数据可视化与深度解析
1. 为什么科研人员需要零代码ChIP-Seq分析工具 做表观遗传学研究的朋友们应该都深有体会,ChIP-Seq数据分析就像一场马拉松——从原始数据清洗、序列比对、peak calling到功能注释,每个环节都需要不同的工具和脚本。我刚开始接触这个领域时,光…...
