news 2026/8/28 22:49:12

【SpringCloud】Gateway

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【SpringCloud】Gateway

目录一、网关路由1.1.认识网关1.2.快速入门?1.2.1.引入依赖1.2.2.配置路由二、网关登录校验2.1.Gateway工作原理?2.2.自定义过滤器2.3.登录校验2.4.微服务获取用户2.4.1.保存用户信息到请求头2.4.2.拦截器获取用户??2.5.OpenFeign传递用户三、配置管理3.1.配置共享?3.2.拉取配置共享3.2.1.引入依赖3.2.2.创建bootstrap.yaml3.3.配置热更新3.3.1.添加配置到Nacos?编辑?3.3.2.配置热更新3.4.动态路由四、总结* *一、网关路由------### 1.1.认识网关网关就是络的口。数据在网络间传输,从一个网络传输到另一网络时就需要经过网关来做数据的**路由和转发以及数据安全的校验**。前端请求不能直接访问微服务,而是要请求网关:网关可以做安全控制,也就是登录身份校验,校验通过才放行 * 通过认证后,网关再根据请求判断应该访问哪个微服务,将请求转发过去### 1.2.快速入门#### 1.2.1.引入依赖 org.springframework.cloud spring-cloud-starter-gateway com.alibaba.cloud spring-cloud-starter-alibaba-nacos-discovery org.springframework.cloud spring-cloud-starter-loadbalancer #### 1.2.2.配置路由 server: port: 8080 spring: application: name: gateway cloud: nacos: server-addr: 192.168.150.101:8848 gateway: routes: - id: item-service # 路由规则id,自定义,唯一 uri: lb://item-service # 路由的目标服务,lb代表负载均衡,会从注册中心拉取服务列表 predicates: # 路由断言,判断当前请求是否符合当前规则,符合则路由到目标服务 - Path=/items/,/search/# 这里是以请求路径作为判断规则 - id: cart-service uri: lb://cart-service predicates: - Path=/carts/** id:建议和微服务名保持一致uri:路由目标lb:负载均衡://服务名称predicates:路由断言- Path:以路径做匹配二、网关登录校验--------### 2.1.Gateway工作原理1. 客户端请求进入网关后由HandlerMapping对请求做判断,找到与当前请求匹配的路由规则(Route),然后将请求交给WebHandler去处理。 2.WebHandler则会加载当前路由下需要执行的过滤器链(Filter chain),然后按照顺序逐一执行过滤器(后面称为Filter)。 3.图中Filter被虚线分为左右两部分,是因为Filter内部的逻辑分为prepost两部分,分别会在请求路由到微服务之前和之后被执行。4.只有所有Filterpre逻辑都依次顺序执行通过后,请求才会被路由到微服务。5. 微服务返回结果后,再倒序执行Filterpost逻辑。 6. 最终把响应结果返回。 ### 2.2.自定义过滤器网关过滤器链中的过滤器有两种:GatewayFilter:路由过滤器,作用范围比较灵活,可以是任意指定的路由Route. *GlobalFilter:全局过滤器,作用范围是所有路由,不可配置。 ### 2.3.登录校验自定义GlobalFilter完成登录校验自定义登录校验过滤器 public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) { //1、获取请求头 ServerHttpRequest request = exchange.getRequest(); //2.判断是否不需要拦截 if (isExclude(request.getPath().toString())) { return chain.filter(exchange); } //3.获取token List headers = request.getHeaders().get(“authorization”); String token = null; if (headers != null && !headers.isEmpty()) { token = headers.get(0); } //4.解析校验token Long userId = null; try { userId = jwtTool.parseToken(token); } catch (UnauthorizedException e) { //拦截,设置响应状态码 ServerHttpResponse response = exchange.getResponse(); response.setRawStatusCode(401); return response.setComplete(); } //System.out.println("userId = " + userId); //保存用户到请求头 String userInfo = userId.toString(); ServerWebExchange swe = exchange.mutate().//mutate 对下游请求做更改 request(builder -> builder.header(“user-info”, userInfo)) .build(); //6.放行 return chain.filter(swe); }### 2.4.微服务获取用户#### 2.4.1.保存用户信息到请求头 //保存用户到请求头 String userInfo = userId.toString(); ServerWebExchange swe = exchange.mutate().//mutate 对下游请求做更改 request(builder -> builder.header(“user-info”, userInfo)) .build();#### 2.4.2.拦截器获取用户 /** * 拦截器,获取用户保存到ThreadLocal/ public class UserInfoInterceptor implements HandlerInterceptor { //在controller执行之前运行 @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) { //1.获取用户信息 String userInfo = request.getHeader(“user-info”); //2.将用户信息保存到ThreadLocal if (StrUtil.isNotBlank(userInfo)) { UserContext.setUser(Long.valueOf(userInfo)); } //3.放行,只获取用户信息,不做拦截 return true; } //清理用户 @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { UserContext.removeUser(); } }配置拦截器 @Configuration @ConditionalOnClass(DispatcherServlet.class) public class MvcConfig implements WebMvcConfigurer { @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new UserInfoInterceptor()); } }不过,需要注意的是,这个配置类默认是不会生效的,因为它所在的包是com.hmall.common.config,与其它微服务的扫描包不一致,无法被扫描到,因此无法生效。基于SpringBoot的自动装配原理,我们要将其添加到resources目录下的META-INF/spring.factories文件中: org.springframework.boot.autoconfigure.EnableAutoConfiguration=
com.hmall.common.config.MyBatisConfig,
com.hmall.common.config.MvcConfig### 2.5.OpenFeign传递用户利用RequestTemplate类来添加请求头,将用户信息保存到请求头中。这样以来,每次OpenFeign发起请求的时候都会调用该方法,传递用户信息。 @Bean public RequestInterceptor UserInfoRequestInterceptor() { return requestTemplate -> { Long userId = UserContext.getUser(); if (userId != null) { requestTemplate.header(“user-info”, userId.toString()); } }; }三、配置管理------### 3.1.配置共享我们可以把微服务共享的配置抽取到Nacos中统一管理,这样就不需要每个微服务都重复配置了。分为两步:
在Nacos中添加共享配置 * 微服务拉取配置 ### 3.2.拉取配置共享#### 3.2.1.引入依赖 com.alibaba.cloud spring-cloud-starter-alibaba-nacos-config org.springframework.cloud spring-cloud-starter-bootstrap #### 3.2.2.创建bootstrap.yaml spring: application: name: cart-service # 服务名称 profiles: active: dev cloud: nacos: server-addr: 192.168.150.101 # nacos地址 config: file-extension: yaml # 文件后缀名 shared-configs: # 共享配置 - dataId: shared-jdbc.yaml # 共享mybatis配置 - dataId: shared-log.yaml # 共享日志配置 - dataId: shared-swagger.yaml # 共享日志配置### 3.3.配置热更新#### 3.3.1.添加配置到NacosdataId格式:[服务名]-[spring.active.profile].[后缀名]文件名称由三部分组成:
服务名:购物车服务,所以是cart-service*spring.active.profile:就是spring boot中的spring.active.profile,可以省略,则所有profile共享该配置 *后缀名:例如yaml ####3.3.2.配置热更新创建属性读取类 @Data @Component @ConfigurationProperties(prefix = “hm.cart”) public class CartProperties { private Integer maxAmount; } ### 3.4.动态路由四、总结----

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

