Feb
14
2022
Consul-template, Nginx 实现Thrift Consul负载均衡
全体架构
咱们先看下整个结构的架构是什么样子的,这儿咱们有三个服务供给者和三个服务调用者,它们经过 Consul 和 Nginx,以及 Consul-template 来完成负载均衡。
说明 本例子是进行 RPC 的负载均衡,RPC 是 tcp协议,所以 Nginx 要装备 tcp 模块,支撑 tcp 负载均衡。
- Consul 集群 用于服务注册,注册多个服务实例,对外供给 RPC 服务。
- Consul-template 用于实时监测 Consul 中服务的状况,配合本身一个模板文件,生成 Nginx 的装备文件。
- Nginx 运用本身的装备文件和第二步生成的装备文件,进行负载均衡。
Nginx装置
- 装置最新版 Nginx,保证 Nginx 版别在1.9.0以上
- 1.9.0 版别以上才支撑 TCP 转发,据说不是默许装置了该模块,装置完成能够查询一下,假如有--with-stream参数,表示现已支撑TCP。假如没有就从头编译添加参数装置。
- 我的 Nginx 装置在/etc/nginx目录下
- 装置完成运用nginx -t监测一下是否成功。
Consul-template
本文旨在负载均衡,Consul 集群建立不作介绍。
- 下载对应系统版别文件 https://releases.hashicorp.com/consul-template/
- 解压,并复制到PATH路径下
[silence@centos145 ~]$ tar xzvf consul-template_0.19.4_linux_amd64.tgz [silence@centos145 ~]$ mv ./consul-template /usr/sbin/consul-template
-
找个地方新建个文件夹,并创立三个文件
-
config.hcl 首要用来装备consul-template的发动参数项,包含consul服务器的地址,模板文件的方位,生成的装备文件的方位等等。除了consul和template块,其他参数可选。参阅https://github.com/hashicorp/consul-template
-
Consul块装备Consul服务器地址和端口
consul { auth { enabled = false username = "test" password = "test" } address = "172.20.132.196:8500" retry { enabled = true attempts = 12 backoff = "250ms" max_backoff = "1m" } }
- template块装备模板的路径和生成文件的方位,以及生成文件后需求履行的指令。在咱们这儿咱们需求nginx从头加载装备文件,所以设置的指令为nginx -s reload
template { source = "/etc/nginx/consul-template/template.ctmpl" destination = "/etc/nginx/consul-template/nginx.conf" create_dest_dirs = true command = "/usr/sbin/nginx -s reload" command_timeout = "30s" error_on_missing_key = false perms = 0600 backup = true left_delimiter = "{{" right_delimiter = "}}" wait { min = "2s" max = "10s" } }
- template.ctmpl编写,因为这儿只需求服务器地址和端口号就能够,所以模板文件如下:
[root@centos145 consul-template]# cat template.ctmpl stream { log_format main '$remote_addr - [$time_local] ' '$status'; access_log /var/log/nginx/tcp_access.log main; upstream cloudsocket { \{\{range service "ad-rpc-device-server"}}server \{\{.Address}}:\{\{.Port}};{{end}} } server { listen 8888; proxy_pass cloudsocket; } }
- 发动consul-templateconsul-template -config=./config.hcl
运用config.hcl装备文件是为了简化指令 consul-template -consul-addr=172.20.132.196:8500 -template=./template.ctmpl:./nginx.conf
- 初始的nignx.conf文件为空的,在发动后内容为
[root@centos145 consul-template]# cat nginx.conf stream { log_format main '$remote_addr - [$time_local] ' '$status'; access_log /var/log/nginx/tcp_access.log main; upstream cloudsocket { server 172.20.139.77:8183; } server { listen 8888; proxy_pass cloudsocket; } }
保证服务现已成功注册到Consul中,即能够看到服务器地址和端口现已装备进去了。
- 在nginx的装置目录的nginx.conf中引入consul-template生成的装备文件include /etc/nginx/consul-template/nginx.conf;
注意生成的装备文件不能喝nginx本身的装备文件中内容重复!!!
- 发动一个服务实例,检查生成的nginx.conf文件会发现在upstream cloudsocket{}中会动态添加服务列表,而且随着服务的加入和脱离,动态变化。
[root@centos145 consul-template]# cat nginx.conf stream { log_format main '$remote_addr - [$time_local] ' '$status'; access_log /var/log/nginx/tcp_access.log main; upstream cloudsocket { server 172.20.139.77:8183; } server { listen 8888; proxy_pass cloudsocket; } }
再发动一个,服务列表变成两个了
[root@centos145 consul-template]# cat nginx.conf stream { log_format main '$remote_addr - [$time_local] ' '$status'; access_log /var/log/nginx/tcp_access.log main; upstream cloudsocket { server 172.20.139.77:8183;server 172.20.139.77:8184; } server { listen 8888; proxy_pass cloudsocket; } }
- thrift客户端在调用的时候只需求装备Nginx的地址和端口就能够了,不需求装备服务的地址和端口了,Nginx会自动做转发。
总结
今天阿粉给大家介绍了一个新的负载均衡完成计划,这种计划对于一些小规模的集群仍是很不错的,当然假如是大集群,仍是选用阿里云或许腾讯云供给的计划才是最好的。想自己完成的小伙伴环境去测验建立一下,仍是很好玩的。
本公司销售:阿里云、腾讯云、百度云、天翼云、金山大米云、金山企业云盘!可签订合同,开具发票。
我有话说: