Docker服务发现新纪元:探索Consul的无限魅力

  • 作者简介:我是团团儿,是一名专注于云计算领域的专业创作者,感谢大家的关注 •
  • 座右铭:   云端筑梦,数据为翼,探索无限可能,引领云计算新纪元
  • 个人主页:团儿.-CSDN博客

目录

前言:

正文: 

docker服务发现

常见的服务发现工具:

总结:

Consul简介

Consul特性

1.服务注册/发现

2.数据强一致性保证

3.多数据中心

4.健康检查

5.Key/Value存储

实验环境准备

一、在Docker01上执行二进制命令部署consul服务

二、docker02、docker03,加入consul集群

三、docker02及docker03主机上以容器的方式运行registrator服务

docker02配置如下:

docker03配置如下:

四、在主机docker01上部署Nginx服务,以便提供反向代理

五、在docker01安装consul-template命令工具,并编写模板

六、验证服务的实时发现功能


前言:

在当今快速迭代的软件开发环境中,微服务架构凭借其灵活性、可扩展性和高可用性,成为了众多企业的首选。然而,微服务架构也带来了新的挑战,其中之一就是服务发现。服务发现是指在微服务架构中,服务实例能够动态地注册到服务注册中心,并被其他服务实例发现和调用的过程。

Docker作为一种轻量级的容器化技术,为微服务架构提供了强大的支持。然而,仅仅使用Docker来部署微服务并不足以解决服务发现的问题。为了解决这个问题,我们需要一个高效、可靠的服务发现工具,而Consul正是这样一个出色的选择。

Consul是HashiCorp公司开发的一款开源服务网格解决方案,它提供了服务发现、配置管理和分段功能。通过Consul,微服务实例可以轻松地注册和注销,其他服务实例也能够快速地发现和调用它们。此外,Consul还支持健康检查、故障转移和负载均衡等功能,为微服务架构提供了全面的保障。

本文将深入探讨Docker服务发现与Consul的结合使用。我们将从Consul的基本概念、架构和原理入手,逐步讲解如何在Docker环境中安装和配置Consul,以及如何利用Consul实现服务发现。通过本文的学习,您将能够掌握Docker服务发现的核心技术,为您的微服务架构提供更加强大、可靠的支持。


正文: 

docker服务发现

    服务发现在SOA(Service-Oriented Architecture)架构中是一个很重要的概念,是支撑大规模 SOA 的核心服务,在应用Docker容器集群的实践中也是非常重要的功能。对于Docker容器之间跨主机访问这个难题,服务发现是目前较为实用的解决方案。

    服务发现的功能是管理一个集群中的进程或服务之间的通信,涉及到服务列表,在服务列表中注册服务,并且能够在服务列表中查找并连接服务。服务发现的基本思想是任何一个应用的实例能够以编程的方式获取当前环境的细节,这是为了让新的实例可以嵌入到现有的应用环境而不需要人工干预。当有任何进程监听TCP或UDP端口时,服务发现组件都应该能够察觉,并且能够根据名字查找到并连接上这个端口。复杂系统的服务发现组件要提供更多的功能,例如,服务元数据存储、健康监控、多种查询和实时更新等。总的来说,服务发现提供了一种协调机制,方便服务的发布和查找。

    设计目标是减少或消除组件之间的“手动”的连接。当你把你的应用程序推送进生产的时候,所有的这些事情都可以配置:数据库服务器的主机和端口,REST服务的 URL等等,在一个高可扩展的架构中,这些连接可以动态改变。一个新的后端可以被添加,一个数据库节点可以被停止。你的应用需要适应这种动态环境。普遍原则是:当启动的时候,一个服务的实例必须注册进配置服务器。当停止的时候(完美停止或是 Crash 了),节点必须从配置服务中移除掉。注册后,其他服务可以在配置服务器中搜索到提供制度服务的实例列表(主机和端口)。

    工作过程:每一个服务发现工具都会提供一套API,使得组件可以用其来设置或搜索数据。正是如此,对于每一个组件,服务发现的地址要么强制编码到程序或容器内部,要么在运行时以参数形式提供。通常来说,发现服务用键值对形式实现,采用标准http协议交互。

    工作方式:当每一个服务启动上线之后,他们通过发现工具来注册自身信息。它记录了一个相关组件若想使用某服务时的全部必要信息。例如,一个MySQL数据库服务会在这注册它运行的ip和端口,如有必要,登录时的用户名和密码也会留下。
    当一个服务的消费者上线时,它能够在预设的终端查询该服务的相关信息。然后它就可以基于查到的信息与其需要的组件进行交互。负载均衡就是一个很好的例子,它可以通过查询服务发现得到各个后端节点承受的流量数,然后根据这个信息来调整配置。


