前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >SpringCloud Gateway-多路由性能优化

SpringCloud Gateway-多路由性能优化

原创
作者头像
heelynn
修改2024-10-18 16:59:58
1300
修改2024-10-18 16:59:58
举报
文章被收录于专栏:网关

概述

由于网关属于公共服务,且需要应对后续持续的量级增长,所以路由数量对于性能的影响不可忽视。

性能测试

测试过程

  1. 压测参数
    1. 20W次请求
    2. 1000个线程
  2. 路由匹配
    1. 单路由配置项:只配置5个路由,完全匹配
    2. 多路由配置项:匹配成功前,存在1000个不匹配的路由

测试结果

一、QPS

  • 5个路由匹配:
    5个路由匹配
    5个路由匹配
  • 1000个路由匹配:
    1000个路由匹配
    1000个路由匹配

二、资源使用

1. CPU
CPU
CPU
2. GC
GC
GC
2. STW
STW
STW

结论

  • 路由匹配数量对QPS的影响非常大
  • 对CPU、GC、STW的影响同样较大。

问题定位

一、性能比对

5个路由(性能良好)

由下图可见,整体CPU的时间分布比较正常,3部分时间都比较平均,且均为网络和React等组件耗时,所以整体是相对健康的状态。

fire_5_routes
fire_5_routes

1000个路由(性能较差)

由下图可见,明显第1部分的CPU使用率在整个占比中呈现比例不正常的特性,所以性能的主要问题来自第1部分。

fire_1000_routes
fire_1000_routes

二、问题定位

fire_reason
fire_reason
  • 由图可知CPU利用率高的地方来自 org/springframework/cloud/gateway/handler/predicate/HostRoutePredicateFactory$1.test
  • HostRoutePredicateFactory是用来校验域名是否匹配的
  • 而构建的1000个测试路由与请求URL正是由于域名不一致导致不匹配,此处与性能指标与构建的测试模型匹配。

性能优化

问题原因

每个请求会对Route链进行遍历,时间复杂度为O(n),随着网关不断使用,Route也会不断增加。所以性能也会不断下降。

解决方案

  • 思路:最直观的想法是就为Route做缓存,而且刚好域名就是最合适的维度。
  • 域名适合作缓存维度的原因:
    • 首先,域名是稳定的,不会随着请求路径的变化而变化。
    • 其次,域名下的Route不会无限增长,通常是较为有限的数量。

解决结果

代码修改

通过以下两个方面扩展网关功能

  • 路由加载
    • 加载过程中,解析Route的Host配置项
    • 通过Host做为Key,Route链表最为值,以域名的维度对Route进行缓存
  • 路由选择
    • 修改SpringCloudGateway的路由选择器
    • 通过请求过来的Host精准匹配Route链,执行路由操作。

优化后的1000个路由HTTP压力测试

QPS_1000_After
QPS_1000_After

可以看到,同样是1000个路由,QPS和响应时间均已恢复正常。

HostRoutePredicateFactory调用时长

  • 优化前
  • 优化后
    fire_host_route_after
    fire_host_route_after

结果

此处 org/springframework/cloud/gateway/handler/predicate/HostRoutePredicateFactory$1.test的使用量已经非常小了,程序回归正常

代码示例

参考如下代码:

spring-cloud-gateway-domain-routers

如果解决了各位大神的问题,欢迎在Github上点一个Star,Github下还有其他开源框架,感兴趣的同学欢迎使用、提出问题

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 概述
  • 性能测试
    • 测试过程
      • 测试结果
        • 一、QPS
        • 二、资源使用
        • 结论
    • 问题定位
      • 一、性能比对
        • 5个路由(性能良好)
        • 1000个路由(性能较差)
      • 二、问题定位
      • 性能优化
        • 问题原因
          • 解决方案
            • 解决结果
              • 代码修改
              • 优化后的1000个路由HTTP压力测试
            • 结果
            • 代码示例
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档