15、基于consul+consul-template+registrator+nginx实现自动服务发现
作者:@skyflask
转载本文请注明出处:https://www.cnblogs.com/skyflask/p/11193812.html
目录
一、架构图
二、组件介绍
1、Registrator
2、consul
3、consul-template
4、nginx
三、单机版consul+consul-template+registrator+nginx实现自动服务发现
1、consul部署
2、registrator部署
4、Nginx服务启动
5、结果测试
一、架构图
二、组件介绍
1、Registrator
Registrator:一个由Go语言编写的,针对docker使用的,通过检查本机容器进程在线或者停止运行状态,去注册服务的工具。所以我们要做的实验,所有的工具都是在docker上运行的,就是因为registrator是通过检查docker容器的状态来判断服务状态的,这样就和我们的代码实现完全解耦了,对上层透明化,无感知。它有如下特点
通过docker socket直接监听容器event,根据容器启动/停止等event来注册/注销服务
每个容器的每个exposed端口对应不同的服务
支持可插拔的registry backend,默认支持Consul, etcd and SkyDNS
自身也是docker化的,可以容器方式启动
用户可自定义配置,如服务TTL(time-to-live)、服务名称、服务tag等
2、consul
Consul在这里用来做 docker 实例的注册与配置共享。
特点:
一致性协议采用 Raft 算法,比Paxos算法好用. 使用 GOSSIP 协议管理成员和广播消息, 并且支持 ACL 访问控制.
支持多数据中心以避免单点故障,内外网的服务采用不同的端口进行监听。而其部署则需要考虑网络延迟, 分片等情况等.zookeeper 和 etcd 均不提供多数据中心功能的支持.
健康检查. etcd 没有的.
支持 http 和 dns 协议接口. zookeeper 的集成较为复杂, etcd 只支持 http 协议.
还有一个web管理界面。
3、consul-template
一开始构建服务发现,大多采用的是zookeeper/etcd+confd。但是复杂难用。consul-template,大概取代了confd的位置,以后可以这样etcd+confd或者consul+consul-template。
consul template的使用场景:consul template可以查询consul中的服务目录、key、key-values等。这种强大的抽象功能和查询语言模板可以使consul template特别适合动态的创建配置文件。例如:创建apache/nginx proxy balancers、haproxy backends、varnish servers、application configurations。
consul-template提供了一个便捷的方式从consul中获取存储的值,consul-template守护进程会查询consul服务,来更新系统上指定的任何模板,当更新完成后,模板可以选择运行一些任意的命令,比如我们这里用它来更新nginx.conf这个配置文件,然后执行nginx -s reload命令,以更新路由,达到动态调节负载均衡的目的。
4、nginx
Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。Nginx是由伊戈尔·赛索耶夫为俄罗斯访问量第二的Rambler.ru站点(俄文:Рамблер)开发的,第一个公开版本0.1.0发布于2004年10月4日。
二、数据流
数据流过程如下:
registrator来监控每个web server的状态。当有新的web server启动的时候,registrator会把它注册到consul这个注册中心上。由于consul_template已经订阅了该注册中心consul上的服务消息,此时consul注册中心会将新的web server信息推送给consul_template,consul_template则会去修改nginx.conf的配置文件,然后让nginx重新载入配置以达到自动修改负载均衡的目的。同样当一个web server挂了,registrator也能感知到,进而通知consul做出响应。
三、单机版consul+consul-template+registrator+nginx实现自动服务发现
1、consul部署
consul安装
下载二进制Consul包: https://www.consul.io/downloads.html
# unzip consul_0.9.2_linux_amd64.zip
# mv consul /usr/bin
consul部署
1 | nohup consul agent -server -bootstrap -ui -data-dir=/ var /lib/consul-data -bind=10.11.97.181 -client=0.0.0.0 -node=server01 &>/ var /log/consul.log & |
指定角色为server、agent,启动UI界面,数据目录为/var/lib/consul-data,绑定本机IP地址,节点名称为server01;
启动后查看服务是否正常:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | [root@localhost src]# cat / var /log/consul.log nohup: ignoring input ==> WARNING: Bootstrap mode enabled! Do not enable unless necessary ==> Starting Consul agent... ==> Consul agent running! Version: 'v0.9.2' Node ID: 'f5491cd9-e4da-993e-1b70-e8d3541a0b56' Node name: 'server01' Datacenter: 'dc1' Server: true (bootstrap: true ) Client Addr: 0.0.0.0 (HTTP: 8500, HTTPS: -1, DNS: 8600) Cluster Addr: 10.11.97.181 (LAN: 8301, WAN: 8302) Gossip encrypt: false , RPC-TLS: false , TLS-Incoming: false ==> Log data will now stream in as it occurs: 2019/07/16 11:02:40 [INFO] raft: Restored from snapshot 4-8192-1563031670925 2019/07/16 11:02:40 [INFO] raft: Initial configuration (index=1): [{Suffrage:Voter ID:10.11.97.181:8300 Address:10.11.97.181:8300}] 2019/07/16 11:02:40 [INFO] raft: Node at 10.11.97.181:8300 [Follower] entering Follower state (Leader: "" ) 2019/07/16 11:02:40 [INFO] serf: EventMemberJoin: server01.dc1 10.11.97.181 2019/07/16 11:02:40 [WARN] serf: Failed to re- join any previously known node 2019/07/16 11:02:40 [INFO] serf: EventMemberJoin: server01 10.11.97.181 2019/07/16 11:02:40 [WARN] serf: Failed to re- join any previously known node 2019/07/16 11:02:40 [INFO] consul: Adding LAN server server01 (Addr: tcp/10.11.97.181:8300) (DC: dc1) 2019/07/16 11:02:40 [INFO] consul: Handled member- join event for server "server01.dc1" in area "wan" 2019/07/16 11:02:40 [WARN] Service name "composenginxtomcat_nginx" will not be discoverable via DNS due to invalid characters. Valid characters include all alpha-numerics and dashes. 2019/07/16 11:02:40 [WARN] Service name "composelnmp_nginx" will not be discoverable via DNS due to invalid characters. Valid characters include all alpha-numerics and dashes. 2019/07/16 11:02:40 [INFO] agent: Started DNS server 0.0.0.0:8600 (tcp) 2019/07/16 11:02:40 [INFO] agent: Started DNS server 0.0.0.0:8600 (udp) 2019/07/16 11:02:40 [INFO] agent: Started HTTP server on [::]:8500 2019/07/16 11:02:47 [ERR] agent: failed to sync remote state: No cluster leader 2019/07/16 11:02:48 [WARN] raft: Heartbeat timeout from "" reached, starting election 2019/07/16 11:02:48 [INFO] raft: Node at 10.11.97.181:8300 [Candidate] entering Candidate state in term 5 2019/07/16 11:02:48 [INFO] raft: Election won. Tally: 1 2019/07/16 11:02:48 [INFO] raft: Node at 10.11.97.181:8300 [Leader] entering Leader state 2019/07/16 11:02:48 [INFO] consul: cluster leadership acquired 2019/07/16 11:02:48 [INFO] consul: New leader elected: server01 2019/07/16 11:02:49 [INFO] agent: Synced node info |
1 2 3 4 5 6 7 8 9 10 | 查看集群信息: consul members consul info |grep leader consul catalog services<br> 通过HTTP API获取集群信息: curl 127.0.0.1:8500/v1/status/peers # 集群server成员 curl 127.0.0.1:8500/v1/status/leader # 集群Raft leader curl 127.0.0.1:8500/v1/catalog/services # 注册的所有服务 curl 127.0.0.1:8500/v1/catalog/services/nginx # 服务信息 curl 127.0.0.1:8500/v1/catalog/nodes # 集群节点详细信息 |
3、模拟注册一个服务
1 2 3 4 | curl -X PUT -d \ '{ "id" : "jetty" , "name" : "service_name" , "address" : "10.11.97.181" , "port" : 8080, "tags" : [ "test" ], "checks" : [{ "http" : "http://10.11.97.181:8080/" , "interval" : "5s" }]}' \ http: //10.11.97.181:8500/v1/agent/service/register |
4、UI界面查看
可以看到,这个service是失败的。
清理service:
1 | curl http: //10.11.97.181:8500/v1/agent/service/deregister/jetty -X PUT |
清理无用service。
2、registrator部署
1、安装
1 | docker run -d --name=registrator --net=host -v / var /run/docker.sock:/tmp/docker.sock --restart=always gliderlabs/registrator:latest -ip=10.11.97.181 consul: //10.11.97.181:8500 |
2、查看容器
3、consul-template部署
1 2 3 4 | consul-template \ -consul-addr 10.11.97.181:8500 \ -template "./nginx.ctmpl:/usr/local/nginx/conf/nginx.conf:/usr/local/nginx/sbin/nginx -s reload" \ -log-level=info |
后台启动方式:
1 | nohup consul-template -consul-addr 10.11.97.181:8500 -template "./nginx.ctmpl:/usr/local/nginx/conf/default.conf:/usr/sbin/nginx -s reload" -log-level=info &>/ var /log/consul-template.log & |
日志如下:
1 2 3 4 5 6 7 8 9 | [root@localhost src]# cat / var /log/consul-template.log nohup: ignoring input 2019/07/16 03:27:23.423211 [INFO] consul-template v0.19.3 (ebf2d3d) 2019/07/16 03:27:23.423237 [INFO] (runner) creating new runner (dry: false , once: false ) 2019/07/16 03:27:23.423793 [INFO] (runner) creating watcher 2019/07/16 03:27:23.423910 [INFO] (runner) starting 2019/07/16 03:27:23.423951 [INFO] (runner) initiating run 2019/07/16 03:27:23.426838 [INFO] (runner) initiating run Reloading configuration... |
其中,nginx.ctmpl为nginx模板:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | [root@localhost src]# cat nginx_template/nginx.ctmpl upstream http_backend { {{range service "nginx" }} server {{ .Address }}:{{ .Port }}; {{ end }} } server { listen 8888; server_name localhost; location / { proxy_pass http: //http_backend; } } [root@localhost src]# |
4、Nginx服务启动
启动4个nginx容器作为测试:
并且将nginx的index.html文件进行对应的修改:
查看nginx配置文件
consul-template会根据启动的容器,自动发现nginx服务并加入配置文件中。
5、结果测试
我们直接访问http://10.11.97.181:8888,即可看到效果:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 上周热点回顾(3.3-3.9)
· AI 智能体引爆开源社区「GitHub 热点速览」
2018-07-16 七、Django之Views