1 .问题
spring-cloud-gateway作为统一请求的入口,负责向对应的微服务转发请求。
采用的Spring Cloud版本为Finchley SR2。
测试一个接口的性能发现,如果tps只有1000 req/s左右,就会提高。
其中,post-test.lua的内容如下:
网关逻辑读取请求中的主体值,根据biz_code字段进行内存中的匹配路由,并将请求转发到相应的微服务。
2 .故障诊断
1、测试接口自身性能:
据悉,接口的tps将达到7000。
1、通过spring-boot-admin查找网关的cpu、内存等占用情况,查找发现所有不可用的线程的状态,发现reactor-http-nio线程组被阻止对于响应编程,reactor-http-nio线程块是灾难性的。
2、用jstack命令分析线程状态,确定被阻止的代码(第19行) :
要最终转到问题代码:
这里的逻辑是,必须读取请求中的body的值,将其转换为json,并根据其中的特定字段匹配和传输路由。 在这里,您首先选择了将exchange转换为默认服务器请求。 目的是使用此类的bodyToMono方法使其易于转换。
3 .解决
改写代码实现同样的功能:
然后进行测试,
发现tps从1000上升到5000,问题解决了。