基于Docker + Consul + Registrator的服务注册与发现集群搭建

Docker consul容器服务自动发现和更新 服务注册与发现是微服务架构中不可或缺的重要组件。起初服务都是单节点的,不保障高可用性,也不考虑服务的压力承载,服务之间调用单纯的通过接口访问。直到后来出现了多个节点的分布式架构,起初的解决手段是在服务前端负载均衡,这样前端必须要知道所有后端服务的网络位置,并配置在配置文件中。这里就会有几个问题如果需要调用后端服务A-N,就需要配置N个服务的网络位置,配置很麻烦。后端服务的网络位置变化,都需要改变每个调用者的配置。既然有这些问题,那么服务注册与发现就是解决这些问题的。 阅读详情

前言

近年微服务架构在互联网应用领域中愈来愈火,引入微服务主要解决了单体应用多个模块的紧耦合、无法扩展和运维困难等问题。微服务架构就是按照功能粒度将业务模块进行垂直拆分,对单体应用本身进行服务化和组件化,每个组件单独部署为小应用(从DB到UI)。微服务与微服务之间通过Service API进行交互,同时为了支持水平扩展、性能提升和服务可用性,单个服务允许同时部署一个或者多个服务实例。在运行时,每个实例通常是一个云虚拟机或者Docker容器。

微服务系统内部多个服务的实例之间如何通信?如何感知到彼此的存在和销毁?生产者服务如何知道消费者服务的地址?如何实现服务与注册中心的解耦?这就需要一个第三方的服务注册中心,提供对生产者服务节点的注册管理和消费者服务节点的发现管理。


正文

1. 服务发现与注册

1.1. 具体流程

  • 服务注册中心:作为整个架构中的核心,要支持分布式、持久化存储,注册信息变动实时通知消费者。
  • 服务提供者:服务以 docker 容器化方式部署(实现服务端口的动态生成),可以通过 docker-compose 的方式来管理。通过 Registrator 检测到 docker 进程信息以完成服务的自动注册。
  • 服务消费者:要使用服务提供者提供的服务,和服务提供者往往是动态相互转位置的。

一个较为完整的服务注册与发现流程如下:

  1. 注册服务:服务提供者到注册中心注册;
  2. 订阅服务:服务消费者到注册中心订阅服务信息,对其进行监听;
  3. 缓存服务列表:本地缓存服务列表,减少与注册中心的网络通信;
  4. 调用服务:先查找本地缓存,找不到再去注册中心拉取服务地址,然后发送服务请求;
  5. 变更通知:服务节点变动时 (新增、删除等),注册中心将通知监听节点,更新服务信息。

1.2. 相关组件

一个服务发现系统主要由三部分组成:

  1. 注册器(registrator):根据服务运行状态,注册/注销服务。主要要解决的问题是,何时发起注册/注销动作。
  2. 注册表(registry):存储服务信息。常见的解决方案有zookeeper、etcd、cousul等。
  3. 发现机制(discovery):从注册表读取服务信息,给用户封装访问接口。

1.3. 第三方实现

对于第三方的服务注册与发现的实现,现有的工具主要有以下三种:

  1. zookeeper:一个高性能、分布式应用程序协调服务,用于名称服务、分布式锁定、共享资源同步和分布式配置管理。
  2. Etcd:一个采用HTTP协议的健/值对存储系统,主要用于共享配置和服务发现,提供的功能相对Zookeeper和Consul相对简单。
  3. Consul:一个分布式高可用的服务发现和配置共享的软件,支持服务发现与注册、多数据中心、健康检查和分布式键/值存储。

简单对比:

与Zookeeper和etcd不一样,Consul内嵌实现了服务发现系统,不需要构建自己的系统或使用第三方系统,客户只需要注册服务,并通过DNS或HTTP接口执行服务发现。

2. Consul和Registrator

2.1. Consul简介

Consul是什么