常见的服务发现工具:

    etcd: 这是CoreOS的创建者提供的工具,面向容器和宿主机提供服务发现和全局配置存储功能。它在每个宿主机上有基于http协议的API和命令行的客户端。    

    Zookeeper: 最早做服务发现的开源项目之一,起源于Hadoop,帮助在Hadoop集群中维护各种组件。它非常成熟、可靠,被许多大公司(YouTube、eBay、雅虎等)使用。其数据存储的格式类似于文件系统,如果运行在一个服务器集群中,Zookeeper实现了跨所有节点共享配置状态。

    consul: 这个服务发现平台有很多高级的特性,使得它脱颖而出,例如:配置健康检查、ACL功能HAProxy配置等等。
        Consul是强一致性的数据存储,与Zookeeper和etcd不一样,Consul内嵌实现了服务发现系统,所以这样就不需要构建自己的系统或使用第三方系统,另外,Consul还包括节点健康检查和运行在其上的服务。


总结:

    服务发现工具使得Docker容器可以适应它们当前所处环境并嵌入现有的组件。这是实现提供方便、容易扩展和部署的功能的一个重要的先决条件,该功能通过允许组件跟踪和应对他们所在环境变化来实现。


Consul简介

Consul是基于GO语言开发的开源工具,主要面向分布式、服务化的系统提供服务注册、服务发现和配置管理的功能。Consul的功能都很实用,其中包括:服务注册/发现、健康检查、Key/Value存储、多数据中心和分布式一致性保证等特性。Consul本身只是一个二进制的可执行文件,所以安装和部署都非常简单,只需要从官网下载后,在执行对应的启动脚本即可。

Consul特性

1.服务注册/发现

为什么微服务架构下就需要做服务注册和服务发现呢?微服务的目标就是要将原来大一统的系统架构,拆分成细粒度的按功能职责分成的小系统,这样就会出现很多小的系统,部署的节点也会随之增加。试想一下,如果没有一个统一的服务组件来管理各系统间的列表,微服务架构是很难落地实现的。
Consul提供的服务注册/发现功能在数据强一致性和分区容错性上都有非常好的保证,但在集群可用性下就会稍微差一些(相比Euerka来说)。

2.数据强一致性保证

Consul采用了一致性算法Raft来保证服务列表数据在数据中心中各Server下的强一致性,这样能保证同一个数据中心下不管某一台Server Down了,请求从其他Server中同样也能获取的最新的服务列表数据。数据强一致性带来的副作用是当数据在同步或者Server在选举Leader过程中,会出现集群不可用。

3.多数据中心

Consul支持多数据中心(Data Center),多个数据中心之间通过Gossip协议进行数据同步。多数据中心的好处是当某个数据中心出现故障时,其他数据中心可以继续提供服务,提升了可用性。

4.健康检查

Consul支持基本硬件资源方面的检查,如:CPU、内存、硬盘等

5.Key/Value存储

Consul支持Key/Value存储功能,可以将Consul作为配置中心使用,可以将一些公共配置信息配置到Consul,然后通过Consul提供的 HTTP API来获取对应Key的Value。

实验环境准备

Consul:分布式、高可用的,服务发现和配置的工具,数据中心

Registrator:负责收集dockerhost上,容器服务的信息,并且发送给consul

Consul-template:根据编辑好的模板生成新的nginx配置文件,并且负责加载nginx配置文件

| 主机名   | IP地址        | 所需组件
|
| docker01|192.168.8.20 |consul,consul-template,nginx
| docker02|192.168.8.30 |consul, registrator 
| docker03|192.168.8.40  |consul, registrator 

注:实验环境关闭防火墙、禁用SElinux

一、在Docker01上执行二进制命令部署consul服务

[root@docker01 ~]# rz                  //上传压缩包
[root@docker01 ~]# unzip consul_1.5.1_linux_amd64.zip   //解包,解压后会得到一个命令
[root@docker01 ~]# mv consul /usr/local/bin/        // 移动到命令存放路径
[root@docker01 ~]# chmod  +x /usr/local/bin/consul  //赋予执行权限 
[root@docker01 ~]# nohup consul agent -server -bootstrap -ui -data-dir=/var/lib/consul-data -bind=192.168.8.20 -client=0.0.0.0 -node=master &

[root@docker01 ~]# consul info    //可以看到这个群集的leader及版本信息
//如:leader_addr = 192.168.8.20:8300

[root@docker01 ~]# consul members          //查看consul集群内成员的信息

至此,客户端可以访问docker01的8500端口进行验证:


二、docker02、docker03,加入consul集群

docker02配置如下:

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.8.20 -advertise 192.168.8.30 -client 0.0.0.0 -node=node01

//上述命令中,“-join”是指定leader的IP地址(也就是docker01);“-advertise”是指定自己本身的IP地址

docker03配置如下:

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.8.20 -advertise 192.168.8.40 -client 0.0.0.0 -node=node02

//注意:node名称在consul群集中,必须唯一

至此,执行“consul members”命令即可查看到docker02及docker03的信息:

[root@docker01 ~]# consul members 
Node    Address              Status  Type    Build  Protocol  DC   Segment
master  192.168.8.20:8301  alive   server  1.5.1  2         dc1  <all>
node01  192.168.8.30:8301  alive   client  0.5.2  2         dc1  <default>
node02  192.168.8.40:8301  alive   client  0.5.2  2         dc1  <default>

浏览器访问consul服务,验证集群信息:
http://192.168.8.20:8500


三、docker02及docker03主机上以容器的方式运行registrator服务

registrator是一个能自动发现docker container提供的服务,并在后端服务注册中心注册服务或取消服务的工具,后端注册中心支持conusl、etcd、skydns2、zookeeper等。

docker02配置如下:

docker run -d --name registrator -v /var/run/docker.sock:/tmp/docker.sock --restart always gliderlabs/registrator consul://192.168.8.30:8500

//上述命令的作用是将收集的容器信息发送给本机的8500端口来显示


docker03配置如下:

docker run -d --name registrator -v /var/run/docker.sock:/tmp/docker.sock --restart always gliderlabs/registrator consul://192.168.8.40:8500

//上述命令的作用是将收集的容器信息发送给本机的8500端口来cha显示

浏览器测试访问,这里我只访问了node1,这里就不访问node2了:

四、在主机docker01上部署Nginx服务,以便提供反向代理

yum -y install gcc openssl openssl-devel zlib zlib-devel pcre pcre-devel 

tar zxf nginx-1.14.0.tar.gz  -C /usr/src/

useradd -M -s /sbin/nologin nginx

cd /usr/src/nginx-1.14.0/

./configure --user=nginx --group=nginx --with-http_stub_status_module --with-http_realip_module --with-pcre --with-http_ssl_module && make && make install

ln -s /usr/local/nginx/sbin/* /usr/local/sbin/

nginx -t

nginx


五、在docker01安装consul-template命令工具,并编写模板

注:consul-template的作用就是将收集到的信息(把registrator收集到容器的信息)写入template模板中,并且最终写入Nginx的配置文件中。

[root@docker01 ~]# rz           //上传包
[root@docker01 ~]# unzip consul-template_0.19.5_linux_amd64.zip     //解包
[root@docker01 ~]# mv consul-template /usr/local/bin/   //移动到命令搜索路径
[root@docker01 ~]# chmod +x /usr/local/bin/consul-template    //赋予执行权限
[root@docker01 ~]# cd /usr/local/nginx/
//在Nginx安装目录下,编写模板供consul-template命令工具使用,并且配置Nginx反向代理
[root@docker01 nginx]# mkdir consul
[root@docker01 nginx]# cd  consul/
[root@docker01 consul]# vim nginx.ctmpl
upstream http_backend {
        {{range service "nginx"}}
        server {{ .Address }}:{{ .Port }};
        {{ end }}
}
server {
        listen 8000;
        server_name localhost;
        location / {
                proxy_pass http://http_backend;
        }
}
//编辑完成后,保存退出即可


[root@docker01 consul]# vim ../conf/nginx.conf    //在主配置文件中进行调用生成的vhost.conf文件
include /usr/local/nginx/consul/*.conf;
}             //在配置文件末尾的花括号上方写入“include”配置,进行调用vhost.conf文件
[root@docker01 consul]# nginx -s reload   //重启nginx服务
[root@docker01 consul]# nohup consul-template -consul-addr 192.168.8.20:8500 -template "/usr/local/nginx/consul/nginx.ctmpl:/usr/local/nginx/consul/vhost.conf:/usr/local/sbin/nginx -s reload" &


//同样也是将这条命令放入后台执行,否则会占用前台的终端
//这条命令的作用就是将本机收集到的信息,生成一个vhost.conf的文件,将命令放入后台才能保证实时发现同步并更新


六、验证服务的实时发现功能

配置至此,docker02或者docker03上一旦有任何Nginx相关的容器以后台“-d”的运行方式运行,都会被添加到反向代理中来,进行调度,一旦容器发生意外关闭,则可以自动从反向代理配置文件中剔除。

现在可以在docker02、和docker03上分别运行两台Nginx容器,其容器名称依次为web01、web02…,其网页文件依次为:this is web01 test、this is web02 test…

为其准备不同的网页文件的目的就是方便客户端访问时区分访问的是哪台容器。

由于其配置过程类似,我这里就写出一个运行Nginx容器的过程,其他照做即可。

配置示例如下(运行web01并修改其首页文件):

[root@docker02 ~]# docker run -d -P --name web01 nginx
[root@docker02 ~]# docker exec  -it web01  /bin/bash
root@1aaf578ec6f7:/#  echo "this is a web01 test." > /usr/share/nginx/html/index.html

注:在docker02及docker03运行四个Nginx容器后(必须以后台运行的方式,也就是说在运行时必须有“-d”选项),那么,此时访问docker01的8000端口,就会循环访问到这四个容器提供的网页文件,如下:

[root@docker01 consul]# curl 192.168.8.20:8000
this is a web01 test.
[root@docker01 consul]# curl 192.168.8.20:8000
this is a web02 test.
[root@docker01 consul]# curl 192.168.8.20:8000
this is a web03 test.
[root@docker01 consul]# curl 192.168.8.20:8000
this is a web04 test.
[root@docker01 consul]# curl 192.168.8.20:8000
this is a web01 test.
[root@docker01 consul]# curl 192.168.8.20:8000
this is a web02 test.

//并且查看以下文件,会看到其中的配置

[root@docker01 consul]# cat /usr/local/nginx/consul/vhost.conf     //以下web池中的server都是基于编写的模板自动生成的
upstream http_backend {

  server 192.168.8.20:32768;

  server 192.168.8.20:32769;

  server 192.168.8.30:32768;

  server 192.168.8.30:32769;

}

server {
  listen 8000;
  server_name localhost;
  location / {
  proxy_pass http://http_backend;
  }
}

//由于consul-template是在后台运行的,所以,只要检测到容器的变化,就会动态修改上述文件
//并且重启Nginx服务,使更改生效

至此,consul+registrator+docker实时服务发现就配置完成了


期待您的关注~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/942776.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

OpenHarmony-6.IPC/RPC组件

IPC/RPC组件机制 1.基本概念 IPC&#xff1a;设备内的进程间通信&#xff08;Inter-Process Communication&#xff09;。 RPC&#xff1a;设备间的进程间通信&#xff08;Remote Procedure Call&#xff09;。 IPC/RPC用于实现跨进程通信&#xff0c;不同的是前者使用Binder驱…

0.机顶盒晶晨s905l3b芯片--刷入第三方系统+安卓9 root教程+armbian写入EMMC教程

机顶盒s905l3b芯片刷第三方系统安卓9 root教程刷armbian写入EMMC教程 声明&#xff1a; 由于固件、软件、镜像等持续更新&#xff0c;本文仅代表当前所使用版本的流畅安装记录。行文略长&#xff0c;关键代码处会配以截图展示&#xff0c;请自行对比是否存在差异导致安装失败…

视频监控平台:Liveweb视频汇聚融合平台智慧安防视频监控应用方案

Liveweb是一款功能强大、灵活部署的安防视频监控平台&#xff0c;支持多种主流标准协议&#xff0c;包括GB28181、RTSP/Onvif、RTMP等&#xff0c;同时兼容海康Ehome、海大宇等厂家的私有协议和SDK接入。该平台不仅提供传统安防监控功能&#xff0c;还支持接入AI智能分析&#…

汇编语言学习

想要理解栈溢出的最基本原理&#xff0c;汇编和栈是必不可少的&#xff0c;不然想我之前学了也是白学&#xff0c;原理都不知道 一、准备 1.安装gcc sudo apt-get build-dep gcc 这里显示版本不对&#xff0c;我用的是国内镜像源&#xff0c;需要换一下配置 sudo nano /e…

“乡村探索者”:村旅游网站的移动应用开发

3.1 可行性分析 从三个不同的角度来分析&#xff0c;确保开发成功的前提是有可行性分析&#xff0c;只有进行提前分析&#xff0c;符合程序开发流程才不至于开发过程的中断。 3.1.1 技术可行性 在技术实现层次&#xff0c;分析了好几种技术实现方法&#xff0c;并且都有对应的成…

Python + 深度学习从 0 到 1(02 / 99)

希望对你有帮助呀&#xff01;&#xff01;&#x1f49c;&#x1f49c; 如有更好理解的思路&#xff0c;欢迎大家留言补充 ~ 一起加油叭 &#x1f4a6; 欢迎关注、订阅专栏 【深度学习从 0 到 1】谢谢你的支持&#xff01; ⭐ Keras 快速入门&#xff1a; 神经网络的基本数据结…

MySQL用户授权

什么是数据库 数据库概述&#xff1a;数据库是按照一定的数据结构将数据存储在存储器的集合常见数据库软件 软件名开源跨平台厂 商Oracle否是甲骨文MySQL是是甲骨文SQL Server否否微软DB2否是IBMMongoDB是是MongoDB Inc.Redis是是开源软件Memcached是是开源软件 DB (DataBas…

2025年我国网络安全发展形势展望

展望2025年&#xff0c;我国网络安全产业有望迎来新的快速增长阶段&#xff0c;零信任安全架构将在各行各业加快应用落地&#xff0c;数据安全技术攻关和应用进程加快&#xff0c;关键基础设施安全能力不断提升。同时&#xff0c;也应关注国家级网络对抗风险加剧、网络安全产业…

GitPuk安装配置指南

GitPuk是一款开源免费的代码管理工具&#xff0c;上篇文章已经介绍了Gitpuk的功能与优势&#xff0c;这篇文章将为大家讲解如何快速安装和配置GitPuk&#xff0c;助力你快速的启动GitPuk管理代码 1. 安装 支持 Windows、Mac、Linux、docker 等操作系统。 1.1 Windows安装 下载…

ArcGIS+MIKE21 洪水淹没分析、溃坝分析,洪水淹没动态效果

洪水淹没分析过程&#xff1a; 一、所需数据&#xff1a; 1.分析区域DEM数据 二、ArcGIS软件 1.提取分析区域DEM&#xff08;水库坝下区域&#xff09; 2.DEM栅格转点 3.计算转换后几何点的x和y坐标值&#xff08;精度20、小数位3&#xff09; 4.导出属性表&#xff0c;形式…

中伟视界:AI识别摄像头+AI预警平台在矿山皮带空载监测中的应用

在矿山开采和矿物处理过程中&#xff0c;皮带运输机扮演着举足轻重的角色。它们负责将矿石、煤炭等物料从一处运送到另一处&#xff0c;是矿山生产流程中不可或缺的一环。然而&#xff0c;皮带运输机在运行过程中也面临着一些挑战&#xff0c;其中之一便是皮带空载问题。皮带空…

探索多模态大语言模型(MLLMs)的推理能力

探索多模态大语言模型&#xff08;MLLMs&#xff09;的推理能力 Multimodal Large Language Models (MLLMs) flyfish 原文&#xff1a;Exploring the Reasoning Abilities of Multimodal Large Language Models (MLLMs): A Comprehensive Survey on Emerging Trends in Mult…

AIGC时代:如何快速搞定Spring Boot+Vue全栈开发

文章目录 一、Spring Boot基础二、Vue.js基础三、Spring Boot与Vue.js集成四、性能优化与最佳实践《快速搞定Spring BootVue全栈开发》内容简介作者简介目录前言/序言本书内容本书特点读者对象 随着人工智能生成内容&#xff08;AIGC&#xff09;技术的迅速发展&#xff0c;内容…

mongodb和Cassandra

mongodb的一致性问题&#xff1a; 15.MongoDB的一致性(读关注与写关注)_mongo w选项-CSDN博客 孤儿节点问题&#xff1a; 技术干货 | MongoDB 偶遇孤儿文档及处理方法-腾讯云开发者社区-腾讯云 分片集群MongoDB迁移前清除孤儿文档 由数据迁移至MongoDB导致的数据不一致问题…

nginx-rtmp服务器搭建

音视频服务器搭建 本文采用 nginx/1.18.0和nginx-rtmp-module模块源代码搭建RTMP流媒体服务器 流程 查看当前服务器的nginx版本下载nginx和nginx-rtmp-module源代码重新编译nginx&#xff0c;并进行相关配置&#xff08;nginx.conf、防火墙等&#xff09;客户端测试连接测试搭…

初始 ShellJS:一个 Node.js 命令行工具集合

一. 前言 Node.js 丰富的生态能赋予我们更强的能力&#xff0c;对于前端工程师来说&#xff0c;使用 Node.js 来编写复杂的 npm script 具有明显的 2 个优势&#xff1a;首先&#xff0c;编写简单的工具脚本对前端工程师来说额外的学习成本很低甚至可以忽略不计&#xff0c;其…

(echarts)数据地图散点类型根据条件设置不同的标记图片

(echarts)数据地图散点类型根据条件设置不同的标记图片 1.用在线工具将本地图片转化base64格式 data(){return { base64Img:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADQ...",} }在线转换地址&#xff1a;https://www.jyshare.com/front-end/59/ 2.symbol属…

Linux高级--2.4.5 靠协议头保证传输的 MAC/IP/TCP/UDP---协议帧格式

任何网络协议&#xff0c;都必须要用包头里面设置写特殊字段来标识自己&#xff0c;传输越复杂&#xff0c;越稳定&#xff0c;越高性能的协议&#xff0c;包头越复杂。我们理解这些包头中每个字段的作用要站在它们解决什么问题的角度来理解。因为没人愿意让包头那么复杂。 本…

网络下载ts流媒体

网络下载ts流媒体 查看下载排序合并 很多视频网站&#xff0c;尤其是微信小程序中的长视频无法获取到准确视频地址&#xff0c;只能抓取到.ts片段地址&#xff0c;下载后发现基本都是5~8秒时长。 例如&#xff1a; 我们需要将以上地址片段全部下载后排序后再合成新的长视频。 …

小程序租赁系统开发指南与实现策略

内容概要 在如今这个快节奏的时代&#xff0c;小程序租赁系统的开发正逐渐成为许多商家提升服务质量与效率的重要选择。在设计这样一个系统时&#xff0c;首先要明白它的核心目标&#xff1a;便捷、安全。用户希望在最短的时间内找到需要的物品&#xff0c;而商家则希望通过这…