HTTP反向代理实现及压测<未完成>
发布于2024-11-13 22:00:36,更新于2024-11-18 21:17:45,标签:java nginx 文章会持续修订,转载请注明来源地址:https://meethigher.top/blog最近对自己手撕的HTTP反向代理,进行了压测,并与Nginx进行对比,以便于排查其中的隐患问题。
一、HTTP反代注意事项
先记录一下实现HTTP反向代理的注意事项
- 请求头、响应头中,都应删除逐跳标头。
- Connection
- TE
- Transfer-Encoding
- Keep-Alive
- Proxy-Authorization
- Proxy-Authentication
- Trailer
- Upgrade
- 通过标头Content-Length或Transfer-Encoding判定是否存在请求体,但这两者不能同时存在。
- Content-Length: 需要预先计算请求体长度,适合小的请求体。
- Transfer-Encoding: 不需要计算请求体长度,适合大文件等内容的流式传输。
- Host标头不应进行转发
这只是我在处理时的一些操作,注意事项其实还有更多,参考自What Proxies Must Do
二、性能比较
2.1 前置环境
在Windows进行TCP相关的压测时,首先需要调整一下动态端口的范围。不然在压测过程中,会出现端口耗尽的情况。
1 | # 查看动态端口范围 |
版本信息
- java: 8
- jmeter: 5.6.3
压测条件及预期
- 并发:2000
- 持续:2分钟
- 预期目标:错误率为0的情况下,吞吐量尽量最大
以下图为例
- 压测客户端Windows11:AMD_R5_7640_6核12线程
- 压测服务端Windows11:I9_14900HX_24核32线程
- 代理服务
- Nginx
- HTTP-Proxy-Servlet:bio实现
- http-proxy-boot: 使用bio自行实现
- java8
- springboot2.5.14
- okhttp3
- tcp-reverse-proxy: 使用nio自行实现
- java8
- vertx4.5.10
- 应用服务:HTTP接口固定十秒才会响应,已验证最大支持2000并发。
- 代理服务
压测是使用两台物理机进行压测的,由于要经过局域网的路由器,干扰因素较多,网络波动较大。压测结果只能做参考。
应用服务压测2分钟,实际结果如下
Label | Samples | Average | Min | Max | Std. Dev. | Error % | Throughput | Received KB/sec | Sent KB/sec | Avg. Bytes |
---|---|---|---|---|---|---|---|---|---|---|
HTTP Request | 24000 | 10037 | 10006 | 10271 | 25.87 | 0.00% | 198.5621 | 69.78 | 27.31 | 359.9 |
TOTAL | 24000 | 10037 | 10006 | 10271 | 25.87 | 0.00% | 198.5621 | 69.78 | 27.31 | 359.9 |
2.2 压测结果
2.2.1 Nginx
在Windows上使用Nginx作为负载压测时,遇到了错误windows maximum number of descriptors supported by select() is 1024
。排查后是因为nginx.exe在编译时,设置的--with-cc-opt=-DFD_SETSIZE=1024
过小导致的,重新编译或者下载别人编译好的即可解决。参考nginx访问报错“maximum number of descriptors supported by select() is 1024 while connecting to upstream”问题的处理 - Zhai_David - 博客园
1 | # 查看编译参数及版本信息 |
压测结果
Label | Samples | Average | Min | Max | Std. Dev. | Error % | Throughput | Received KB/sec | Sent KB/sec | Avg. Bytes |
---|---|---|---|---|---|---|---|---|---|---|
HTTP Request | 24000 | 10068 | 10010 | 10610 | 61.46 | 0.00% | 197.3733 | 72.06 | 28.11 | 373.9 |
TOTAL | 24000 | 10068 | 10010 | 10610 | 61.46 | 0.00% | 197.3733 | 72.06 | 28.11 | 373.9 |
2.2.2 HTTP-Proxy-Servlet
Label | Samples | Average | Min | Max | Std. Dev. | Error % | Throughput | Received KB/sec | Sent KB/sec | Avg. Bytes |
---|---|---|---|---|---|---|---|---|---|---|
HTTP Request | 24000 | 10139 | 10007 | 11512 | 230.74 | 0.00% | 195.5225 | 68.71 | 27.85 | 359.9 |
TOTAL | 24000 | 10139 | 10007 | 11512 | 230.74 | 0.00% | 195.5225 | 68.71 | 27.85 | 359.9 |
2.2.3 http-proxy-boot
Label | Samples | Average | Min | Max | Std. Dev. | Error % | Throughput | Received KB/sec | Sent KB/sec | Avg. Bytes |
---|---|---|---|---|---|---|---|---|---|---|
HTTP Request | 24000 | 10366 | 10006 | 13722 | 654.09 | 0.00% | 191.6244 | 57.8 | 27.3 | 308.9 |
TOTAL | 24000 | 10366 | 10006 | 13722 | 654.09 | 0.00% | 191.6244 | 57.8 | 27.3 | 308.9 |
2.2.4 tcp-reverse-proxy
使用vertx自行实现http反代,尚存在bug。
打赏