怎么用Consul-template+Nginx实现Thrift Consul负载均衡

发布时间 - 2023-05-15 00:00:00    点击率:

整体架构

我们先看下整个框架的架构是什么样子的,这里我们有三个服务提供者和三个服务调用者,它们通过 consulnginx,以及 consul-template 来实现负载均衡。

说明 本例子是进行 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. 我的 Nginx 安装在/etc/nginx目录下

  4. 安装完成使用nginx -t监测一下是否成功。

Consul-template

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

1.下载对应系统版本文件 

2.解压,并复制到PATH路径下

[silence@centos145 ~]$ tar xzvf consul-template_0.19.4_linux_amd64.tgz
[silence@centos145 ~]$ mv ./consul-template /usr/sbin/consul-template

3.找个地方新建个文件夹,并创建三个文件

4.config.hcl主要用来配置consul-template的启动参数项,包括consul服务器的地址,模板文件的位置,生成的配置文件的位置等等。除了consultemplate块,其他参数可选。

5.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"
  }


}

6.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"
  }
}

7.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;
    }
}

8.启动consul-template  consul-template -config=./config.hcl

使用config.hcl配置文件是为了简化命令 consul-template -consul-addr=172.20.132.196:8500 -template=./template.ctmpl:./nginx.conf

9.初始的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中,即可以看到服务器地址和端口已经配置进去了。

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

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

11.启动一个服务实例,查看生成的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;
    }
}

12.thrift客户端在调用的时候只需要配置Nginx的地址和端口就可以了,不需要配置服务的地址和端口了,Nginx会自动做转发。


# nginx  # 架构  # include  # consul  # rpc  # 负载均衡  # 配置文件  # 只需要  # 就可以  # 多个  # 不需要  # 如果没有  # 可以看到  # 可选  # 不作 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 制作电商网页,电商供应链怎么做?  如何续费美橙建站之星域名及服务?  如何在云虚拟主机上快速搭建个人网站?  英语简历制作免费网站推荐,如何将简历翻译成英文?  JavaScript如何实现错误处理_try...catch如何捕获异常?  Edge浏览器怎么启用睡眠标签页_节省电脑内存占用优化技巧  详解Oracle修改字段类型方法总结  Laravel如何实现邮箱地址验证功能_Laravel邮件验证流程与配置  Laravel如何使用withoutEvents方法临时禁用模型事件  Laravel如何升级到最新版本?(升级指南和步骤)  JS弹性运动实现方法分析  使用PHP下载CSS文件中的所有图片【几行代码即可实现】  Laravel如何配置任务调度?(Cron Job示例)  Laravel怎么解决跨域问题_Laravel配置CORS跨域访问  如何制作一个表白网站视频,关于勇敢表白的小标题?  Laravel如何实现全文搜索功能?(Scout和Algolia示例)  高防服务器租用指南:配置选择与快速部署攻略  Laravel定时任务怎么设置_Laravel Crontab调度器配置  制作企业网站建设方案,怎样建设一个公司网站?  关于BootStrap modal 在IOS9中不能弹出的解决方法(IOS 9 bootstrap modal ios 9 noticework)  网站制作价目表怎么做,珍爱网婚介费用多少?  如何实现建站之星域名转发设置?  如何用VPS主机快速搭建个人网站?  Win11搜索栏无法输入_解决Win11开始菜单搜索没反应问题【技巧】  Win11关机界面怎么改_Win11自定义关机画面设置【工具】  Thinkphp 中 distinct 的用法解析  Edge浏览器如何截图和滚动截图_微软Edge网页捕获功能使用教程【技巧】  动图在线制作网站有哪些,滑动动图图集怎么做?  php后缀怎么变mp4格式错误_修改扩展名提示格式不对怎么办【技巧】  Laravel怎么进行数据库事务处理_Laravel DB Facade事务操作确保数据一致性  linux写shell需要注意的问题(必看)  Laravel如何实现事件和监听器?(Event & Listener实战)  车管所网站制作流程,交警当场开简易程序处罚决定书,在交警网站查询不到怎么办?  Laravel的契約(Contracts)是什么_深入理解Laravel Contracts与依赖倒置  昵图网官网入口 昵图网素材平台官方入口  nodejs redis 发布订阅机制封装实现方法及实例代码  Laravel如何构建RESTful API_Laravel标准化API接口开发指南  在线制作视频网站免费,都有哪些好的动漫网站?  香港服务器网站卡顿?如何解决网络延迟与负载问题?  高性能网站服务器部署指南:稳定运行与安全配置优化方案  Laravel怎么创建控制器Controller_Laravel路由绑定与控制器逻辑编写【指南】  Laravel怎么判断请求类型_Laravel Request isMethod用法  深圳网站制作公司好吗,在深圳找工作哪个网站最好啊?  JS中使用new Date(str)创建时间对象不兼容firefox和ie的解决方法(两种)  node.js报错:Cannot find module 'ejs'的解决办法  Linux虚拟化技术教程_KVMQEMU虚拟机安装与调优  魔毅自助建站系统:模板定制与SEO优化一键生成指南  Laravel如何从数据库删除数据_Laravel destroy和delete方法区别  Laravel如何为API编写文档_Laravel API文档生成与维护方法  lovemo网页版地址 lovemo官网手机登录