SpringCloud (2) 网关
1 创建网关微服务-gateway1.1 网关作用①作为调用入口:随着微服务越来越多,前端调用地址会越来越复杂,有了网关后,前端的所有请求都走网关,由网关去做请求路由转发②身份校验:由于所有请求都走网关,一些公共的校验就可以在网关层做,比如用户登录校验1.2 引入依赖(网关模块不用openFeign依赖,因为不需要调用其他微服务,它只负责路由转发,当然加上此依赖也无伤大雅)!--SpringMVC的web开发的场景启动器与gateway冲突,因此设置继承common模块的依赖的排除该依赖-- dependency groupIdxyz.aboluo.common/groupId artifactIdcommon/artifactId exclusions exclusion groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-web/artifactId /exclusion /exclusions /dependency !--网关-- dependency groupIdorg.springframework.cloud/groupId artifactIdspring-cloud-starter-gateway/artifactId /dependency1.3 配置路由规则(application.yaml)spring: cloud: routes: - id: route-engineering #路由规则id,保证唯一 uri: lb://engineering #路由目标微服务名称,lb代表负载均衡 predicates: #路由断言(规则) - Path/engineering/guardNet/** #Path以请求路径(忽略请求路径前的IP和端口)断言,符合要求的请求路径被路由到uri对应的微服务去做请求 - Path/engineering/alWindow/** #Path以请求路径(忽略请求路径前的IP和端口)断言,符合要求的请求路径被路由到uri对应的微服务去做请求 - id: route-minio #路由规则id,保证唯一 uri: lb://minio #路由目标微服务名称,lb代表负载均衡 predicates: #路由断言(规则) - Path/minio/** #Path以请求路径(忽略请求路径前的IP和端口)断言,符合要求的请求路径被路由到uri对应的微服务去做请求filters:[StripPrefix1],// 去掉第一层/engineering1.4 增加application.properties文件,去掉数据源配置#禁用SpringBoot的自动数据源配置因为gateway无需访问数据库如果不开启这个配置就需要在application.yaml中配置数据源 spring.autoconfigure.excludeorg.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration2 身份校验2.1 网关请求处理流程2.2 自定义过滤器自定义一个过滤器,让它在NettyRoutingFilter之前执行,将登录校验的内容放在自定义过滤器的PRE中,以此保证在NettyRoutingFilter将请求转发到微服务之前执行完登录校验2.2.1 两种网关过滤器GatewayFilter(约30多种):路由过滤器,配置在哪个路由下就在此路由下生效(也可以配置在default-filters下,让所有路由生效) //自定义比较麻烦,不建议使用GlobalFilter:全局过滤器,作用范围是所有路由,声明后自动生效2.2.2 代码示例Component public class MyGlobalFilter implements GlobalFilter, Ordered { Override public MonoVoid filter(ServerWebExchange exchange, GatewayFilterChain chain) { // 1.获取请求 ServerHttpRequest request exchange.getRequest(); // 2.拦截处理 System.out.println(打印请求头信息: request.getHeaders()); if (false) { // 如果程序不符合要求 ServerHttpResponse response exchange.getResponse(); response.setStatusCode(HttpStatus.UNAUTHORIZED); // 设置response的状态码401 return response.setComplete(); // Complete表示完结,不会再往下执行,返回值是Mono } // 3.放行 return chain.filter(exchange); } Override public int getOrder() { // 过滤器执行顺序(值越小,优先级越高(NettyRoutingFilter的ordered优先级是21亿,总能保证在最后执行)) return 0; } }3 路由转发3.1 用户信息从网关传递给微服务在自定义过滤器中过滤后得到的用户信息,需要从geteway模块传递到业务微服务模块,而网关和微服务之间是通过http协议进行数据传输的,因此将用户信息放在请求头中比较合适// 如果不做任何处理,网关会将请求头信息从gateway带到微服务的请求头要在gateway模块的自定义实现GlobalFilter接口的filter类中修改请求头,需要用到ServerWebExchange提供的API(mutate()),判断loginCode的有效性// 2.拦截处理(做用户校验,校验结果保存在请求头中) ServerWebExchange newExchange null; ListString loginCodes request.getHeaders().get(loginCode); if (CollectionUtils.isEmpty(loginCodes)) { // loginCode无效(下游微服务需要做登录校验的,拿到true才行;不需要做登录校验的,true/false都放行) newExchange exchange.mutate() //mutate表示对下游(请求,响应...)做更改 .request(builder - builder.header(loginCode-verification, false)) .build(); } else { String loginCode loginCodes.get(0); // 用获取的loginCode去redis查询是否有效 String redisString Common.getRedisString(login-code▲ loginCode); if (StringUtils.isNotBlank(redisString)) { // loginCode生效(下游微服务需要做登录校验的,拿到true才行;不需要做登录校验的,true/false都放行) newExchange exchange.mutate() //mutate表示对下游(请求,响应...)做更改 .request(builder - builder.header(loginCode-verification, true)) .build(); } else { // loginCode无效(下游微服务需要做登录校验的,拿到true才行;不需要做登录校验的,true/false都放行) newExchange exchange.mutate() //mutate表示对下游(请求,响应...)做更改 .request(builder - builder.header(loginCode-verification, false)) .build(); } } // 3.放行 return chain.filter(newExchange);3.2 用户信息在微服务之间的传递-OpenFeignOpenFeign提供了一个拦截器接口,所有OpenFeign发起的请求都会先(在上一个微服务最后,即下一个微服务的AOP之前执行)调用RequestInterceptor(gateway微服务不会触发)拦截器处理请求// 如果不做任何处理,OpenFeign不会将一个微服务的请求头的信息带到另一个微服务的请求头3.2.1 注册RequestInterceptor在common模块(其它微服务模块依赖common模块),新建DefaultFeignConfig类,将RequestInterceptor注册进SpringIOCpublic class DefaultFeignConfig { Bean public RequestInterceptor getRequestInterceptor() { return new RequestInterceptor() { Override public void apply(RequestTemplate requestTemplate) { // 当用OpenFeign调用下个微服务之前,将从拦截的请求头loginCode-verification数据封装到调用下个微服务的请求头中 // 虽然RequestContextHolder.getRequestAttributes()底层使用的是ThreadLocal技术,即无法跨微服务传递数据,但此拦截器是在此微服务中运行,即数据还未出此微服务之前就被处理了 ServletRequestAttributes attrs (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); if (attrs ! null) { String aaa attrs.getRequest().getHeader(loginCode-verification); if (StringUtils.isNotBlank(aaa)) { requestTemplate.header(loginCode-verification, aaa); } } } }; } }3.2.2 让RequestInterceptor生效在对应微服务模块的启动类MainApplication加上EnableFeignClients注解,让RequestInterceptor生效EnableFeignClients(basePackages xxx.xxx.xxx, defaultConfiguration DefaultFeignConfig.class)3.3 微服务AOP拦截Controller请求由于gateway(GlobalFilter)微服务和OpenFeign(RequestInterceptor)微服务都提前将loginCode的校验结果封装在了请求头loginCode-verification中,因此在被请求的微服务的对Controller层进行拦截的AOP中做的操作逻辑相同微服务里面再通过AOP,拦截对Controller层的请求,根据Controller方法是否有loginCode参数// 获取请求头 ServletRequestAttributes attrs (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); if (attrs ! null) { HttpServletRequest request attrs.getRequest(); String aaa request.getHeader(loginCode-verification); if(StringUtils.isNotBlank(aaa)){ //校验loginCode是否有效 } }

