admin管理员组文章数量:1794759
SpringCloud Gateway
概述
由于网关属于公共服务,且需要应对后续持续的量级增长,所以路由数量对于性能的影响不可忽视。
性能测试
测试过程
- 压测参数
- 20W次请求
- 1000个线程
- 路由匹配
- 单路由配置项:只配置5个路由,完全匹配
- 多路由配置项:匹配成功前,存在1000个不匹配的路由
测试结果
一、QPS
- 5个路由匹配: 5个路由匹配
- 1000个路由匹配: 1000个路由匹配
二、资源使用
1. CPU
2. GC
2. STW
结论
- 路由匹配数量对QPS的影响非常大
- 对CPU、GC、STW的影响同样较大。
问题定位
一、性能比对
5个路由(性能良好)
由下图可见,整体CPU的时间分布比较正常,3部分时间都比较平均,且均为网络和React等组件耗时,所以整体是相对健康的状态。
1000个路由(性能较差)
由下图可见,明显第1部分的CPU使用率在整个占比中呈现比例不正常的特性,所以性能的主要问题来自第1部分。
二、问题定位
- 由图可知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压力测试
可以看到,同样是1000个路由,QPS和响应时间均已恢复正常。
HostRoutePredicateFactory调用时长
- 优化前
- 优化后 fire_host_route_after
结果
此处 org/springframework/cloud/gateway/handler/predicate/HostRoutePredicateFactory$1.test的使用量已经非常小了,程序回归正常
代码示例
参考如下代码:
spring-cloud-gateway-domain-routers
如果解决了各位大神的问题,欢迎在Github上点一个Star,Github下还有其他开源框架,感兴趣的同学欢迎使用、提出问题
本文标签: SpringCloud Gateway
版权声明:本文标题:SpringCloud Gateway 内容由林淑君副主任自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.xiehuijuan.com/baike/1754741160a1705815.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论