96SEO 2026-02-20 09:39 12
xmlns="http://www.w3.org/2000/svg">
style="-webkit-tap-highlight-color:
0)">
在微服务架构体系里,API网关作为整个系统的统一入口,肩负着路由转发、鉴权认证、流量控制等诸多关键职责。
本文详细记录了在Spring
Gateway(基于WebFlux)中集成若依框架(基于MVC)鉴权功能时所经历的技术选型过程,深入剖析了WebFlux与MVC的技术差异,并阐释了最终选择HTTP远程鉴权方案的决策依据。
id="_3">目录
若依框架基于MVC
生态成熟度对比
各方案优劣对比
可能引入雪崩风险
选择理由
统一抽象层设计
项目一致性重要性
Gateway需要集成若依鉴权
在合同审查平台的架构设计工作中,我们选定Spring
Gateway作为API网关,以此来统一管理所有微服务的入口。
同时,引入若依框架作为认证授权的基础架构,目的是让Gateway能够复用若依的权限体系。
这就如同在一个大型商场中,Gateway是所有用户进入各个店铺(微服务)的大门,而若依框架则是负责检查用户是否有资格进入特定店铺(访问特定权限资源)的安保系统。
id="12_GatewayWebFlux_40">
1.2Gateway基于WebFlux
这实际上是一种“被动选择”。
并非我们主动挑选WebFlux,而是因为Spring
Gateway的路由功能自身便是基于WebFlux实现的。
Spring
Gateway作为Spring官方力荐的下一代API网关(用以替代第一代的Zuul),其底层架构完全构建于Spring
WebFlux之上。
这就意味着:
Gateway强大的路由功能,就不得不接纳WebFlux。
MVC组件。
查看contract
gateway的pom.xml文件,能清晰看到WebFlux的依赖配置:
punctuation"><dependency
class="token
punctuation">>
class="token
punctuation"><
groupIdclass="token
punctuation">>
org.springframework.cloudclass="token
punctuation"></
groupIdclass="token
punctuation">>
class="token
punctuation"><
artifactIdclass="token
punctuation">>
spring-cloud-starter-gateway-server-webfluxclass="token
punctuation"></
artifactIdclass="token
punctuation">>
class="token
punctuation"></
dependencyclass="token
punctuation">>
class="token
punctuation"><
dependencyclass="token
punctuation">>
class="token
punctuation"><
groupIdclass="token
punctuation">>
org.springframework.bootclass="token
punctuation"></
groupIdclass="token
punctuation">>
class="token
punctuation"><
artifactIdclass="token
punctuation">>
spring-boot-starter-webfluxclass="token
punctuation"></
artifactIdclass="token
punctuation">>
class="token
punctuation"></
dependencyclass="token
punctuation">>
WebFlux相关的功能,表明该项目基于WebFlux构建。
若依框架基于MVC
若依框架作为一款成熟的开源权限管理系统,其核心是搭建在传统的Spring
Vue的pom.xml可以发现:
SpringBoot的依赖配置-->
class="token
punctuation"><
dependencyclass="token
punctuation">>
class="token
punctuation"><
groupIdclass="token
punctuation">>
org.springframework.bootclass="token
punctuation"></
groupIdclass="token
punctuation">>
class="token
punctuation"><
artifactIdclass="token
punctuation">>
spring-boot-dependenciesclass="token
punctuation"></
artifactIdclass="token
punctuation">>
class="token
punctuation"><
versionclass="token
punctuation">>
3.5.8class="token
punctuation"></
versionclass="token
punctuation">>
class="token
punctuation"><
typeclass="token
punctuation">>
pomclass="token
punctuation"></
typeclass="token
punctuation">>
class="token
punctuation"><
scopeclass="token
punctuation">>
importclass="token
punctuation"></
scopeclass="token
punctuation">>
class="token
punctuation"></
dependencyclass="token
punctuation">>
MVC的功能体系,也由此造成了与WebFlux在编程模型上的本质区别。
编程模型差异
| 维度 | SpringMVC | Spring WebFlux |
|---|---|---|
| 编程范式 | 命令式编程 | 响应式编程 |
| 返回类型 | 直接返回对象 | Mono/Flux |
| 阻塞特性 | 阻塞I/O | 非阻塞I/O |
| 代码风格 | 同步调用 | 链式调用 Lambda |
| 学习曲线 | 平缓 | 较陡 |
例如,对于同样获取用户信息并关联角色的业务逻辑,两种框架的写法差异显著:
function">getUserById
class="token
punctuation">>
roles
function">findByUserId
class="token
punctuation">(
rolesclass="token
punctuation">>
function">getUserById
class="token
function">findByUserId
class="token
function">collectList
class="token
function">***nReturn
class="token
punctuation">}
在上述代码示例中,MVC风格采用传统的同步方式,按照顺序依次执行数据库查询和对象赋值操作。
而WebFlux风格则运用响应式编程,通过Mono和链式调用,以非阻塞的方式处理异步操作。
这就好比MVC是按照顺序一项一项完成任务,而WebFlux则可以同时处理多个任务,并在合适的时机组合结果。
Request模型,即每个请求都会占用一个独立线程,直至响应完成。
而WebFlux则利用少量固定线程来应对大量并发请求:
可以将MVC线程模型想象成每个用户(请求)都有一个专属的服务员(线程)全程陪同,在等待上菜(数据库查询等操作)时,服务员只能干等。
而WebFlux的线程模型则像是几个服务员同时服务众多用户,在等待上菜时,服务员可以去处理其他用户的需求。
2.3
性能特性差异
WebFlux在以下场景中优势凸显:
然而,在若依鉴权这类场景下,其优势并不突出。
因为权限验证主要依赖数据库查询,依然是I/O等待过程,就如同在一个用户数量相对稳定的小餐馆,即使采用了大型餐厅的高效服务模式(WebFlux),也难以体现出明显优势。
生态成熟度对比
| 方面 | SpringMVC | Spring WebFlux |
|---|---|---|
| 历史 | 2004年 | 2017年 |
| 社区成熟度 | 非常成熟 | 持续发展 |
| 第三方库兼容 | 广泛兼容 | 部分库不支持 |
| 调试便利性 | 堆栈清晰 | 异步堆栈复杂 |
| 资料丰富度 | 极其丰富 | 相对较少 |
Spring
MVC由于诞生时间较早,经过多年发展,积累了丰富的社区资源、大量兼容的第三方库以及清晰的调试方法,就如同是一座发展成熟、设施完备的城市。
而Spring
WebFlux作为较新的技术,虽然在不断发展,但在这些方面相对较弱,类似于正在建设中的新兴城市。
方案一:改造若依支持WebFlux
思路:将若依框架的核心模块全面改造为WebFlux响应式编程模型。
优势:
劣势:
方案二:本地鉴权
思路:在Gateway内部直接实现权限验证逻辑,独立维护一套用户权限数据。
优势:
劣势:
方案三:远程鉴权中心
思路:保持若依框架不变,Gateway通过Feign客户端调用若依的鉴权接口。
优势:
劣势:
各方案优劣对比
| 评估维度 | 方案一:改造若依 | 方案二:本地鉴权 | 方案三:远程鉴权 |
|---|---|---|---|
| 开发成本 | 极高 | 中等 | 低 |
| 维护成本 | 低(若统一) | 高(双维护) | 低 |
| 性能 | 最优 | 最优 | 略有损耗 |
| 数据一致性 | 强一致 | 需要同步 | 强一致 |
| 技术风险 | 高 | 中 | 低 |
| 复用性 | - | 差 | 好 |
id="WebFlux_190">四、放弃WebFlux改造的原因
项目其他模块都是MVC
查看项目结构,会发现除了Gateway采用WebFlux外,其他核心服务如contract
punctuation"><dependency punctuation">> punctuation">< punctuation">> punctuation"></ punctuation">> punctuation"></ punctuation">> punctuation">< punctuation">> punctuation">< punctuation">> punctuation"></ punctuation">> punctuation"></ punctuation">>class="token
class="token
class="token
class="token
class="token
class="token
class="token
class="token
class="token
class="token
class="token
class="token
class="token
class="token
class="token
如果仅仅为了Gateway而改造若依,会致使项目技术栈分裂更为严重,就像一个团队里,大部分人说一种语言,只有少数人说另一种语言,交流和协作会变得困难。
MVC拥有丰富的开发经验,但对响应式编程相对陌生。
这意味着学习成本和调试难度都会增加,就像要去一个陌生的地方,不仅要学习当地的语言和文化,遇到问题时解决起来也更困难。
异步结构Debug困难
WebFlux的响应式编程堆栈复杂,当出现问题时,定位和排查的难度远高于同步代码。
这就好比在一个迷宫中寻找出路,同步代码的迷宫可能路线比较清晰,而异步结构的迷宫则充满了错综复杂的路径,更难找到问题所在。
可能引入雪崩风险
将成熟的若依框架改造为WebFlux,可能会引入未知的问题和风险,进而影响系统的稳定性。
就像对一座原本坚固的桥梁进行大规模改造,可能会破坏其原有的稳定性,带来意想不到的危险。
id="_215">五、最终选型:远程鉴权中心
HTTP方案(选择)
最终确定通过HTTP协议调用若依鉴权服务的方案,使用Feign客户端进行远程调用。
核心配置如下:
punctuation">@FeignClient
class="token
string">"remoteAuthFeignService"
class="token
class-name">RemoteAuthFeignService
punctuation">@PostMapping
class="token
string">"/remote/auth/validate"
class="token
function">validatePermission
class="token
punctuation">@RequestBody
class-name">AuthValidateRequest
request
punctuation">}
上述代码定义了一个Feign客户端接口RemoteAuthFeignService,通过@FeignClient注解指定了服务名称、上下文ID和路径。
validatePermission方法用于远程调用若依鉴权服务的权限验证接口。
gRPC方案(备选但放弃)
虽然gRPC在性能上优于HTTP,但考虑到:
最终没有选择gRPC方案。
这就好比有一辆速度更快的车(gRPC),但需要特定的道路(若依框架支持),且司机(团队)不熟悉驾驶方法,维修工具(调试工具)也不好找,所以最终选择了更熟悉的交通工具(HTTP)。
选择理由
Cloud生态的标准组件,团队熟悉,能够充分利用已有的技术知识,减少学习成本。
id="61_Gateway_WebFlux_250">6.1
WebFlux环境
针对WebFlux环境,ruoyi
feign模块提供了RemoteAuthWebFilter:
punctuation">@Order
class="token
class-name">Ordered
class="token
punctuation">.
HIGHEST_PRECEDENCEclass="token
class-name">RemoteAuthWebFilter
punctuation">>
class-name">ServerWebExchange
exchange
class-name">WebFilterChain
chain
class-name">WebFluxRouteUtil
class="token
function">getHandlerMethod
class="token
punctuation">(
exchangeclass="token
class-name">RemotePreAuthorize
annotation
function">getRemotePreAuthorizeAnnotation
class="token
punctuation">(
handlerMethodclass="token
function">extractToken
class="token
punctuation">(
exchangeclass="token
function">getRequest
class="token
function">validateRemotePermission
class="token
punctuation">(
tokenclass="token
punctuation">(
has
class="post-meta-container">
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback