尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
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是否有效 } }
RELATED

相关推荐

掌握substitute.nvim的交换操作符:3个技巧让文本交换变得简单高效

掌握substitute.nvim的交换操作符:3个技巧让文本交换变得简单高效

掌握substitute.nvim的交换操作符:3个技巧让文本交换变得简单高效 【免费下载链接】substitute.nvim Neovim plugin introducing a new operators motions to quickly replace and exchange text. 项目地址: https://gitcode.com/gh_mirrors/su/substitute.nvim …

📅 2026/8/24 14:58:11
JAVA毕设选题推荐:基于 SpringBoot 的手袋厂生产货物运维系统 手袋成品库存盘点与订单发货管理系统【附源码、mysql、文档、调试+代码讲解+全bao等】

JAVA毕设选题推荐:基于 SpringBoot 的手袋厂生产货物运维系统 手袋成品库存盘点与订单发货管理系统【附源码、mysql、文档、调试+代码讲解+全bao等】

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

📅 2026/9/8 16:06:37
解决BeautifulDiscord常见问题:安装失败、样式不生效怎么办?

解决BeautifulDiscord常见问题:安装失败、样式不生效怎么办?

解决BeautifulDiscord常见问题:安装失败、样式不生效怎么办? 【免费下载链接】BeautifulDiscord Adds custom CSS support to Discord. 项目地址: https://gitcode.com/gh_mirrors/be/BeautifulDiscord BeautifulDiscord是一款为Discord添加自定义…

📅 2026/9/11 20:23:31
MORE NEWS

更多资讯

📰

基于Python PyQt与MATLAB的电路设计与仿真工具集成实践

简介:这是一款面向电路设计、电子工程和嵌入式学习者的跨平台电路设计与仿真计算工具。它借助Python、PyQt与MATLAB技术栈,整合了电路建模、参数计算、波形分析、频率响应、阻抗匹配、滤波器设计、放大器仿真、电源管理及PCB辅助设计等典型EDA功能&#…

📰

ego-browser 中 page.locator 与 getByRole 的自动等待与严格匹配怎么用?非唯一匹配如何用 first 和 nth 消歧?

ego-browser 中 page.locator 与 getByRole 的自动等待与严格匹配怎么用?非唯一匹配如何用 first 和 nth 消歧? 【免费下载链接】ego-lite The fastest browser for AI agents to run browser automation, built for sharing your logged-in browser sta…

📰

Kimi CLI 完整上手指南:如何在终端让 AI 替你写代码

Kimi CLI 完整上手指南:如何在终端让 AI 替你写代码 【免费下载链接】kimi-cli Kimi Code CLI is your next CLI agent. 项目地址: https://gitcode.com/GitHub_Trending/ki/kimi-cli 测试红了,报错滚出屏幕 30 屏之外,要改的函数藏在…

📰

Kubernetes Elections 选举子项目指南:Elekto 平台、Steering 委员会选举与团队选举申请全流程

Kubernetes Elections 选举子项目指南:Elekto 平台、Steering 委员会选举与团队选举申请全流程 【免费下载链接】community Kubernetes Community Documentation 项目地址: https://gitcode.com/GitHub_Trending/com/community 导读 本文基于 Kubernetes Co…

📰

RuboCop v0.37.0 版本深度解析:三大新 cop、默认行为变更与 30 项缺陷修复

RuboCop v0.37.0 版本深度解析:三大新 cop、默认行为变更与 30 项缺陷修复 【免费下载链接】rubocop A Ruby static code analyzer and formatter, based on the community Ruby style guide. 项目地址: https://gitcode.com/GitHub_Trending/rub/rubocop 本…

📰

c-ares 安全漏洞响应全流程解析——MongoDB 内置异步 DNS 解析库的漏洞治理规范

c-ares 安全漏洞响应全流程解析——MongoDB 内置异步 DNS 解析库的漏洞治理规范 【免费下载链接】mongo The MongoDB Database 项目地址: https://gitcode.com/GitHub_Trending/mo/mongo c-ares 是一个用 C 语言实现的异步 DNS 解析库,以第三方依赖的形式随 …

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