Consul 是一种分布式的、高可用、支持水平扩展的的服务注册与发现工具。它大致包括以下特性:

  • 服务发现: Consul 通过 DNS 或者 HTTP 接口使服务注册和服务发现变的很容易。一些外部服务,例如 saas 提供的也可以一样注册;
  • 健康检查:健康检测使 consul 可以快速的告警在集群中的操作。和服务发现的集成,可以防止服务转发到故障的服务上面;
  • 键/值存储:一个用来存储动态配置的系统。提供简单的 HTTP 接口,可以在任何地方操作;
  • 多数据中心:支持多数据中心以避免单点故障,内外网的服务采用不同的端口进行监听。而其部署则需要考虑网络延迟, 分片等情况等。zookeeper和etcd均不提供多数据中心功能的支持;
  • 一致性算法:采用 Raft 一致性协议算法,比Paxos算法好用。 使用 GOSSIP 协议管理成员和广播消息, 并且支持 ACL 访问控制;
  • 服务管理Dashboard:提供一个 Web UI 的服务注册于健康状态监控的管理页面。

Consul的几个概念

下图是Consul官方文档提供的架构设计图:

图中包含两个Consul数据中心,每个数据中心都是一个consul的集群。在数据中心1中,可以看出consul的集群是由N个SERVER,加上M个CLIENT组成的。而不管是SERVER还是CLIENT,都是consul集群的一个节点。所有的服务都可以注册到这些节点上,正是通过这些节点实现服务注册信息的共享。除了这两个,还有一些小细节 一一 简单介绍。

  • CLIENT

CLIENT表示consul的client模式,就是客户端模式。是consul节点的一种模式,这种模式下,所有注册到当前节点的服务会被转发到SERVER节点,本身是不持久化这些信息。

  • SERVER

SERVER表示consul的server模式,表明这个consul是个server节点。这种模式下,功能和CLIENT都一样,唯一不同的是,它会把所有的信息持久化的本地。这样遇到故障,信息是可以被保留的。

  • SERVER-LEADER

中间那个SERVER下面有LEADER的描述,表明这个SERVER节点是它们的老大。和其它SERVER不一样的一点是,它需要负责同步注册信息给其它的SERVER,同时也要负责各个节点的健康监测。

  • 其它信息

其它信息包括各个节点之间的通信方式,还有一些协议信息、算法。它们是用于保证节点之间的数据同步、实时性要求等等一系列集群问题的解决。这些有兴趣的自己看看官方文档。

2.2. Registrator简介

什么是Registrator

Registrator是一个独立于服务注册表的自动服务注册/注销组件,一般以Docker container的方式进行部署。Registrator会自动侦测它所在的宿主机上的所有Docker容器状态(启用/销毁),并根据容器状态到对应的服务注册列表注册/注销服务。

事实上,Registrator通过读取同一台宿主机的其他容器Container的环境变量进行服务注册、健康检查定义等操作。

Registrator支持可插拔式的服务注册表配置,目前支持包括Consul, etcd和SkyDNS 2三种注册工具。

2.3. Docker安装Consul集群

2.3.1. 集群节点规划

我本地的使用的是Ubuntu16.04的虚拟机:

Consul的配置参数信息说明:

2.4. Docker安装Consul集群

2.4.1. 拉取consul官方镜像

madison@ubuntu:~$ docker pull consul:latest

2.4.2. 启动Server节点

运行consul镜像,启动Server Master节点node1:

node1:

madison@ubuntu:~$ docker run -d --name=node1 --restart=always \

-e 'CONSUL_LOCAL_CONFIG={"skip_leave_on_interrupt": true}' \

-p 8300:8300 \

-p 8301:8301 \

-p 8301:8301/udp \

-p 8302:8302/udp \

-p 8302:8302 \

-p 8400:8400 \

-p 8500:8500 \

-p 8600:8600 \

-h node1 \

consul agent -server -bind=172.17.0.2 -bootstrap-expect=3 -node=node1 \

