一文带你学会consul 基本使用和Docker部署

本文涉及的产品
注册配置 MSE Nacos/ZooKeeper,118元/月
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
云原生网关 MSE Higress,422元/月
简介: 部署方面,zookeeper一般部署奇数个节点方便做简单多数的选举机制。consul部署的时候分server节点和client节点(通过不同的启动参数区分),server节点做leader选举和数据一致性维护,client节点部署在服务机器上,作为服务程序访问consul的接口。

自己就一台机子,所以这里就演示下docker下部署使用consul。容器与宿主机的端口映射忽略,正常生产环境每个宿主机一个consul,端口需要映射到宿主机

zookeeper和consul比较

网络异常,图片无法展示
|


  • 开发语言方面,zookeeper采用java开发,安装的时候需要部署java环境;consul采用golang开发,所有依赖都编译到了可执行程序中,即插即用。


  • 部署方面,zookeeper一般部署奇数个节点方便做简单多数的选举机制。consul部署的时候分server节点和client节点(通过不同的启动参数区分),server节点做leader选举和数据一致性维护,client节点部署在服务机器上,作为服务程序访问consul的接口。


  • 一致性协议方面,zookeeper使用自定义的zab协议,consul的一致性协议采用更流行的Raft。


  • zookeeper不支持多数据中心,consul可以跨机房支持多数据中心部署,有效避免了单数据中心故障不能访问的情况。


  • 链接方式上,zookeeper client api和服务器保持长连接,需要服务程序自行管理和维护链接有效性,服务程序注册回调函数处理zookeeper事件,并自己维护在zookeeper上建立的目录结构有效性(如临时节点维护);consul 采用DNS或者http获取服务信息,没有主动通知,需要自己轮训获取。


  • 工具方面,zookeeper自带一个cli_mt工具,可以通过命令行登录zookeeper服务器,手动管理目录结构。consul自带一个Web UI管理系统, 可以通过参数启动并在浏览器中直接查看信息。


部署:

拉取镜像

docker search consul

咱们用官方的镜像玩玩

docker pull consul

不指定tag就拉取last,当前版本是1.5.2


启动consul

启动节点1(server模式)

-node:节点的名称

-bind:绑定的一个地址,用于节点之间通信的地址,可以是内外网,必须是可以访问到的地址

-server:这个就是表示这个节点是个SERVER

-bootstrap-expect:这个就是表示期望提供的SERVER节点数目,数目一达到,它就会被激活,然后就是LEADER了

docker run -d-e'CONSUL_LOCAL_CONFIG={"skip_leave_on_interrupt": true}'--name=node1 consul agent -server-bind=172.17.0.2  -bootstrap-expect=3-node=node1

启动节点2-3(server模式)

docker run -d-e'CONSUL_LOCAL_CONFIG={"skip_leave_on_interrupt": true}'--name=node2 consul agent -server-bind=172.17.0.3  -join=172.17.0.2 -node-id=$(uuidgen | awk '{print tolower($0)}')-node=node2
docker run -d-e'CONSUL_LOCAL_CONFIG={"skip_leave_on_interrupt": true}'--name=node3 consul agent -server-bind=172.17.0.4  -join=172.17.0.2 -node-id=$(uuidgen | awk '{print tolower($0)}')-node=node3 -client=172.17.0.4


-join:这个表示启动的时候,要加入到哪个集群内,这里就是说要加入到节点1的集群 -node-id:这个貌似版本8才加入的,这里用这个来指定唯一的节点ID,可以查看这个issue -client:这个表示注册或者查询等一系列客户端对它操作的IP,如果不指定这个IP,默认是127.0.0.1。


启动节点4(client模式)

docker run -d -e 'CONSUL_LOCAL_CONFIG={"leave_on_terminate": true}' --name=node4 consul agent -bind=172.17.0.5 -retry-join=172.17.0.2 -node-id=$(uuidgen | awk '{print tolower($0)}')  -node=node4

除了没有-server,其它都是一样的,没有这个就说明这个节点是CLIENT

查看下集群的状态

docker exec -t node1 consul members

网络异常,图片无法展示
|

4个节点都列出来了。Status表示它们的状态,都是alive。Type表示它们的类型,三个SERVER一个CLIENT,和我们之前启动的一样。DC表示数据中心,都是dc1。

节点异常consul的处理

LEADER 挂了

