有感于 myzony 发布的 针对 Ocelot 网关的性能测试 ,并且公司下一步也需要对.net和java的应用做一定的整合,于是对Ocelot网关、Spring Cloud Gateway网关做个了对比测试,使用了wrk进行测试
.net core + Spring Cloud Gateway 是使用 steeltoe 工具接入注册中心Spring Cloud Eureka,共Spring Cloud Gateway调用
应用服务器环境 windows server 2008 .net core 2.2 java 1.8
172.16.1.65 部署 Ocelot的.net core接口-6002、Spring Cloud Gateway的spring boot接口-9004、Spring Cloud Gateway的.net core接口-9001
172.16.1.68 部署 Ocelot的.net core接口-6004、Spring Cloud Gateway的spring boot接口-9004、Spring Cloud Gateway的.net core接口-9001
172.16.1.120 部署 Ocelot网关-6000、Spring Cloud Eureka注册中心-7000 + Spring Cloud Gateway网关-8000
测试工具 wrk 参数统一为 -t 50 -c 10000 -d 60s --latency --timeout 3s
测试服务器环境 centos 7.5 172.16.1.144,并根据 wrk的报错修改了最大打开文件数限制
测试结果汇总如下图
可以看出Ocelot的总请求数、QPS比Gateway高不少,而且超时数也少,但是平均响应时间要比Gateway高不少。
总体上来说,两者基本上处于同一水平,对于一般的企业业务系统足够了,因为上面的测试的都没有涉及业务处理,系统瓶颈不应该是在网关。
考虑我们公司的实际情况,倾向使用 .net core+spring cloud gateway,这样大家各自做各自的,只需要做好接入就好了。
测试结果明细
1. 直测.net core接口 QPS: 51305.10
wrk -t 50 -c 10000 -d 60s --latency --timeout 3s http://172.16.1.65:9001/user/get
50 threads and 10000 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 153.83ms 390.10ms 3.00s 90.15%
Req/Sec 1.04k 495.03 28.76k 78.30%
Latency Distribution
50% 4.64ms
75% 5.33ms
90% 534.34ms
99% 1.98s
3082512 requests in 1.00m, 440.96MB read
Socket errors: connect 0, read 4777, write 4800, timeout 23227
Requests/sec: 51305.10
Transfer/sec: 7.34MB
2. 直测spring boot 接口 QPS: 45933.02
wrk -t 50 -c 10000 -d 60s --latency --timeout 3s http://172.16.1.65:9004/user/get
50 threads and 10000 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 222.69ms 439.08ms 3.00s 87.63%
Req/Sec 0.93k 320.20 4.28k 69.47%
Latency Distribution
50% 6.25ms
75% 306.19ms
90% 776.66ms
99% 2.10s
2760646 requests in 1.00m, 342.67MB read
Socket errors: connect 0, read 2169, write 5481, timeout 20834
Requests/sec: 45933.02
Transfer/sec: 5.70MB
3. .net core 接口(65:6002、68:6004) + ocelot QPS:9068.52
wrk -t 50 -c 10000 -d 60s --latency --timeout 3s http://172.16.1.120:6000/api/values/
50 threads and 10000 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 849.82ms 287.67ms 3.00s 74.12%
Req/Sec 190.05 119.66 5.26k 67.26%
Latency Distribution
50% 840.16ms
75% 999.96ms
90% 1.18s
99% 1.69s
545037 requests in 1.00m, 90.96MB read
Socket errors: connect 0, read 11, write 2905, timeout 1181
Non-2xx or 3xx responses: 3
Requests/sec: 9068.52
Transfer/sec: 1.51MB
4. spring boot 接口(65:9004、68:9004) + spring cloud gateway QPS:7497.19
wrk -t 50 -c 10000 -d 60s --latency --timeout 3s http://172.16.1.120:8000/user-service/user/get
50 threads and 10000 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 174.39ms 96.40ms 2.98s 68.88%
Req/Sec 220.62 288.26 4.25k 92.94%
Latency Distribution
50% 163.92ms
75% 236.53ms
90% 297.77ms
99% 404.96ms
450571 requests in 1.00m, 56.72MB read
Socket errors: connect 0, read 0, write 279597, timeout 1490
Requests/sec: 7497.19
Transfer/sec: 0.94MB
5. .net core 接口(65:9001、68:9001) + spring cloud gateway QPS:7762.32
wrk -t 50 -c 10000 -d 60s --latency --timeout 3s http://172.16.1.120:8000/user-service/user/get
50 threads and 10000 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 174.75ms 85.90ms 2.98s 74.25%
Req/Sec 211.85 244.15 2.78k 93.53%
Latency Distribution
50% 165.13ms
75% 220.84ms
90% 276.64ms
99% 392.74ms
466503 requests in 1.00m, 66.73MB read
Socket errors: connect 0, read 0, write 250560, timeout 1407
Requests/sec: 7762.32
Transfer/sec: 1.11MB
.net core 所有应用,在Startup中关闭日志
public void ConfigureServices(IServiceCollection services)
{
services.AddLogging(op => op.ClearProviders());
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
}
Ocelot 网关,在Startup中关闭日志,注释掉mvc的注入和使用
public void ConfigureServices(IServiceCollection services)
{
services.AddLogging(op => op.ClearProviders());
services.AddOcelot(Configuration);
//services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseOcelot().Wait();
//app.UseMvc(routes => {
// routes.MapRoute(
// name: "default",
// template: "{controller=Home}/{action=Index}/{id?}");
//});
}
来源:oschina
链接:https://my.oschina.net/u/4294668/blog/3630411