利用Nginx的stream实现Netty的TCP负载均衡
随着设备连接数增多,单台服务器支撑的TCP长连接数有限,这个时候程序架构就需要改变,一般都会采取横向扩展,增加多台服务器程序。怎么将TCP长连接均衡的路由到不同的服务器,这个时候就需要实现负载均衡了。
两种不同的场景和方案
两种应用场景是:
客户端实现比较简单,所有客户端都会连接同一个ip域名和端口。客户端不会去请求可用服务器列表,然后去根据具列表选择不同的服务器。比如说一些DTU等硬件设备或者因为前期没有考虑负载均衡而导致的遗留老项目。
解决方案:
在目标服务器上做TCP负载均衡,转发到不同的服务器上,但是这种方案需要解决负载均衡服务器的单点故障。例如可以通过Nginx开启TCP负载均衡功能来实现。
客户端本身就实现了请求可用服务器列表,然后根据列表去连接不同的服务器。
解决方案
解决方案比较多,例如可以通过
Zookeeper
、SpringCloud
等来实现。
方案一:Nginx实现负载均衡
安装Nginx
修改nginx.conf添加负载均衡配置
参考:http://nginx.org/en/docs/stream/ngx_stream_core_module.html
配置如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19worker_processes 1;
events {
worker_connections 1024;
}
#tcp load balance
stream{
# 更多更详细的参数,查看文档或网络
upstream netty_test{
server 127.0.0.1:9991 weight=1;
server 127.0.0.1:9992 weight=1;
}
server{
listen 9999;
proxy_pass netty_test;
}
}连接测试
启动两个netty服务器程序,在生产环境中会部署到不同的服务器,这里测试,在同一台PC上启动两个netty程序,端口分别为
9991
和9992
。使用客户端连接
127.0.0.1:9999
,当建立多个连接时,客户端会被平均路由到127.0.0.1:9991
和9992
两个server。
利用Nginx的stream实现Netty的TCP负载均衡