Spring Cloud Gateway2.0实践报告

本文深入探讨Spring Cloud Gateway的功能与使用,包括反向代理、鉴权、流量控制等网关作用,以及Predicate和Filter的配置。文章强调了响应式编程框架Project Reactor在其中的关键角色,指出其对开发者的学习挑战。文中详细阐述了路由匹配和过滤器编写,如信息修改、重定向和限流等,并提出自定义过滤器以应对高级需求。

本文将从知识拓扑讲起,谈一下api网关的功能,以及spring cloud gateway的使用方法。文章很长,可以先过一下目录。

一、知识拓扑 (使用和原理)
二、网关的作用
三、Predicate,路由匹配
四、Filter,过滤器编写
五、自定义过滤器
六、常见问题
复制代码

为什么很多人觉得spring cloud gateway难用?因为它的背后用的是webflux,涉及到响应式编程,而不是传统的过程式编程。

我们把背后的技术梳理一下,不难发现,这个晦涩的根源,就来自于project reactor,与spring项目并驾齐驱的,”面向未来”的响应式编程框架。

结果最后的代码,都长的和lambda一样。其背后的思想,是观察者模式和非阻塞杂交的产物,学习曲线相对陡峭

一、知识拓扑

spring cloud gateway涉及到许多比较新的知识和理念,但仅仅对于使用来说,坡度并不是很大。

1.1 使用相关

我们可以想象一下一个路由的必要元素:web请求,通过一些匹配条件,定位到真正的服务节点。并在这个转发过程的前后,进行一些精细化控制

其中,predicate就是我们的匹配条件;而filter,就可以理解为一个无所不能的拦截器。有了这两个元素,再加上目标uri,就可以实现一个具体的路由了。

由于spring cloud gateway是基于springboot的,所以使用yml进行路由的配置。yml的层次通常比较深,这就造成了配置文件看起来非常的乱。它也可以使用java代码(或者kotlin)进行路由的编写,风格偏向函数编程,所以需要首先了解lambda表达式的写法。

spring cloud gateway大多数时候是作为http服务的网关,可以针对http的报文进行一些细粒度的控制,所以还需要对http协议有较多的理解,才能在使用时游刃有余。

1.2 原理相关

而在原理方面,却复杂的多。由于实践方面的滞后性,现有的组件大多数还没有追上“响应式”这个“超前”的理念,催生了一堆晦涩的组件(主要是专用函数太多)。好在,使用spring cloud gateway并不需要直接接触这些api。

最重要的,就是对webflux框架的封装。webflux是可以替代spring mvc的一套解决方案,可以编写响应式的应用,两者之间的关系可以看下图。它的底层使用的是netty,所以操作是异步非阻塞的。

再往下走,webflux是运行在project reactor之上的一个封装,其根本特性是由后者提供的。这个东西和vert.x一样,初次接触使用起来会感觉特别怪异。

reactor是观察者模式的发扬,所以里面有Publisher的概念,其中最主要的实现,就是Flux和Mono。所谓的webflux,取名就在于此。

reactor参考:https://url.cn/5B7f5iY

从传统的开发模式过渡到reactor的开发模式,是有一定成本的。如果有时间可以了解一下背后的原理,对spring cloud gateway的使用,还是有好处的。

二、网关的作用

从名字就可以看到,它是一个网络的关卡,无论后端多么的复杂,这个对外的关卡表现是一致的。

更加重要的是,隐藏在关卡后面的一些通用的事务,都可以抽象出来进行处理。可以把网关,想像成一个类似于海关的东西,你的签证资料准备、安检、调度等,都可以统一进行处理。

api网关就是伴随着微服务概念兴起的一种架构模式,当然也不仅限于微服务。从图中我们可以看到网关的位置。

且看下面网关的具体作用。

2.1 反向代理

这个是所有网关,包括nginx的基本功能。除了能够对服务进行整形,网关一个非常重要的附加收益,就是对后端的服务细节进行了屏蔽。

反向代理同时会带有负载均衡的功能,包括带权重的流量分配。

2.2 鉴权

就是权限认证,也就是常说的权限系统。由于鉴权服务有非常高的相似性,就可以进行抽象处理,放在网关层。

比如https协议的统一接入,分布式session

### Spring Cloud Gateway 整合 OAuth 2.0 实现认证与授权 #### 背景介绍 Spring Cloud Gateway 是一种基于 Reactor 和 Netty 的高性能 API 网关框架,而 OAuth 2.0 则是一种广泛使用的协议,用于实现安全的身份验证和授权机制。通过将两者结合起来,可以在微服务架构中提供统一的安全控制。 以下是关于如何在 Spring Cloud Gateway 中集成 OAuth 2.0 进行身份验证和授权的具体方法: --- #### 配置依赖项 为了支持 OAuth 2.0 功能,在 `pom.xml` 文件中需要引入必要的依赖库: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-oauth2-resource-server</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-gateway</artifactId> </dependency> ``` 这些依赖分别提供了资源服务器的支持以及网关的核心功能[^1]。 --- #### 设置配置文件 在 `application.yml` 或 `application.properties` 文件中定义 OAuth 2.0 的相关参数。例如: ```yaml spring: security: oauth2: resourceserver: jwt: issuer-uri: http://localhost:9000/auth/realms/springboot # Keycloak或其他OAuth提供商的地址 cloud: gateway: routes: - id: user-service-route uri: lb://user-service predicates: - Path=/users/** filters: - StripPrefix=1 ``` 上述配置指定了 JWT 的发行者 URI,并设置了路由规则来保护特定路径下的请求[^2]。 --- #### 安全配置类 创建一个 Java 类以扩展默认行为并自定义安全性逻辑: ```java import org.springframework.context.annotation.Bean; import org.springframework.security.config.web.server.ServerHttpSecurity; import org.springframework.security.web.server.SecurityWebFilterChain; @Configuration public class SecurityConfig { @Bean public SecurityWebFilterChain springSecurityFilterChain(ServerHttpSecurity http) { return http.authorizeExchange() .pathMatchers("/actuator/**").permitAll() // 允许访问监控端点 .anyExchange().authenticated() // 所有其他请求都需要经过身份验证 .and() .csrf().disable() // 关闭CSRF防护(适用于无状态API) .build(); } } ``` 此代码片段确保只有携带有效令牌的客户端才能调用受保护的服务接口。 --- #### 测试流程 完成以上步骤之后,可以通过 Postman 或 curl 工具发送带有 Bearer Token 的 HTTP 请求到目标 URL 来测试整个系统的运行状况。如果一切正常,则应该能够成功获取响应数据;否则会收到未授权错误提示 (HTTP Status Code 401 Unauthorized)。 --- #### 注意事项 - **Token 解析失败处理**:当接收到非法或者过期 token 时,默认情况下会抛出异常中断链路执行过程。可以根据实际需求调整此类场景的行为模式。 - **性能优化建议**:对于高并发环境而言,考虑缓存已解析成功的公钥信息从而减少重复网络开销可能是一个不错的选择。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值