leader挂了,consul会重新选取出新的leader,只要超过一半的SERVER还活着,集群是可以正常工作的。node1是leader,所以把这个容器停了。


docker stop node1


看看其他节

日志(node2):

网络异常,图片无法展示
|

日志打印,心跳检查node1的ip超时,接着开始选举。node2被选举为新的leader。我们查看下现在的leader:

curl http://172.17.0.4:8500/v1/status/leader

返回的内容:

"172.17.0.3:8300"

172.17.0.3 就是 node2节点的IP

使用

部署完了,那么可以看看怎么用这个东东了。

注册个服务

使用HTTP API 注册个服务,使用[接口API](https://www.consul.io/api/agent/service.html API)调用

调用 http://consul:8500/v1/agent/service/register PUT 注册一个服务。request body:


{
"ID": "userServiceId", //服务id"Name": "userService", //服务名"Tags": [              //服务的tag,自定义,可以根据这个tag来区分同一个服务名的服务"primary",
"v1"  ],
"Address": "127.0.0.1",//服务注册到consul的IP,服务发现,发现的就是这个IP"Port": 8000,          //服务注册consul的PORT,发现的就是这个PORT"EnableTagOverride": false,
"Check": {             //健康检查部分"DeregisterCriticalServiceAfter": "90m",
"HTTP": "http://www.baidu.com", //指定健康检查的URL,调用后只要返回20X,consul都认为是健康的"Interval": "10s"//健康检查间隔时间,每隔10s,调用一次上面的URL  }
}


使用curl调用:

curlhttp://172.17.0.4:8500/v1/agent/service/register -X PUT -i -H "Content-Type:application/json" -d '{"ID": "userServiceId",  
"Name": "userService",
"Tags": [
"primary",
"v1"  ],
"Address": "127.0.0.1",
"Port": 8000,
"EnableTagOverride": false,
"Check": {
"DeregisterCriticalServiceAfter": "90m",
"HTTP": "http://www.baidu.com",
"Interval": "10s"  }
}'

OK,这里成功注册了一个服务

发现个服务


刚刚注册了名为userService的服务,我们现在发现(查询)下这个服务

curl http://172.17.0.4:8500/v1/catalog/service/userService


返回的响应:

[
    {
"Address": "172.17.0.4",
"CreateIndex": 880,
"ID": "e6e9a8cb-c47e-4be9-b13e-a24a1582e825",
"ModifyIndex": 880,
"Node": "node3",
"NodeMeta": {},
"ServiceAddress": "127.0.0.1",
"ServiceEnableTagOverride": false,
"ServiceID": "userServiceId",
"ServiceName": "userService",
"ServicePort": 8000,
"ServiceTags": [
"primary",
"v1"        ],
"TaggedAddresses": {
"lan": "172.17.0.4",
"wan": "172.17.0.4"        }
    }
]


内容有了吧,这个就是我们刚刚注册的服务的信息,就可以获取到

服务的名称是“userService”  

服务地址是“127.0.0.1”

服务的端口是“8000”

存储个K/V

设置一个值到user/config/connections 内容为5

docker exec -t node1 consul kv put user/config/connections 5

获取特定的值

docker exec -t node1 consul kv get-detailed user/config/connections

网络异常,图片无法展示
|

值的内容为5,还有key等相关的值


总结


服务发现以及配置共享的简单样例展示了下,详细的使用还是需要看官方文档,这里只是列举了一些样例,用于理解和简单的使用consul。


Spring Cloud 结合consul使用


如果是使用spring cloud来使用consul,可以查看我的相关样

例:http://git.oschina.net/buxiaoxia/spring-demo

spring cloud 结合consul的使用,下一篇文章再进行描述吧


相关文档连接


CONSUL:https://www.consul.io/

CONSUL HTTP API:https://www.consul.io/api/index.html

CONSUL CLI:https://www.consul.io/docs/commands/info.html

CONSUL Health Checks:https://www.consul.io/docs/agent/checks.html

