Docker+Consul+Registrator 实现服务注册与发现
Docker+Consul+Registrator实现服务注册与发现
逻辑图 实现nginx节点自动化加入容器IP代理
1、三台Consul agent server作为高可用通过Consul Template实时监测Leader的变化。
2、Leader如果变化就触发渲染模板动作,执行相应命令。
3、如图 如果Node01 docker创建了一个nginx web容器随机暴露了一个24123端口,Registrator会监听到这个事件之后,会将宿主级IP与暴露的端口注册到本地的Consul agent client。
4、Consul agent Clinet 再将这个请求转发到 Consul agent service中。

环境说明
- Linux系统版本:Linux Centos 7.4 x64
- Consul应用版本:consul_1.4.0
- Template应用版本:consul-template_0.19.3
- Docker应用版本:18.09.0
- Consul管理节点:192.168.1.79
- Docker工作节点:192.168.1.78
- Docker工作节点:192.168.1.77
1、管理节点安装 Consul 服务端
1.1、下载解压安装包Consul
- Consul下载地址:https://pan.baidu.com/s/13fFhJwj6TxXkAB0tOLo8Sg
- 密码:hjub
# 解压出一个二进制包
unzip unzip consul_1.4.0_linux_amd64.zip
# 移动到bin目录下
mv consul /usr/bin
1.2、server模式初始化集群
consul agent \
-server \
-bootstrap \
-ui \
-data-dir=/var/lib/consul-data \
-bind=192.168.1.79 \
-client=0.0.0.0 \
-node=test
# 使用命令
consul agent \
# 设置server模式
-server \
# 自选举为自己Leader
-bootstrap \
# 启用内置web页面
-ui \
# 集群数据保存位置
-data-dir=/var/lib/consul-data \
# 集群之间通讯绑定地址
-bind=192.168.1.79 \
# 客户端访问地址
-client=0.0.0.0 \
# 指定管理节点名称默认主机名,必须是唯一的
-node=test
命令注解
==> Consul agent running!
# 软件版本1.4
Version: 'v1.4.0'
Node ID: '0f09693a-f66e-08f2-6199-0523c27d010d'
# node节点为test
Node name: 'test'
# 数据中心默认名称dc1
Datacenter: 'dc1' (Segment: '<all>')
Server: true (Bootstrap: true)
# client可访问IP地址
Client Addr: [0.0.0.0] (HTTP: 8500, HTTPS: -1, gRPC: -1, DNS: 8600)
# 集群IP地址,设置为管理节点地址
Cluster Addr: 192.168.1.79 (LAN: 8301, WAN: 8302)
Encrypt: Gossip: false, TLS-Outgoing: false, TLS-Incoming: false
输出详解
1.3、查看管理节点Consul启动信息
命令:netstat -antp | grep consul # 集群节点
tcp 0 0 192.168.1.79:8300 0.0.0.0:* LISTEN 68220/consul
# 集群内部访问
tcp 0 0 192.168.1.79:8301 0.0.0.0:* LISTEN 68220/consul
# 夸数据中心访问
tcp 0 0 192.168.1.79:8302 0.0.0.0:* LISTEN 68220/consul
tcp 0 1 192.168.1.79:52742 192.168.1.78:8301 SYN_SENT 68220/consul
tcp 0 0 192.168.1.79:8300 192.168.1.79:55923 ESTABLISHED 68220/consul
tcp 0 0 192.168.1.79:55923 192.168.1.79:8300 ESTABLISHED 68220/consul
tcp 0 0 192.168.1.79:8300 192.168.1.77:44698 ESTABLISHED 68220/consul
# HTTP
tcp6 0 0 :::8500 :::* LISTEN 68220/consul
# DNS
tcp6 0 0 :::8600 :::* LISTEN 68220/consul
查看管理节点启用端口
命令:consul info agent:
check_monitors = 0
check_ttls = 0
checks = 0
services = 0
build:
prerelease =
revision = 0bddfa23
version = 1.4.0
consul:
acl = disabled
bootstrap = true
known_datacenters = 1
leader = true
# leader地址
leader_addr = 192.168.1.79:8300
server = true
# 保持选举一致性算法
raft:
applied_index = 22
commit_index = 22
fsm_pending = 0
last_contact = 0
last_log_index = 22
last_log_term = 2
last_snapshot_index = 0
last_snapshot_term = 0
latest_configuration = [{Suffrage:Voter ID:0f09693a-f66e-08f2-6199-0523c27d010d Address:192.168.1.79:8300}]
latest_configuration_index = 1
num_peers = 0
protocol_version = 3
protocol_version_max = 3
protocol_version_min = 0
snapshot_version_max = 1
snapshot_version_min = 0
state = Leader
term = 2
runtime:
arch = amd64
cpu_count = 2
goroutines = 81
max_procs = 2
os = linux
version = go1.11.1
serf_lan:
coordinate_resets = 0
encrypted = false
event_queue = 1
event_time = 2
failed = 0
health_score = 0
intent_queue = 0
left = 0
member_time = 1
members = 1
query_queue = 0
query_time = 1
serf_wan:
coordinate_resets = 0
encrypted = false
event_queue = 0
event_time = 1
failed = 0
health_score = 0
intent_queue = 0
left = 0
member_time = 1
members = 1
query_queue = 0
query_time = 1
查看consul信息
命令:consul members Node Address Status Type Build Protocol DC Segment
test 192.168.1.79:8301 alive server 1.4.0 2 dc1 <all>
查看集群成员
consul catalog services
查看注册服务
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 # 集群节点详细信息
通过HTTP API获取集群信息
类型 描述
kv 键值存储
agent agent管理
catalog nodes和services管理
health 健康检查
session session管理
acl ACL管理
event 用户事件
status Consul系统状态
Consul API管理
2、工作节点安装Consul 客户端
2.1、下载解压安装包到本地
# 解压出一个二进制包
unzip unzip consul_1.4.0_linux_amd64.zip
# 移动到bin目录下
mv consul /usr/bin
2.2、client模式加入集群
工作节点1
docker run -d \
--name=consul \
-p 8301:8301 \
-p 8301:8301/udp \
-p 8500:8500 \
-p 8600:8600 \
-p 8600:8600/udp \
--restart=always \
progrium/consul \
-join 192.168.1.79 -advertise 192.168.1.77 -client 0.0.0.0 -node=node01
工作节点2
docker run -d \
--name=consul \
-p 8301:8301 \
-p 8301:8301/udp \
-p 8500:8500 \
-p 8600:8600 \
-p 8600:8600/udp \
--restart=always \
progrium/consul \
-join 192.168.1.79 -advertise 192.168.1.78 -client 0.0.0.0 -node=node02
# 运行
docker run -d \
# 指定名称
--name=consul \
# 指定暴露端口
-p 8301:8301 \
-p 8301:8301/udp \
# 提供HTTP服务端口
-p 8500:8500 \
# 提供DNS服务端口
-p 8600:8600 \
-p 8600:8600/udp \
# 设置重启策略
--restart=always \
# 指定镜像
progrium/consul \
# 加入现有集群IP
-join 192.168.1.79
# 通告地址,本机地址
-advertise 192.168.1.77
# 通过那里连接本地
-client 0.0.0.0
# 指定管理节点名称默认主机名,必须是唯一的
-node=node01
命令注解
2.3、查看工作节点consul启动情况
命令:docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7c82880b3685 progrium/consul "/bin/start -join 19…" 3 minutes ago Up 9 seconds 53/tcp, 8300/tcp, 53/udp, 8302/tcp, 0.0.0.0:8301->8301/tcp, 0.0.0.0:8500->8500/tcp, 0.0.0.0:8301->8301/udp, 8400/tcp, 8302/udp, 0.0.0.0:8600->8600/tcp, 0.0.0.0:8600->8600/udp consul
查看启动情况
命令:consul members Node Address Status Type Build Protocol DC Segment
test 192.168.1.79:8301 alive server 1.4.0 2 dc1 <all>
node01 192.168.1.77:8301 alive client 0.5.2 2 dc1 <default>
node02 192.168.1.78:8301 failed client 0.5.2 2 dc1 <default>
管理端测试
注:关闭防火墙拦截。
2.4、管理节点:web页面测试查看
http://192.168.1.79:8500/ui/dc1/services