相关新闻

昇腾开源软件极客营火热报名中,四天干货活动等你来!

昇腾开源软件极客营火热报名中,四天干货活动等你来!

昇腾开源软件极客营,聚焦训练、推理、工具链、算子编译核心领域。特邀行业先锋与优秀开发者,分享昇腾开源软件创新成果,拆解一线落地实践案例,共探前沿技术趋势。7月9-12日,杭州西湖湖畔,诚邀您莅临现场深度…

2026/9/27 10:14:01 阅读更多 →
TPS536xx PMBus电源控制器核心命令解析与实战配置指南

TPS536xx PMBus电源控制器核心命令解析与实战配置指南

1. 项目概述:从芯片手册到实战配置如果你正在设计一块高性能的服务器主板、一块AI加速卡,或者任何需要大电流、高精度供电的硬件,那么你大概率绕不开PMBus和像TI TPS536xx这样的多相控制器。我处理过不少这类项目,从最初的云里雾里…

2026/10/2 8:59:12 阅读更多 →
TPS60255电荷泵LED驱动器:原理、设计与便携设备背光应用

TPS60255电荷泵LED驱动器:原理、设计与便携设备背光应用

1. 项目概述与核心价值在便携式电子设备的设计中,背光驱动方案的选择往往是一个权衡的艺术。你需要在极致的空间、有限的电池能量和严格的成本控制之间找到最佳平衡点。过去,工程师们常常面临一个两难选择:使用简单的线性稳压器驱动LED&#…