-data-dir=/tmp/data-dir -client 0.0.0.0 -ui

查看node1的日志,追踪运行情况:

现在集群中还没有选举leader节点,继续启动其余两台Server节点node2和node3:

node2:

madison@ubuntu:~$ docker run -d --name=node2 --restart=always \

-e 'CONSUL_LOCAL_CONFIG={"skip_leave_on_interrupt": true}' \

-p 9300:8300 \

-p 9301:8301 \

-p 9301:8301/udp \

-p 9302:8302/udp \

-p 9302:8302 \

-p 9400:8400 \

-p 9500:8500 \

-p 9600:8600 \

-h node2 \

consul agent -server -bind=172.17.0.3 \

-join=192.168.127.128 -node-id=$(uuidgen | awk '{print tolower($0)}') \

-node=node2 \

-data-dir=/tmp/data-dir -client 0.0.0.0 -ui

查看node2节点的进程启动日志:

node3:

madison@ubuntu:~$ docker run -d --name=node3 --restart=always \

-e 'CONSUL_LOCAL_CONFIG={"skip_leave_on_interrupt": true}' \

-p 10300:8300 \

-p 10301:8301 \

-p 10301:8301/udp \

-p 10302:8302/udp \

-p 10302:8302 \

-p 10400:8400 \

-p 10500:8500 \

-p 10600:8600 \

-h node2 \

consul agent -server -bind=172.17.0.4 \

-join=192.168.127.128 -node-id=$(uuidgen | awk '{print tolower($0)}') \

-node=node3 \

-data-dir=/tmp/data-dir -client 0.0.0.0 -ui

查看node3节点的进程启动日志:

当3个Server节点都启动并正常运行时,观察node2和node3的进程日志,可以发现node1被选举为leader节点,也就是这个数据中心的Server Master。

再次查看node1节点的进程启动日志:

观察日志发现,node2和node3都成功join到了node1所在的数据中心dc1。当集群中有3台Consul Server启动时,node1被选举为dc1中的主节点。然后,node1会通过心跳检查的方式,不断地对node2和node3进行健康检查。

2.4.4. 启动Client节点

node4:

madison@ubuntu:~$ docker run -d --name=node4 --restart=always \

-e 'CONSUL_LOCAL_CONFIG={"leave_on_terminate": true}' \

-p 11300:8300 \

-p 11301:8301 \

-p 11301:8301/udp \

-p 11302:8302/udp \

-p 11302:8302 \

-p 11400:8400 \

-p 11500:8500 \

-p 11600:8600 \

-h node4 \

consul agent -bind=172.17.0.5 -retry-join=192.168.127.128 \

-node-id=$(uuidgen | awk '{print tolower($0)}') \

-node=node4 -client 0.0.0.0 -ui

查看node4节点的进程启动日志:

可以发现:node4是以Client模式启动运行的。启动后完成后,把dc1数据中心中的以Server模式启动的节点node1、node2和node3都添加到本地缓存列表中。当客户端向node4发起服务发现的请求后,node4会通过RPC将请求转发给Server节点中的其中一台做处理。

2.4.5. 查看集群状态

madison@ubuntu:~$ docker exec -t node1 consul members

dc1数据中心中的4个节点node1, node2, node3和node4分别成功启动,Status表示他们的状态,都为alive。node1, node2, node3以Server模式启动,而node4以Client模式启动。

2.5. Docker安装Registrator

2.5.1. 拉取Registrator的镜像

madison@ubuntu:~$ docker pull gliderlabs/registrator:latest

2.5.2. 启动Registrator节点

madison@ubuntu:~$ docker run -d --name=registrator \

-v /var/run/docker.sock:/tmp/docker.sock \

--net=host \

gliderlabs/registrator -ip="192.168.127.128" consul://192.168.127.128:8500

