Consul-template, Nginx 实现Thrift Consul负载均衡

作者阿里云代理 文章分类 分类:linux图文教程 阅读次数 已被围观 707

全体架构

咱们先看下整个结构的架构是什么样子的,这儿咱们有三个服务供给者和三个服务调用者,它们经过 Consul 和 Nginx,以及 Consul-template 来完成负载均衡。

18.jpg说明 本例子是进行 RPC 的负载均衡,RPC 是 tcp协议,所以 Nginx 要装备 tcp 模块,支撑 tcp 负载均衡。

  1. Consul 集群 用于服务注册,注册多个服务实例,对外供给 RPC 服务。
  2. Consul-template 用于实时监测 Consul 中服务的状况,配合本身一个模板文件,生成 Nginx 的装备文件。
  3. Nginx 运用本身的装备文件和第二步生成的装备文件,进行负载均衡。

Nginx装置

  1. 装置最新版 Nginx,保证 Nginx 版别在1.9.0以上
  2. 1.9.0 版别以上才支撑 TCP 转发,据说不是默许装置了该模块,装置完成能够查询一下,假如有--with-stream参数,表示现已支撑TCP。假如没有就从头编译添加参数装置。
  3. 19.jpg


  1. 我的 Nginx 装置在/etc/nginx目录下
  2. 装置完成运用nginx -t监测一下是否成功。

Consul-template

本文旨在负载均衡,Consul 集群建立不作介绍。

  1. 下载对应系统版别文件 https://releases.hashicorp.com/consul-template/
  2. 解压,并复制到PATH路径下
[silence@centos145 ~]$ tar xzvf consul-template_0.19.4_linux_amd64.tgz [silence@centos145 ~]$ mv ./consul-template /usr/sbin/consul-template
  1. 找个地方新建个文件夹,并创立三个文件

20.jpg

  1. config.hcl 首要用来装备consul-template的发动参数项,包含consul服务器的地址,模板文件的方位,生成的装备文件的方位等等。除了consul和template块,其他参数可选。参阅https://github.com/hashicorp/consul-template
  2. 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"  } }
  1. 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"  } }
  1. 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;  } }
  1. 发动consul-templateconsul-template -config=./config.hcl

运用config.hcl装备文件是为了简化指令 consul-template -consul-addr=172.20.132.196:8500 -template=./template.ctmpl:./nginx.conf

  1. 初始的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中,即能够看到服务器地址和端口现已装备进去了。

  1. 在nginx的装置目录的nginx.conf中引入consul-template生成的装备文件include /etc/nginx/consul-template/nginx.conf;

注意生成的装备文件不能喝nginx本身的装备文件中内容重复!!!

  1. 发动一个服务实例,检查生成的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;  } }
  1. thrift客户端在调用的时候只需求装备Nginx的地址和端口就能够了,不需求装备服务的地址和端口了,Nginx会自动做转发。

总结

今天阿粉给大家介绍了一个新的负载均衡完成计划,这种计划对于一些小规模的集群仍是很不错的,当然假如是大集群,仍是选用阿里云或许腾讯云供给的计划才是最好的。想自己完成的小伙伴环境去测验建立一下,仍是很好玩的。

本公司销售:阿里云、腾讯云、百度云、天翼云、金山大米云、金山企业云盘!可签订合同,开具发票。

我有话说: