WebFlux与Tomcat、WebClient与OKHttp的性能对比

概述

为了测试不同http框架的性能,开发了如下demo,链路关系如下所示:

技术栈

  1. gateway采用reactor编写,底层为netty,不再使用tomcat
  2. demo-client采用reactor编写,底层为netty,不再使用tomcat。其中对demo-svc的接口有两种:一是使用OKHttp优化的feign;二是使用reactor优化的feign。
  3. demo-svc采用reactor编写,底层为netty,不再使用tomcat。
  4. demo-mvc采用tomat编写。

核心代码

服务端核心代码

WebFlux与Tomcat、WebClient与OKHttp的性能对比_第1张图片

 

客户端核心代码

客户端采用两种形式:

使用reactor优化的feign

WebFlux与Tomcat、WebClient与OKHttp的性能对比_第2张图片

使用OKHttp优化的feign

WebFlux与Tomcat、WebClient与OKHttp的性能对比_第3张图片

WebFlux与Tomcat、WebClient与OKHttp的性能对比_第4张图片

Controller

入口都采用reactor:

WebFlux与Tomcat、WebClient与OKHttp的性能对比_第5张图片

压测结果

Webflux与Tomcat的对比

300线程,10Ramp-up,循环100次

Tomcat

Webflux

 

500线程,30 Ramp-up,循环100次

Tomcat

Webflux

 

500线程,20 Ramp-up,循环100次

Tomcat

Webflux

 

500线程,10 Ramp-up,循环100次

Tomcat

Webflux

 

可以看到,Webflux属于压不死的小强,越是压力大越强。

 

Webclient和OKHttp对比

500线程,10 Ramp-up,循环100次

Webclient

OKHttp

总结

相对来说,使用reactor(webflux)还是有很大性能优势的。相对于使用tomcat的传统方式,netty在线程管理、多路复用、异步非阻塞等方面都更具优势。特别在高并发高压力的环境下,netty可以保证在响应时间没有太多变化的情况下最大化吞吐量。下图是网友的测试结果:

WebFlux与Tomcat、WebClient与OKHttp的性能对比_第6张图片

https://blog.csdn.net/get_set/article/details/79492439

http client方面,OKHttp比基于reactor的webclient的表现要好很多。但他们两个都比原生的feignHttpClient性能好得多。下面的链接是网友的测试结果:https://blog.csdn.net/get_set/article/details/79506373

另外,对于Tomcat的NIO的问题,可以看这里的解释:

WebFlux与Tomcat、WebClient与OKHttp的性能对比_第7张图片

基于以上压测结果,我认为可以尝试使用webflux+okhttp的并行方案。Server用webflux启动,client用okhttp。

另外,如果时间允许,还可以尝试使用Java中最强的RPC框架thrift对Spring Cloud进行整合。

 

你可能感兴趣的:(Spring,Cloud)