有许多服务需要拉取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封装,亲们,自己看着办吧!