--net指定为host表明使用主机模式。-ip用于指定宿主机的IP地址,用于健康检查的通信地址。consul://192.168.127.128:8500: 使用Consul作为服务注册表,指定具体的Consul通信地址进行服务注册和注销(注意:8500是Consul对外暴露的HTTP通信端口)。

查看Registrator的容器进程启动日志:

Registrator在启动过程完成了以下几步操作:

  1. 查看Consul数据中心的leader节点,作为服务注册表;
  2. 同步当前宿主机的启用容器,以及所有的服务端口;
  3. 分别将各个容器发布的服务地址/端口注册到Consul的服务注册列表。

2.5.3. 查看Consul的注册状态

Consul提供了一个Web UI来可视化服务注册列表、通信节点、数据中心和键/值存储等,直接访问宿主机的8500端口。

服务注册列表:

NODES节点下挂载着dc1数据中心中的所有的Consul节点,包括Consul Server和Client。

通信节点列表:

启动Registrator以后,宿主机中的所有容器把服务都注册到Consul的SERVICES上,测试完成!


总结

单数据中心的Consul集群的搭建就完成了!!!后续章节我会介绍如何使用Registrator进行服务注册的标签化。然后通过docker部署多实例的Web容器来实现基于HTTP的RESTful Service和基于TCP的RPC Service的服务注册和健康检查定义,并演示如何以标签标识一个服务的多个实例。

理解Registrator、Nginx、Consul架构与SpringCloud Feign、grpc、rest通信之间的不同点 在互联网应用领域,服务的动态性需求十分常见,这就对服务的自动发现和可动态扩展提出了很高的要求。 微服务系统动辄上万个服务,而且还要动态伸缩。以人工写好的IP、Port 硬编码脚本的方式无法做到大规模自动化,稍微多点服务运维就傻了。微服务必然要做到ip和port自动分配,减少人工干预。我们需要让每个服务能动态的创建地址,同时调用方要能感知地址变化。 这就需要有一个服务注册与发现的机制,这篇文件就是讨论如何实现这个机制。 Docker 的出现,以及微服务架构的兴起,让众多开源项目开始关注在松耦合的架构前提下,如 阅读详情

相关推荐

iStore增强插件 如何重塑家庭网络与存储体验

本文深入解析了iStore增强插件如何重塑家庭数字生活体验。它通过集成智能流控、一键式文件共享、媒体服务器及智能家居网关等功能,将复杂的网络配置、存储管理与设备协同简化为图形化操作,有效解决了家庭网络卡顿、数据割裂与使用门槛高等核心痛点,让普通用户也能轻松打造高效、稳定、安全的家庭数字中枢。

prometheus9mon的博客 648

Registrator 实战

为什么80%的码农都做不了架构师?>>> ...

weixin_34357267的博客 896

手把手教你搞定CAC会议投稿:从LaTeX模板到PDF eXpress避坑全流程

本文详细解析CAC会议投稿全流程,重点介绍LaTeX模板调整、Turnitin查重技巧及PDF eXpress校验避坑指南。通过实战案例和代码示例,帮助研究者高效完成IEEE格式论文投稿,避免常见技术性失误,提升投稿成功率。

weixin_29969209的博客 397

Docker+Consul+Registrator实现服务自动注册与发现

近年微服务架构在互联网应用领域中愈来愈火,引入微服务主要解决了单体应用多个模块的紧耦合、无法扩展和运维困难等问题。微服务架构就是按照功能粒度将业务模块进行垂直拆分,对单体应用本身进行服务化和组件化,每个组件单独部署为小应用(从DB到UI)。微服务与微服务之间通过Service API进行交互,同时为了支持水平扩展、性能提升和服务可用性,单个服务允许同时部署一个或者多个服务实例。在运行时,每个实例通...

小健健的博客 1060

大模型-高通平台性能测试示例-2