相关实践学习
基于MSE实现微服务的全链路灰度
通过本场景的实验操作,您将了解并实现在线业务的微服务全链路灰度能力。
目录
相关文章
|
23天前
|
监控 文件存储 Docker
实现NAS远程下载,Docker部署qBittorrent、Transmission、贝锐花生壳
与电脑不同,NAS通常7x24小时运行,便于下载资源,解决BT/PT下载需长时间在线的问题。因此,qBittorrent、Transmission等下载管理工具成为NAS用户的必备应用。通过Docker,用户可在多种NAS设备上快速安装这些工具,并通过局域网IP地址+端口访问。然而,缺乏公网IPv4地址导致远程访问困难,贝锐花生壳提供了解决方案,允许无公网IP情况下通过固定域名远程访问NAS中的下载工具,简化了部署过程,使用户能随时随地控制家中的下载任务。
164 33
实现NAS远程下载,Docker部署qBittorrent、Transmission、贝锐花生壳
|
2天前
|
人工智能 数据安全/隐私保护 虚拟化
Docker部署MaxKB详细步骤(window系统)
这篇文章详细介绍了如何在Windows系统上使用Docker部署MaxKB,并提供了从安装Docker到运行MaxKB容器的详细步骤,以及如何通过浏览器访问和配置MaxKB来使用ollama和llama3模型进行问答。
16 1
Docker部署MaxKB详细步骤(window系统)
|
16天前
|
应用服务中间件 Docker 容器
docker应用部署---Tomcat的部署配置
这篇文章介绍了如何使用Docker部署Tomcat服务器,包括搜索和拉取Tomcat镜像、创建容器并设置端口映射和目录映射,以及如何创建一个HTML页面并使用外部机器访问Tomcat服务器。
docker应用部署---Tomcat的部署配置
|
16天前
|
关系型数据库 MySQL 数据安全/隐私保护
docker应用部署---MySQL的部署配置
这篇文章介绍了如何使用Docker部署MySQL数据库,包括搜索和拉取MySQL镜像、创建容器并设置端口映射和目录映射、进入容器操作MySQL,以及如何使用外部机器连接容器中的MySQL。
docker应用部署---MySQL的部署配置
|
2天前
|
弹性计算 Ubuntu Linux
快速部署 Docker 社区版
Docker Community Edition (CE) 是Docker项目的免费版本,面向广大开发者、爱好者以及希望利用容器技术的个人和组织。它是Docker企业版(Docker Enterprise Edition, EE)的社区驱动对应版,提供了强大的容器化应用构建、部署和运行能力。本文解释如何通过计算巢快速部署Docker社区版。
|
3天前
|
关系型数据库 MySQL 数据库
使用Docker部署的MySQL数据库,数据表里的中文读取之后变成问号,如何处理?
【10月更文挑战第1天】使用Docker部署的MySQL数据库,数据表里的中文读取之后变成问号,如何处理?
18 3
|
2天前
|
定位技术 文件存储 网络架构
Docker部署PhotoPrism、Immich图片管理应用,无需公网IP远程访问教程
除了Synology、QNAP、TerraMaster等品牌的NAS设备内置图库功能,市面上还有多种备受欢迎的第三方应用,如PhotoPrism、Immich、LibrePhotos、Piwigo、Photoview等。这些应用不仅提供强大的图片管理能力,还可通过Docker轻松部署。借助贝锐花生壳服务,即使没有公网IP也能实现远程访问,突破地理限制,提升数据可访问性和安全性,让用户随时随地管理私人图库。
16 1
|
3天前
|
关系型数据库 MySQL 数据库
使用Docker部署的MySQL数据库如何设置忽略表名大小写?
【10月更文挑战第1天】使用Docker部署的MySQL数据库如何设置忽略表名大小写?
24 1
|
3天前
|
运维 测试技术 Linux
【Docker项目实战】使用Docker部署lemonitor镜像站点列表程序
【10月更文挑战第1天】使用Docker部署lemonitor镜像站点列表程序
14 0
【Docker项目实战】使用Docker部署lemonitor镜像站点列表程序
|
6天前
|
存储 Linux 开发者
虚拟机centos7.9一键部署docker
本文介绍了如何在 CentOS 7.9 虚拟机上安装 Docker 社区版 (Docker-ce-20.10.20)。通过使用阿里云镜像源,利用 `wget` 下载并配置 Docker-ce 的 YUM 仓库文件,然后通过 `yum` 命令完成安装。安装后,通过 `systemctl` 设置 Docker 开机自启并启动 Docker 服务。最后,使用 `docker version` 验证安装成功,并展示了客户端与服务器的版本信息。文中还提供了列出所有可用 Docker-ce 版本的命令。
虚拟机centos7.9一键部署docker