2026/10/2 9:08:01 阅读更多 →

最新新闻

AI 资讯日报 | 2026年10月5日:DeepSeek将中美顶尖模型差距缩至3%,Gemini 4 Argon百万Token输出,阿里确认Qwen 4训练中,智能体安全治理升温

AI 资讯日报 | 2026年10月5日:DeepSeek将中美顶尖模型差距缩至3%,Gemini 4 Argon百万Token输出,阿里确认Qwen 4训练中,智能体安全治理升温

一、模型与产品1. 谷歌发布Gemini 4 Argon旗舰模型:百万Token输出,主打长周期复杂工作流谷歌正式推出新一代旗舰大模型Gemini 4 Argon,单轮最大输出Token上限由上代6.4万提升至100万,可独立完成跨数万行代码迁移等长链路工程任务&…

2026/10/7 14:07:02 阅读更多 →
多智能体系统设计:协调器、专门化 Agent 与通信机制

多智能体系统设计:协调器、专门化 Agent 与通信机制

多智能体系统设计:协调器、专门化 Agent 与通信机制 以前 AI 的主流范式是单个模型与单个用户交互:系统接收指令、处理信息、输出结果。这套架构推动了巨大进步,但也暴露了一个随着任务复杂化而日益明显的问题——现实世界的问题解决很少靠单…

2026/10/7 14:07:02 阅读更多 →
全球人工智能治理对话日内瓦开幕:联合国框架下的 AI 治理新纪元

全球人工智能治理对话日内瓦开幕:联合国框架下的 AI 治理新纪元

全球人工智能治理对话日内瓦开幕:联合国框架下的 AI 治理新纪元 2026 年 7 月 6 日,首届全球人工智能治理对话在瑞士日内瓦正式开幕。这是联合国大会根据 2025 年决议设立的首个全球性 AI 治理平台,约 1500 名代表出席。 一、历史性时刻 联合…

2026/10/7 14:07:02 阅读更多 →
合规是底线:从接口服务风险案例看企业选 API 平台的三条红线

合规是底线:从接口服务风险案例看企业选 API 平台的三条红线

一位 API 接口服务经营者发帖披露,自己因经营相关业务被刑事立案、羁押三十七天后取保候审。这个案例给行业敲响警钟:API 接入服务的"中间商"模式,两头都要扛合规风险。对企业用户来说,选平台就是选合规——三条红线必须…

2026/10/7 14:07:02 阅读更多 →
把值写进类型:C++ 模板进阶的非类型参数、特化与分离编译

把值写进类型:C++ 模板进阶的非类型参数、特化与分离编译

&#x1f3c6;浮世尘弦&#xff1a;个人主页 ⭐个人专栏&#xff1a;《C语言》、《数据结构与算法》、《C》 &#x1f48e;&#xff1a;非淡薄无以明志&#xff0c;非宁静无以致远 前言 前面我们学习了使用类型模板参数template<class T>编写与类型无关的通用代码&#x…

2026/10/7 14:07:01 阅读更多 →
影刀RPA新手教程:微博热搜与话题数据定时采集入门

影刀RPA新手教程:微博热搜与话题数据定时采集入门

影刀RPA新手教程&#xff1a;微博热搜与话题数据定时采集入门 想每天自动记录微博热搜榜和话题阅读量&#xff0c;人工盯又累又容易忘&#xff0c;这就是很多人学影刀RPA后想做的第一个定时采集项目。但新手在定时任务上摔的跟头&#xff0c;比在采集指令上多得多&#xff1a;任…

2026/10/7 14:06:01 阅读更多 →

日新闻

ROS2机械臂仿真与运动控制:从URDF建模到Gazebo实战全解析

ROS2机械臂仿真与运动控制:从URDF建模到Gazebo实战全解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 1:01:58 阅读更多 →
用浏览器直接改ESP32的WiFi密码:NVS键值配置工具设计与实现

用浏览器直接改ESP32的WiFi密码:NVS键值配置工具设计与实现

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 1:02:00 阅读更多 →
芯片封装缺陷检测:扫描声学显微镜(SAT)原理与实操指南

芯片封装缺陷检测:扫描声学显微镜(SAT)原理与实操指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 1:02:00 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/6 7:15:40 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/6 5:29:09 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 9:29:10 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/6 8:21:32 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 11:43:46 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 13:34:55 阅读更多 →