查看节点

3、管理节点:注册使用
3.1、注册服务
# 案例:
curl -X PUT -d \
'{"id": "jetty","name": "service_name","address": "192.168.1.77","port": 8080,"tags": ["test"],"checks":
[{"http": "http://192.168.1.77:8080/","interval": "5s"}]}' \
http://127.0.0.1:8500/v1/agent/service/register
3.2、查看注册服务

5、工作节点:安装Registrator与template
5.1、Registrator简介
consul-template:一个守护程序,用于实时查询consul集群数据,并更新文件系统上的任意数量的指定模板,生成配置文件,更新完成后可以选择运行任何命令。
gliderlabs/registrator:检查容器运行状态自动注册到服务中心。registrator支持服务注册有consul、etcd、SkyDNS2。
5.2、工作节点1节点2:下载解压部署
- Template下载地址:https://pan.baidu.com/s/1N9U89ClxY-fpTfxiP8l3Tw
- 密码:wso1
# 解压文件
unzip consul-template_0.19.3_linux_amd64.zip
# 移动文件到bin目录下
mv consul-template /usr/bin/
5.3、工作节点1节点2:创建registrator项目
docker run -d \
--name=registrator \
-v /var/run/docker.sock:/tmp/docker.sock \
--restart=always \
gliderlabs/registrator:latest \
consul://192.168.1.77:8500
# docker run -d \
# 指定容器名称
--name=registrator \
# 给容器挂载存储卷,挂载到容器的某个目录
-v /var/run/docker.sock:/tmp/docker.sock \
# 添加重启策略
--restart=always \
# 指定镜像
gliderlabs/registrator:latest \
# 指定docker本地IP,连接注册到consul client。
consul://192.168.1.77:8500 注:它可以将之前创建的容器注册。
命令注解
5.4、浏览器查看注册情况