电力电网抄表运维智能化:零断电改造方案的落地实践

电网抄表运维的压力,集中在三个环节:高压高危、工况复杂、合规严格。高压配电柜内空间密闭、电磁环境复杂,持证电工每一次下现场都伴随着触电和电弧风险。户外箱变常年暴晒、积水、霜冻交替,数百个分散点位的人工巡检,…

作者头像 李华
网站建设 2026/8/28 22:39:34

太阳影子定位:基于Matlab的数学建模与优化求解全解析

1. 从一道经典赛题说起:太阳影子定位的工程魅力2015年高教社杯全国大学生数学建模竞赛的A题,题目是“太阳影子定位”。这道题当年难倒了不少队伍,但也让很多同学第一次真切地感受到,数学和编程是如何联手解决一个看似“玄学”的实…

作者头像 李华
网站建设 2026/8/28 22:37:15

NVIDIA整合Groq,机架级AI推理部署的机遇与挑战

NVIDIA 将 Groq 技术整合进机架级产品,这个动作如果放到实际部署里看,等于把 AI 推理的竞争从单颗芯片拉到了整个机柜层面。Groq 最有代表性的东西是低延迟推理引擎和配套软件栈,而 NVIDIA 的优势在 GPU、高速互联、CUDA 生态和整机交付能力。…

作者头像 李华
网站建设 2026/8/28 22:36:31

MATLAB仿真波浪能最大功率捕获:从阻抗匹配到动态控制策略

1. 问题引入:从一道赛题到真实的工程挑战如果你在2022年参加过或者关注过全国大学生数学建模竞赛,那么对A题“波浪能最大输出功率设计”一定不会陌生。这道题把我们从纯粹的数学公式和理论推导,一下子拉到了新能源开发的前沿阵地——海洋波浪…

作者头像 李华
网站建设 2026/8/28 22:33:33

从数学建模到天文数据处理:基于收敛点法的毕星团成员星识别实战

1. 项目概述:从数学建模竞赛到真实天文数据处理最近在整理硬盘,翻到了几年前参加“认证杯”数学建模竞赛时做的一个项目文档。题目是“依巴谷星表中的毕星团求解”,属于2021年B题的第一阶段。当时为了这个题,我们小组三个人熬了好…

作者头像 李华
网站建设 2026/8/28 22:27:42

基于Cadence Virtuoso与Abstract的GDS转LEF自动化流程构建

1. 项目概述:从GDS到LEF的自动化桥梁搭建在芯片设计的后端流程里,有一个环节常常让工程师们感到既基础又繁琐,那就是从最终的版图数据(GDSII)中提取出标准单元或宏模块的抽象物理信息,生成一个叫LEF&#x…

作者头像 李华