在QNN中,可以使用(genis-t2t-run)和这两个工具来进行推理的性能分析。支持在QNX操作系统或Android操作系统上进行性能分析。:提供基本的性能数据,如运行时间、资源消耗等。:提供更详细的性能数据,可能包括各个操作的执行时间、资源使用情况等。:是指在性能分析的同时进行代码质量检查,以发现潜在的问题。:是指跟踪和分析神经网络中各个操作的性能,以优化网络结构或参数。

点滴的岁月 1493

基于Sentinel-2(哨兵2)遥感卫星的植被覆盖度提取

基于Sentinel-2(哨兵2)遥感卫星的植被覆盖度提取 一、Sentinel-2简单介绍 哨兵-2系列卫星的主要载荷多光谱成像仪拥有13个谱段,从可见光到近红外再到短波红外,空间分辨率从10m到60m,能实现全所未有的陆地海洋监测水平。其幅宽高达290KM,且A、B双星组合,覆盖能力比美国Landsat8卫星强很多。目前哨兵-2A和哨兵-2B已经实现了5天的重访时间,即使在之前仅有单颗卫星时,...

weixin_44143671的博客 2万+

微服务注册发现集群搭建——Registrator + Consul + Consul-template + nginx

在互联网应用领域,服务的动态性需求十分常见,这就对服务的自动发现和可动态扩展提出了很高的要求。微服务系统动辄上万个服务,而且还要动态伸缩。以人工写好的IP、Port 硬编码脚本的方式无法做到大规模自动化,稍微多点服务运维就傻了。微服务必然要做到ip和port自动分配,减少人工干预。我们需要让每个服务能动态的创建地址,同时调用方要能感知地址变化。这就需要有一个服务注册与发现的机制,这篇文件就是讨论如何

liberalman的专栏 5712

医学图像处理入门:如何用Python将CT灰度图转换为伪彩色图像(附代码)

本文详细介绍了如何使用Python将CT灰度图转换为伪彩色图像,提升医学图像的可读性和诊断效率。通过OpenCV和Matplotlib等工具,实现灰度值到彩色空间的映射,特别适用于突出显示特定组织密度差异。文章包含完整代码示例和临床实用技巧,适合医学影像分析初学者和Python开发者。

gitlab7runner的博客 326

Docker+Consul+Registrator 实现服务注册与发现

Docker+Consul+Registrator 实现服务注册与发现

共产主义接班人 1119

基于uniapp开发PDA扫码枪APP:实现RFID批量扫描读取功能

基于uniapp的PDA扫码枪APP开发实战,实现高效RFID读取功能,uniapp整合PDA硬件的实践分享,基于uniapp的PDA端RFID批量扫描方案开发

商务合作 / 项目定制 / 学习交流。个人vx:lovely_wml 1万+

uniapp - 最新实现APP连接使用MQTT流程及源码教程,uniapp app端接入mqtt发布订阅和接收消息队列传送消息、断开重连等各种示例代码(完美兼容安卓Android与苹果ios手机)

uniapp app端接入mqtt示例代码教程,uni-app中使用mqtt,uniapp安卓app接入mqtt,uniApp苹果ios集成MQTT教程,uniapp vue3 mqtt app端的接入流程,uniapp开发安卓和ios如何在项目里集成mqtt,Mqtt协议,uniapp开发APP,主动连接mqtt,订阅消息,实现发布,订阅和接收消息,如何在uniapp项目中使用mqtt,uniapp mqtt的使用示例,mqtt连接报错,搭建MQTT通讯做聊天项目,uniapp与设备通信 通过mqtt实现

🏆 前端领域优质创作者 6570

基于Consul+Registrator+Nginx实现容器服务自动发现的集群框架

我们先来看一下服务发现常用的框架有哪些: zookeeper eureka etcd consul 这里就不挨个来介绍它们了,本文中主要以consul为主,如果你在大量接触或使用微服务的话,你可能会碰到一个问题?当你创建的服务数量越来越多时,这些服务之间的通信便越难管理,而且维护代价会越来越高。consul可以给你答案,我们一起来了解一下consul: 基于Consul+Registrator+...