6、实现Nginx集群节点自动加入
6.1、工作节点1节点2:启动nginx容器
docker run -d -P nginx
6.2、工作节点1节点2:浏览器查看服务

前提:管理节点(推荐)环境安装好nginx服务设置代理
6.3、管理节点:创建nginx代理模板
vi nginx.ctmpl
upstream http_backend {
ip_hash;
# nginx 为服务名称
{{range service "nginx"}}
# 服务名 服务IP:端口号
server {{ .Address }}:{{ .Port }};
# 结束
{{ end }}
}
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://http_backend;
}
}
6.4、管理节点:配置template自动部署
consul-template \
-consul-addr 192.168.1.79:8500 \
-template "./nginx.ctmpl:/etc/nginx/conf.d/default2.conf:/usr/sbin/nginx -s reload" \
-log-level=info
# 使用template命令
consul-template \
# 指定consul server地址
-consul-addr 192.168.1.79:8500 \
# 指定 新配置文件:生成配置文件:重载配置文件
-template "./nginx.ctmpl:/etc/nginx/conf.d/default2.conf:/usr/sbin/nginx -s reload" \
# 指定日志级别
-log-level=info
命令详解
6.5、管理节点:测试查看生成结果
命令: cat default2.conf
upstream http_backend {
ip_hash;
server 192.168.1.77:32768;
server 192.168.1.77:32769;
server 192.168.1.78:32788;
}
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://http_backend;
}
}
6.6、测试添加了多台Nginx容器后输出,验证自动发现

