.net core 下的HttpClientWebClient性能测试

Posted dotNET跨平台

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了.net core 下的HttpClientWebClient性能测试相关的知识,希望对你有一定的参考价值。

有许多服务需要拉取api接口数据,因此后端开发少不了对Http访问请求进行封装,最主要的应用方式莫过于采用WebClient进行封装,简单易用;而.net core微软官方推荐的是HttpClient和HttpClientFactory,到底哪个性能更加强劲呢?你是否和我一样也存在同样的疑惑?

Post请求代码

不考虑异常的处理,这里的代码量看起来差不多哎~,
使用WebClient代码如下:

//对象 args
var postData = JsonConvert.SerializeObject(args);
var client = new WebClient { };
client.Headers.Add("Content-Type", "application/json");
byte[] responseBytes;
responseBytes = client.UploadData(uri, "POST", Encoding.UTF8.GetBytes(postData));
var responseString = Encoding.GetEncoding("utf-8").GetString(responseBytes);
var response = JsonConvert.DeserializeObject<Tout>(responseString);

使用HttpClient代码如下:

private static HttpClient _client = new HttpClient();
//下面是主要请求
var postData = JsonConvert.SerializeObject(args);
byte[] responseBytes;
using (var content = new StringContent(postData, Encoding.UTF8, "application/json"))
 {
     var msg = await _client.PostAsync(uri, content);
     responseBytes = await msg.Content.ReadAsByteArrayAsync();
 }

 var responseString = Encoding.GetEncoding("utf-8").GetString(responseBytes);
 var response = JsonConvert.DeserializeObject<Tout>(responseString);

性能测试

从上面的代码可以看到一个采用了同步方式请求远程服务器,而HttpClient是采用异步方式请求远程服务器。感觉在处理大并发上,异步方式消耗的线程数量更少,因为我使用的是50并发测试,并没有发现开启的线程数量有差异,均为55个线程(我是在老的api项目上增加的api接口来进行测试的,所以许多线程可能是asp.net core开启的)。

祭出Jmeter,开启50线程的并发测试。
一番测试,剔除预热请求,结果如下:
webclient:

httpclient:

看起来HttpClient有一点点的优势。反复测试几次,有时候webclient也有优势,因此总体上看旗鼓相当。

连接句柄

说好的HttpClient的优势呢?
监控了服务器的cpu和内存,均未发现太多的差异。然而当分析连接数时,忽然发现HttpClient用的连接time_wait数量远远低于WebClient。

# WebClient 使用情况
LISTEN 21
CLOSE_WAIT 13
ESTABLISHED 47
FIN_WAIT2 2
TIME_WAIT 769
# HttpClient 使用情况
LISTEN 21
CLOSE_WAIT 11
ESTABLISHED 48
TIME_WAIT 49

看起来HttpClient共享连接的优化做的还是不错的!

小结

HttpClientFactory在这里没有测试,不过我单独写了个控制台测试了下,其性能略微比HttpClient低一点点,可能是重用消耗了时间,但理论上其内存消耗应该更低。

到底采用WebClient还是HttpClient封装,亲们,自己看着办吧!

以上是关于.net core 下的HttpClientWebClient性能测试的主要内容,如果未能解决你的问题,请参考以下文章

IIS在ASP.NET Core下的两种部署模式

.net core 下的TagHelper自定义新手提醒

.net core 下的TagHelper自定义新手提醒

又一篇Centos7下的asp.net core部署教程

总结:利用asp.net core日志进行生产环境下的错误排查(asp.net core version 2.2,用IIS做服务器)

.net core 下的HttpClientWebClient性能测试