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/7/27 18:05:46 阅读更多 →
TPS536xx PMBus电源控制器核心命令解析与实战配置指南

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

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

2026/7/27 18:05:46 阅读更多 →
TPS60255电荷泵LED驱动器:原理、设计与便携设备背光应用

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

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

2026/7/27 18:05:46 阅读更多 →

最新新闻

【学术搜索效率革命】:秘塔AI学术搜索的5大隐藏功能,90%的研究者至今未用?

【学术搜索效率革命】:秘塔AI学术搜索的5大隐藏功能,90%的研究者至今未用?

更多请点击: https://intelliparadigm.com 第一章:学术搜索效率革命的底层逻辑与范式迁移 传统学术检索长期受限于关键词匹配与静态索引机制,导致查全率低、语义鸿沟显著、跨学科关联弱。真正的效率革命并非源于界面优化或算力堆叠&#xff…

2026/7/27 18:23:51 阅读更多 →
2027亚洲消费电子展62%专业观众手握核心决策权

2027亚洲消费电子展62%专业观众手握核心决策权

2027亚洲消费电子展将于2027年6月26-28日在北京亦创国际会展中心举办,组委会日前发布预登记观众画像数据,本届到场付费专业观众之中,62%为企业高管、采购负责人、投资机构合伙人,手握企业采购、项目合作、战略投资核心决策权&…

2026/7/27 18:23:51 阅读更多 →
芯片封装选型实战:从WQFN到csBGA,如何为LM8333运放选择最佳封装

芯片封装选型实战:从WQFN到csBGA,如何为LM8333运放选择最佳封装

1. 项目概述:从芯片到电路板,封装是那道关键桥梁在硬件工程师的日常里,选型是个绕不开的话题。我们常常花大量时间对比芯片的带宽、功耗、供电电压,却容易忽略一个同样关键,甚至能决定项目成败的要素:芯片封…

2026/7/27 18:23:51 阅读更多 →
【AI绘画提示词生产力革命】:用这4个结构化模板+动态权重计算器,单日产出效率提升3.8倍(附Python自动化生成脚本)

【AI绘画提示词生产力革命】:用这4个结构化模板+动态权重计算器,单日产出效率提升3.8倍(附Python自动化生成脚本)

更多请点击: https://kaifayun.com 第一章:AI绘画提示词分享 AI绘画的核心驱动力之一是高质量的提示词(Prompt),它直接影响生成图像的细节、风格与语义准确性。合理构建提示词不仅需要描述主体,还需兼顾构…

2026/7/27 18:23:51 阅读更多 →
Stable Diffusion本地部署避坑手册:92%新手踩过的5大致命错误及实时修复方案

Stable Diffusion本地部署避坑手册:92%新手踩过的5大致命错误及实时修复方案

更多请点击: https://kaifayun.com 第一章:Stable Diffusion本地部署避坑手册:92%新手踩过的5大致命错误及实时修复方案 显存不足却强行启动WebUI 最常见错误是忽略GPU显存阈值,直接运行 webui-user.bat(Windows&am…

2026/7/27 18:23:51 阅读更多 →
【前端+项目分析】`img` vs `Image`:从两个真实项目看前端图片组件的正确选择

【前端+项目分析】`img` vs `Image`:从两个真实项目看前端图片组件的正确选择

img vs Image:从两个真实项目看前端图片组件的正确选择 引言:一个看似简单的选择背后 在对比 Controller-git(Next.js)和 Frontend(React Router Ant Design)两个项目的登录页时,我们发现了一…

2026/7/27 18:22:51 阅读更多 →

日新闻

【JAVA毕设源码分享】基于SpringBoot的社区智能垃圾管理系统的设计与实现(程序+文档+代码讲解+一条龙定制)

【JAVA毕设源码分享】基于SpringBoot的社区智能垃圾管理系统的设计与实现(程序+文档+代码讲解+一条龙定制)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/7/27 0:00:54 阅读更多 →
SPI实战指南:从时钟模式到寄存器配置,解决嵌入式通信难题

SPI实战指南:从时钟模式到寄存器配置,解决嵌入式通信难题

1. 项目概述:从寄存器手册到实战指南 如果你手头有一份类似德州仪器(TI)TMS320x240xA系列DSP的SPI模块技术手册,看着里面密密麻麻的寄存器位定义、时序图和公式,是不是感觉头大?这份资料虽然权威&#xff0…

2026/7/27 0:00:54 阅读更多 →
【JAVA毕设源码分享】基于springboot的水果购物管理系统的设计与实现(程序+文档+代码讲解+一条龙定制)

【JAVA毕设源码分享】基于springboot的水果购物管理系统的设计与实现(程序+文档+代码讲解+一条龙定制)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/7/27 0:00:54 阅读更多 →

周新闻

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 数据集6000张 完整源码已标注数据集训练好的模型环境配置教程程序运行说明文档,可以直接使用!系统支持图片、视频、摄像头等多种方式检测裂缝,功能强大实用。 1数据集6000张 8各类别

2026/7/27 4:33:59 阅读更多 →
深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

pubg数据集 精选原图1.42万数据 1.49万标签 无任何重复、算法增强或冗余图像! pubg绝地求生目标检测数据集 1分类:e_body,14905个标签,txt格式 共计14244张图,99%为640*640尺寸图像 适合yolo目标检测、AI训练关键词&am…

2026/7/27 6:31:56 阅读更多 →
Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex检测数据集数据集详情检测类别: allies enemy tag图片总量:7247张训练集:5139张验证集:1425张测试集:683张标注状态:全部已标注,即拿即用数据格式:支持YOLO格式及其他格式&#…

2026/7/27 4:01:12 阅读更多 →

月新闻