ff00yo的博客 443

Open3D 点云转深度图像【2026最新版】

python版本Open3D 实现的点云转深度图像,博客长期更新,本文最新更新时间为:2026年5月10日。

点云侠的博客 2838

使用Consul建立docker集群(consul + consul-template + registrator + docker)

目录一、概述1、什么是consul2、consul-template概述3、registrator的作用4、docker容器二、搭建consul集群环境1、安装Consul2、配置容器服务自动加入nginx集群(1)安装Gliderlabs/Registrator(2)测试服务3、验证http和nginx服务是否注册到consul4、安装consul-template5、准备template nginx模板文件6、部署nginx7、启动template8、测试9、部署consul多节点 一、概述 1、什么是

ljj的学习笔记 803

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

第18章 Docker 中 Consul 的安装与配置及使用

第18章 Docker 中 Consul 的安装与配置及使用 文章目录第18章 Docker 中 Consul 的安装与配置及使用前言目标环境介绍快速参考(Quick reference)什么是Consul ?Consul and DockerUsing the Container`dumb-init``consul members``VOLUME /consul/data``/consul/config``--net=host`Running Consul for DevelopmentRunning C

Kony的专栏 3579

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

基于docker consul服务发现集群搭建

基于docker consul服务发现集群搭建 一、Consul简介 Consul 是一套开源的分布式服务发现和配置管理系统,由 HashiCorp 公司用 Go 语言开发。它具有很多优点。包括:基于raft 协议,比较简洁; 支持健康检查, 同时支持 HTTP 和 DNS 协议 支持跨数据中心的 WAN(广域网) 集群 提供图形界面 跨平台,支持 Linux、Mac、Windows。 consul是使用go语言开发的服务发现、配置管理中心服务。内置了服务注册与发现框架、分布一致性协议实现、健康检查、K

weixin_42099301的博客 367

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Docker consul容器服务更新和发现

Docker consul容器服务更新和发现 文章目录Docker consul容器服务更新和发现前言1.consul简介2.建立consul服务3.gliderlabs/registrator4.consul-template5.实验过程 前言 docker consul容器服务更新和发现 docker consul的服务器的发现机制主要是依赖于consul服务,consul服务能够自动...

double_happy111的博客 570

Linux——Docker实现服务发现

Docker实现服务发现 环境: IP 主机名 服务 192.168.1.40 Master Consul、Nginx 192.168.1.41 node01 registrator 192.168.1.42 node02 registrator PS:关闭每台防火墙、SELinux、主机名不能冲突 实现步骤: 一、启动Consul服务 1.下载consul包并启动 [root@master ~]# wget https://releases.hashicorp.com/co

weixin_45191791的博客 596

docker中的使用Consul、docker-compose、Consul-template、registrator搭建Consul集群(图文详情!)

服务器:192.168.2.8 Docker-ce 、Compose、Consul、Consul-template 服务器:192.168.2.9 Docker-ce 、registrator Consul服务器:192.168.2.8 //把consul_0.9.2_linux_amd64.zip拖进来 mkdir /root/consul cp consul_0.9.2_linux_amd64.zip /root/consul cd /root/consul unzip consul_0.9.2_lin

qq_35456705的博客 609

使用Consul建立docker集群

使用Consul建立docker集群(consul + consul-template + registrator + docker一、概述1、什么是consul2、consul-template概述3、registrator的作用二、搭建consul集群环境2、配置容器服务自动加入nginx集群(2)测试服务3、验证http和nginx服务是否注册到consul4、安装consul-template5、准备template nginx模板文件6、部署nginx7、启动template8、测试9、部署con

m0_55637617的博客 700
上一篇: Docker入门实战——mysql镜像使,使用Dockerfile创建自己的镜像
下一篇: 自从学习了专家整理的kafka 设计与原理详解之后,薪资翻了两番
爱玛士
博客等级 码龄7年 719粉丝 253原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值