15、基于consul+consul-template+registrator+nginx实现自动服务发现
一、架构图
二、组件介绍
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部署
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;
启动后查看服务是否正常:
[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
查看集群信息:
consul members
consul info |grep leader
consul catalog services
通过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、模拟注册一个服务
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:
curl http://10.11.97.181:8500/v1/agent/service/deregister/jetty -X PUT
清理无用service。
2、registrator部署
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部署
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
后台启动方式:
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 &
日志如下:
[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模板:
[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,即可看到效果:
15、基于consul+consul-template+registrator+nginx实现自动服务发现的更多相关文章
- Prometheus 通过 consul 分布式集群实现自动服务发现
转载自:https://cloud.tencent.com/developer/article/1611091 1.Consul 介绍 Consul 是基于 GO 语言开发的开源工具,主要面向分布式, ...
- Prometheus Consul实现自动服务发现
Prometheus Consul实现自动服务发现 1.概述 Consul 是一个支持多数据中心分布式高可用的服务发现和配置共享的服务软件. Consul 由 HashiCorp公司用Go语言开发 ...
- Prometheus 通过 consul 实现自动服务发现
1.Consul 介绍 Consul 是基于 GO 语言开发的开源工具,主要面向分布式,服务化的系统提供服务注册.服务发现和配置管理的功能.Consul 提供服务注册/发现.健康检查.Key/Valu ...
- Consul + fabio 实现自动服务发现、负载均衡 - DockOne.io
Consul + fabio 实现自动服务发现.负载均衡 - DockOne.io http://dockone.io/article/1567
- 在Windows环境中使用Nginx, Consul, Consul Template搭建负载均衡和服务发现服务
搭建负载均衡和服务发现服务的目的 随着网站业务的不断提升,单个服务器的性能越来越难满足客户的业务需求,所以很多情况下,需要使用多服务器实例和负载均衡器来满足业务需要. Nginx 什么是Nginx N ...
- 基于docker,consul,consul-template, registrator, nginx服务注册发现集群
介绍 该工程主要实现服务的自动注册发现,从而达到提高运维效率,做到服务的自动发现和动态扩展. 服务注册发现 服务启动后自动被发现 动态变更负载均衡 自动伸缩 工具 1.Registrator 这是 ...
- 基于Docker + Consul + Nginx + Consul-Template的服务负载均衡实现(转)
转:https://www.jianshu.com/p/fa41434d444a 前言 上一篇文章使用 Consul 和 Registrator 在 docker 的容器环境中搭建了服务注册和发现集群 ...
- Ocelot + Consul + Registrator 基于Docker 实现服务发现、服务自动注册
目录 1. Consul集群搭建 1.1 F&Q Consul官方推荐的host网络模式运行 2. Registrator服务注册工具 2.1 F&Q Registrator悬挂服务 ...
- 服务发现:Zookeeper vs etcd vs Consul
[编者的话]本文对比了Zookeeper.etcd和Consul三种服务发现工具,探讨了最佳的服务发现解决方案,仅供参考. 如果使用预定义的端口,服务越多,发生冲突的可能性越大,毕竟,不可能有两个服务 ...
随机推荐
- Windows双系统
基础概念 基础概念 Legacy:传统BIOS传输模式启动顺序:开机→BIOS初始化→BIOS自检→引导操作系统→进入系统.传统硬盘引导记录为MBR格式,MBR无法支持超过2T的硬盘.但拥有最好的兼容 ...
- Net实现阿里云开放云存储服务(OSS)
1 第一步框架搭建新建一个全新的MVC项目 (项目参考文档https://docs.aliyun.com/?spm=5176.383663.9.6.5OJI07#/pub/oss/sdk/sdk-do ...
- 设计模式-依赖倒置-Dependency Inversion Principle
依赖倒置原则: 一般来说我们认为作为底层基础框架的逻辑是不应该依赖于上层逻辑的, 所以我们设计软件时也经常是: 需求 - 上层逻辑(直接实现需求) - 发现需要固化的逻辑 - 开发底层模块 - 然后上 ...
- 【开发工具】- myeclipse安装主题
你想用IDEA那样炫酷的符合90后气质的主题吗?废话不多说,按照下边步骤就可以安装像IDEA一样超级炫酷的主题. 下载主题 1.进入插件官网(http://eclipsecolorthemes.org ...
- LCD 驱动 S3C2440A
LCD Control 1 Register 以16BPP为例 LCD Control 2 Register LCD Control 3 Register LCD Control 4 Register ...
- HttpClient使用详解与实战一:普通的GET和POST请求
简介 HttpClient是Apache Jakarta Common下的子项目,用来提供高效的.最新的.功能丰富的支持HTTP协议的客户端编程工具包,并且它支持HTTP协议最新的版本和建议. Htt ...
- angular 升级到angular8 以及报错信息解决
1.升级全局angular-cli npm install -g @angular/cli@latest 2.升级项目内 angular-cli (在需要升级的项目中运行) npm i @angula ...
- 【Docker】docker安装redis
一.下载镜像并运行容器 1.指定redis.conf配置文件方式运行 docker run -p 6379:6379 --name myredis -v $PWD/conf/redis.conf:/e ...
- while 格式化输出 运算符 字符编码
流程控制之while循环 条件循环:while,语法如下 while 条件: # 循环体 # 如果条件为真,那么循环体则执行,执行完毕后再次循环,重新判断条件... # 如果条件为假,那么循环体不执行 ...
- 21.centos7基础学习与积累-007-远程连接
从头开始积累centos7系统运用 大牛博客:https://blog.51cto.com/yangrong/p5 IP地址: 互联网上的计算机 都会有一个唯一的32位的地址,ip地址,我们访问服务器 ...