查看Nginx配置文件
cat default2.conf
upstream http_backend {
ip_hash; server 192.168.1.77:32772; server 192.168.1.77:32768; server 192.168.1.77:32771; server 192.168.1.77:32773; server 192.168.1.77:32770; server 192.168.1.77:32769; server 192.168.1.78:32789; server 192.168.1.78:32791; server 192.168.1.78:32788; server 192.168.1.78:32790; } server {
listen 80;
server_name localhost;
location / {
proxy_pass http://http_backend;
}
}
注:删除添加docker容器都执行动作。
Docker+Consul+Registrator 实现服务注册与发现的更多相关文章
- Docker consul的容器服务更新与发现(超详细配图)
Docker consul的容器服务更新与发现 1.概述 2.部署 1.概述: (1)什么是服务注册与发现: 服务注册与发现是微服务架构中不可或缺的重要组件.起初服务都是单节点的,不保障高可用性,也不 ...
- Docker consul的容器服务更新与发现
Docker consul的容器服务更新与发现 目录 Docker consul的容器服务更新与发现 一.Consul简介 1. 服务注册与发现 2. consul概述 3. consul的两种模式 ...
- .Net Core 商城微服务项目系列(二):使用Ocelot + Consul构建具备服务注册和发现功能的网关
1.服务注册 在上一篇的鉴权和登录服务中分别通过NuGet引用Consul这个包,同时新增AppBuilderExtensions类: public static class AppBuilderEx ...
- Consul之:服务注册与发现
一.服务的管理(注册与发现)有三种方式: 1:通过配置文件的方式静态注册2:通过HTTP API接口来动态注册(spring cloud使用方式,spring cloud中使用的是consul api ...
- 使用consul实现分布式服务注册和发现--redis篇
安装consul client consul 客户端检脚本 ====================================================================== ...
- Spring Cloud 之 Consul 知识点:服务注册与发现(类似工具:Eureka、ZooKeeper、Etcd)
资料 网址 springcloud(十三):注册中心 Consul 使用详解 http://ityouknow.com/springcloud/2018/07/20/spring-cloud-cons ...
- 分布式服务注册和发现consul 简要介绍
Consul是HashiCorp公司推出的开源工具,用于实现分布式系统的服务发现与配置.与其他分布式服务注册与发现的方案,Consul的方案更"一站式",内置了服务注册与发现框 架 ...
- 基于 Consul 实现 MagicOnion(GRpc) 服务注册与发现
0.简介 0.1 什么是 Consul Consul是HashiCorp公司推出的开源工具,用于实现分布式系统的服务发现与配置. 这里所谓的服务,不仅仅包括常用的 Api 这些服务,也包括软件开发过程 ...
- Spring Cloud Consul 实现服务注册和发现
Spring Cloud 是一个基于 Spring Boot 实现的云应用开发工具,它为基于 JVM 的云应用开发中涉及的配置管理.服务发现.断路器.智能路由.微代理.控制总线.全局锁.决策竞选.分布 ...
随机推荐
- Javascript 运行上下文和作用域链
一.作用域Scope和上下文Context 在javascript中,作用域scope和上下文context是两个不同的概念.每个函数调用都会伴随着scope和context,从本质上来说,scope ...
- Linux下的搜索查找命令的详解(which)
我们经常在linux要查找某个文件,但不知道放在哪里了,可以使用下面的一些命令来搜索: which 查看可执行文件的位置. whereis 查看文件的位置. locate 配合数据库查看文件 ...
- 使用cmd导入导出oracle数据库dmp文件
exp scott/test@192.168.0.195/orcl file=C:\Users\zz\Desktop\1\gd_base.dmp log=C:\Users\zz\Desktop\1\g ...
- postgresql免密码登录
https://www.postgresql.org/docs/8.3/static/libpq-pgpass.html vi ~/.pgpass 输入以下内容 hostname:port:datab ...
- 11.17 luffycity(7)完结
2018-11-17 15:59:01 路飞项目已经完结!后面已是flask的学习!然后还有十几天的课程等回学校再看 明天归校!! 开始全面整理自己学习的知识,整理博客!还有好多面试题!233333 ...
- mybatis13--2级缓存
验证内置的2级缓存 Ehcache缓存的配置 01.引入需要的ehcache 和mybatis-ehcache 两个jar包 02.在mapper文件中增加 <cache type=" ...
- ruby 基础知识2 - 区块 block
原文 1. block中的 yield 与遍历 5.times do |i| puts i end 或者 def my_times(n) i = 0 while n > i i += 1 yie ...
- css的小知识3
1.补充 margin的margin:0 auto:会解决元素的居中,前提是给这个元素设置width 2.css的层叠问题 css有两个性质 1.继承性 2.层叠性 选择器的一种选择能力,谁的权重大 ...
- bug修复记录
telnet 网址 ping netaddr traceroute netaddr ,这是一个linux下的命令可以通过Vmmap观察程序运行时所需要的依赖库协议里面涉及到数组的, 一定要判断最大值 ...
- 树莓派3 之 pi3Robot 控制系统配置
需求 个人正在用Python写一个控制系统,技术选型是python3 + Flask + Mysql + Bootstrap.需要将这套系统直接部署到树莓派中. 代码地址:https://github ...