SpringCloud Gateway 路由数量对性能的影响研究

本文通过实验研究了SpringCloud Gateway在不同数量路由下的性能表现,发现路由表的膨胀严重影响性能,特别是达到10W条路由时,服务性能显著下降。提出了两级路由机制和定制化查找策略两种优化方案,倾向于后者进行优化。
摘要由CSDN通过智能技术生成

背景描述

近期在公司建设 API 治理平台过程中,以 SpringCloud Gateway 为基础,构建了一个 API 的 Mock 服务,以 API 的 URI 作为路由,根据服务端存储的 API DSL,验证请求信息,生成并返回 Mock 报文。

SpringCloud Gateway 具备很好的 动态路由 支持功能,可以在 API DSL 创建的同时,创建一条 Mock 路由,这样 API DSL 创建后,开发人员就可以使用 Mock 服务进行开发调试工作。

但作为一个企业级应用,所管辖的 API 的数量众多,SpringCloud Gateway 在路由表急剧膨胀后的性能如何?目前没有查阅到明确说明的资料。翻阅其源码发现,断言命中其实是进行的遍历,这样路由表膨胀时,路由性能存疑,需要进行验证,根据验证结果制定近一步优化方案。

验证方法

保持其他所有变量不变,仅调整路由表大小,使用 JMH 工具进行基准测试,得出路由表膨胀与路由性能的关系。

需要编写三个服务:

  1. 路由网关

  2. 挡板服务(路由转发的 upstream)

  3. JMH 测试端

配置信息

  CPU Intel(R) Core(TM) i7-9700K CPU @ 3.60GHz
  基准速度:  3.60 GHz  插槽:  1  内核:  8  逻辑处理器:  8  虚拟化:  已启用  L1 缓存:  512 KB  L2 缓存:  2.0 MB  L3 缓存:  12.0 MB
  测试期间CPU利用率约  50%
  SpringCloud Gateway 3.0.3, Java 1.8.0_251

测试过程需控制变量,所以 CPU 负债不能过高,下图是我执行测试时的 CPU 负载情况

路由定义示例

{
      "_id": {
          "$oid": "60c4f055588bca06132e44cb"    },    "predicates": [{
          "name": "Path",        "args": {
              "_genkey_0": "/1999"        }    }],    "filters": [{
          "name": "AddRequestHeader",        "args": {
              "_genkey_0": "x-benchmark-routeId",            "_genkey_1": "60c4f055588bca06132e44cb"        }    }, {
          "name": "PrefixPath",        "args": {
              "_genkey_0": "/ok"        }    }],    "uri": "http://localhost:9999",    "metadata": {},    "order": 1,    "_class": "com.example.scgw.benchmark.route.MongoRouteDefinition"}

测试结论

见上图,测试结果无论系统的吞吐量,还是响应时间指标,都随着路由表的膨胀变差,当路由表膨胀到 10W 级别时,服务基本不可用了!

这一结论印证了我的猜想。

优化思路一

保持路由网关的通用性(SpringCloud Gateway 设计了很多路由断言手段,包括基于 path、method、header、parameter 等等),采用两级(多级)路由机制见下图:

优化思路二

Mock 服务是一个专有场景,仅根据 Path 和指定 Header 进行转发,可以修改 SpringCloud Gateway 源码,提供一个根据 Path+指定 Header 查找路由的 HashMap,这样进行路由断言时就不需进行路由表遍历。

个人倾向于按照思路二进行优化,优化过程见SpringCloud Gateway 路由转发性能优化

测试相关代码

路由网关

pom.xml

<dependency>  <groupId>org.springframework.boot</groupId>  <artifactId>spring-boot-starter-data-mongodb-reactive</artifactId>
在进行Spring Cloud Gateway性能调优时,可以考虑以下几个方面: 1. 版本升级:确保使用最新的Spring Boot、Spring CloudSpring Cloud Alibaba版本,因为新版本通常会修复一些性能问题并引入一些优化。 2. 配置调整:根据实际情况对Spring Cloud Gateway的相关配置进行调整。比如,可以通过调整`spring.cloud.gateway.httpclient.pool.type`参数来选择合适的连接池类型(例如ELASTIC、FIXED或DISABLED)。此外,还可以调整连接池的最大连接数(`spring.cloud.gateway.httpclient.pool.max-connections`)和其他相关连接参数,以提高性能。 3. 路由优化:检查并优化Gateway路由配置。可以通过减少路由规则的数量、简化路由规则表达式、合并相似的路由规则等方式来优化路由性能。 4. 缓存机制:如果可以,考虑使用缓存机制来减轻后端服务的负载。可以使用Spring Cloud Gateway的内置缓存功能或者结合其他缓存组件来实现。 5. 异步处理:对于处理比较耗时的请求,可以考虑使用异步处理来提高性能。可以使用Spring Cloud Gateway的异步处理功能,将请求转发给异步处理的线程池进行处理。 总结起来,对于Spring Cloud Gateway性能调优,可以从版本升级、配置调整、路由优化、缓存机制和异步处理等方面入手,根据具体需求和场景进行优化。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [Spring Cloud Gateway 服务器性能异常,以及优化策略](https://blog.csdn.net/weixin_42321034/article/details/123284715)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [spring cloud gateway性能优化](https://blog.csdn.net/weixin_42161936/article/details/123395773)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值