Docker——consul的容器服务更新与发现

一、什么是服务注册与发现

  服务注册与发现是微服务架构中不可或缺的重要组件。起初服务都是单节点的,不保障高可用性,也不考虑服务的压力承载,服务之间调用单纯的通过接口访问。直到后来出现了多个节点的分布式架构,起初的解决手段是在服务前端负载均衡,这样前端必须要知道所有后端服务的网络位置,并配置在配置文件中。这里就会有几个问题:

  • 如果需要调用后端服务A-N,就需要配置N个服务的网络位置,配置很麻烦
  • 后端服务的网络位置变化,都需要改变每个调用者的配置

  后端服务A-N可以把当前自己的网络位置注册到服务发现模块,服务发现就以K-V的方式记录下来,K一般是服务名,V就是IP:PORT。服务发现模块定时的进行健康检查,轮询查看这些后端服务能不能访问的了。前端在调用后端服务A-N的时候,就跑去服务发现模块问下它们的网络位置,然后再调用它们的服务。这样的方式就可以解决上面的问题了,前端完全不需要记录这些后端服务的网络位置,前端和后端完全解耦!

二、 什么是consul

  consul是google开源的一个使用go语言开发的服务管理软件。支持多数据中心、分布式高可用的、服务发现和配置共享。采用Raft算法,用来保证服务的高可用。内置了服务注册与发现框架、分布一致性协议实现、健康检查、Key/Value存储、多数据中心方案,不再需要依赖其他工具(比如ZooKeeper等)。服务部署简单,只有一个可运行的二进制的包。每个节点都需要运行agent,他有两种运行模式serverclient 每个数据中心官方建议需要3或5个server节点以保证数据安全,同时保证server-leader的选举能够正确的进行。

  在client模式下,所有注册到当前节点的服务会被转发到server节点,本身是不持久化这些信息。
  在server模式下,功能和client模式相似,唯一不同的是,它会把所有的信息持久化到本地,这样遇到故障,信息是可以被保留的。
  server-leader是所有server节点的老大,它和其它server节点不同的是,它需要负责同步注册的信息给其它的server节点,同时也要负责各个节点的健康监测

  consul提供的一些关键特性:

  • 服务注册与发现:consul通过DNS或者HTTP接口使服务注册和服务发现变的很容易,一些外部服务,例如saas提供的也可以一样注册。
  • 健康检查:健康检测使consul可以快速的告警在集群中的操作。和服务发现的集成,可以防止服务转发到故障的服务上面。
  • Key/Value存储:一个用来存储动态配置的系统。提供简单的HTTP接口,可以在任何地方操作。
  • 多数据中心:无需复杂的配置,即可支持任意数量的区域。
  • 安装consul是用于服务注册,也就是容器本身的一些信息注册到consul里面,其他程序可以通过consul获取注册的相关服务信息,这就是服务注册与发现。

三、consul部署

  3.1 前期准备

服务器IP地址部署程序
consul服务器192.168.10.7运行consul服务、nginx服务、consul-template守护进程      
registrator服务器 192.168.10.10运行registrator容器、运行nginx容器

  3.2 consul服务器

  3.2.1 解压consul压缩包

cd /opt/

unzip consul_0.9.2_linux_amd64.zip

ls

  3.2.2 移动consul到指定目录下,设置代理在后台启动consul服务端

mv consul /usr/local/bin/

 consul agent \
-server \
-bootstrap \
-ui \
-data-dir=/var/lib/consul-data \
-bind=192.168.10.7 \
-client=0.0.0.0 \
-node=consul-server01 &> /var/log/consul.log &

netstat -natp|grep consul

    启动consul后默认会监听5个端口: 

8300replication、leader、farwarding的端口
8301lan cossip的端口
8302wan gossip的端口
8500web ui界面的端口
8600使用dns协议查看节点信息的端口

-server: 以server身份启动。默认是client。


-bootstrap:用来控制一个server是否在bootstrap模式,在一个数据中心中只能有一个server处于bootstrap模式,当一个server处于bootstrap模式时,可以自己选举为server-leader。


-bootstrap-expect=2:集群要求的最少server数量,当低于这个数量,集群即失效。


-ui:指定开启UI界面,这样可以通过http://localhost:8500/ui 这样的地址访问consul自带的web UI界面。


-data-dir:指定数据存储目录。


-bind:指定用来在集群内部的通讯地址,集群内的所有节点到此地址都必须是可达的,默认是0.0.0.0。


-client:指定consul绑定在哪个client地址上,这个地址提供 HTTP、DNS、RPC 等服务,默认是 127.0.0.1。


-node:节点在集群中的名称,在一个集群中必须是唯一的,默认是该节点的主机名。


-datacenter:指定数据中心名称,默认是dc1。 

  3.2.3 网页启动consul

    输入您的IP地址:端口号

  3.2.4 查看集群信息

consul members

consul operator raft list-peers

consul info | grep leader

curl 192.168.10.7:8500/v1/status/peers

curl 192.168.10.7:8500/v1/status/leader

curl 192.168.10.7:8500/v1/catalog/services

curl 192.168.10.7:8500/v1/catalog/nginx

curl 192.168.10.7:8500/v1/catalog/nodes

 

  3.3 registor服务器

  3.3.1 安装Gliderlabs/Registrator

    Gliderlabs/Registrator可检查容器运行状态自动注册,还可注销docker容器的服务到服务配置中心。目前支持Consul、Etcd和SkyDNS2。

docker run -d \
--name=registrator \
--net=host \
-v /var/run/docker.sock:/tmp/docker.sock \
--restart=always \
gliderlabs/registrator:latest \
--ip=192.168.10.10 \
consul://192.168.10.7:8500

解释:

--net=host :把运行的docker容器设定为host网络模式。


-v /var/run/docker.sock:/tmp/docker.sock :把宿主机的Docker守护进程(Docker daemon)默认监听的Unix域套接字挂载到容器中。


--restart=always :设置在容器退出时总是重启容器。


--ip :刚才把network指定了host模式,所以我们指定ip为宿主机的ip。


consul :指定consul服务器的IP和端口。

  3.3.2 测试服务发现功能是否正常

    注意:这里最好一个一个加然后打开网页一个个查看是否添加成功

docker run -itd -p:83:80 --name test-01 -h test01 nginx


docker run -itd -p:84:80 --name test-02 -h test02 nginx


docker run -itd -p:88:80 --name test-03 -h test03 nginx


docker run -itd -p:89:80 --name test-04 -h test04 nginx

docker ps

  3.3.3 验证http和nginx服务是否注册到consul

四、consul-template

  4.1 consul-template定义

  consul-template是基于Consul的自动替换配置文件的应用。consul-template是一个守护进程,用于实时查询consul集群信息,并更新文件系统上任意数量的指定模板,生成配置文件。更新完成以后,可以选择运行shell命令执行更新操作,重新加载Nginx

  consul-template可以查询Consul中的服务目录、Key、Key-values 等。这种强大的抽象功能和查询语言模板可以使consul-template特别适合动态的创建配置文件。例如:创建Apache/Nginx Proxy Balancers 、 Haproxy Backends等。

  4.2 准备template nginx模板文件

  4.2.1 创建文件夹,编辑nginx.ctmpl

mkdir consul

cd consul/

vim nginx.ctmpl

upstream http_backend {
  {{range service "nginx"}}
   server {{.Address}}:{{.Port}};
   {{end}}
}
server {
    listen 8000;
    server_name localhost 192.168.10.7;
    access_log /var/log/nginx/kgc.com-access.log; 
    index index.html index.php;
    location / {
        proxy_set_header HOST $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header Client-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_pass http://http_backend;
    }
}

  4.2.2  安装epel源和nginx

yum install epel-release -y

yum install nginx -y

  4.2.3 编辑nginx配置文件,启动nginx服务

vim /etc/nginx/nginx.conf

ls /var/log/nginx/

systemctl start nginx.service

  4.2.4 解压consul-template

cd /opt/

unzip consul-template_0.19.3_linux_amd64.zip

ls

  4.2.5 移动consul-template到指定目录下,在前台启动template服务

mv consul-template /usr/local/bin/

consul-template --consul-addr 192.168.10.7:8500 \
--template "/opt/consul/nginx.ctmpl:/usr/local/nginx/conf/vhost/kgc.conf:/usr/local/nginx/sbin/nginx -s reload" \
--log-level=info

  4.2.6 进入vhost下,查看配置文件

cd /etc/nginx/vhost/

ls

cat kgc.conf

  4.2.7 查看docker容器,分别进入到1和2下编辑内容

docker ps

  4.2.8 测试

curl http://192.168.10.10:83

curl http://192.168.10.10:84

  4.2.9 新增nginx微服务容器,查看文件内容以及网页是否同步

docker run -itd -p:85:80 --name test-05 -h test05 nginx

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【学习AI-相关路程-工具使用-自我学习-cudavisco-开发工具尝试-基础样例 (2)】

【学习AI-相关路程-工具使用-自我学习-cuda&visco-开发工具尝试-基础样例 (2)】 1、前言2、环境说明3、总结说明4、工具安装0、验证cuda1、软件下载2、插件安装 5、软件设置与编程练习1、创建目录2、编译软件进入目录&创建两个文件3、编写配置文…

Rust Postgres实例

Rust Postgres介绍 Rust Postgres是一个纯Rust实现的PostgreSQL客户端库,无需依赖任何外部二进制文件2。这意味着它可以轻松集成到你的Rust项目中,提供对PostgreSQL的支持。 特点 高性能:Rust Postgres提供了高性能的数据库交互功能&#…

js api part4

其他事件 页面加载事件 外部资源(如图片、外联CSS和JavaScript等)加载完毕时触发的事件 原因:有些时候需要等页面资源全部处理完了做一些事情,老代码喜欢把 script 写在 head 中,这时候直接找 dom 元素找不到。 事件…

获取转转数据,研究完转转请求,tx在算法方面很友好。

本篇文章仅供学习讨论。 文章中涉及到的代码、实例,仅是个人日常学习研究的部分成果。 如有不当,请联系删除。 在研究完阿里的算法以后(其实很难说研究完,还有很多内容没有研究透,只能说暂时告一段落)&…

服务智能化公共生活场景人员检测计数,基于YOLOv5全系列参数模型【n/s/m/l/x】开发构建公共生活场景下人员检测计数识别系统

在当今社会,随着科技的飞速发展,各种智能化系统已广泛应用于各个领域,特别是在人员密集、流动性大的场合,如商场、火车站、景区等,智能人员检测计数系统发挥着至关重要的作用。特别是在特殊时期,如节假日、…

cmake进阶:变量的作用域说明三(从函数作用域方面)

一. 简介 前一篇文章从函数作用域方面学习了 变量的作用域。文章如下: cmake进阶:变量的作用域说明一(从函数作用域方面)-CSDN博客cmake进阶:变量的作用域说明二(从函数作用域方面)-CSDN博客…

C++:多继承虚继承

在C中,虚继承(Virtual Inheritance)是一种特殊的继承方式,用于解决菱形继承(Diamond Inheritance)问题。菱形继承指的是一个类同时继承自两个或更多个具有共同基类的类,从而导致了多个实例同一个…

Problem 5: Whack-A-Mole打地鼠

实战题:打地鼠 内容如附件所示: 测试数据为:1,2,4,8,9,10,11,14 答案为:10,2,4 原始分布: 击打10号 击打2号 击打4号 要求,所示实例解以图示的方式给出,并且5组测试数据都需要测试,…

Labels and Databases for Mac:强大的标签与数据库管理工具

Labels and Databases for Mac是一款集标签制作与数据库管理于一体的强大工具,专为Mac用户打造,旨在提供高效、便捷的标签制作与数据管理体验。 这款软件拥有丰富的内置标签格式,用户可轻松创建各种标签、信封和卡片,满足个性化需…

PopChar for Mac v10.1激活版:特殊字符输入工具

PopChar for Mac是一款专为Mac用户设计的字符输入工具,其简单直观的功能使得查找和插入特殊字符变得轻而易举。 PopChar for Mac v10.1激活版下载 首先,PopChar为Mac提供了访问所有字体字符的能力,包括那些难以通过键盘直接输入的字符。用户只…

STM32编译前置条件配置

本文基于stm32f104系列芯片,记录编程代码前需要的操作: 添加库文件 在ST官网下载标准库STM32F10x_StdPeriph_Lib_V3.5.0,解压后,得到以下界面 启动文件 进入Libraries,然后进入CMSIS,再进入CM3&#xff…

【DevOps】探索Linux命令行世界:深入了解Shell的力量

目录 一、Linux Shell 详细介绍 1. Shell基础概念 2. Shell的功能特性 3. 常用Shell命令与技巧 4. 高级Shell特性与实践 二、常见的Shell及其比较 1. Bash (Bourne Again SHell) 2. Zsh (Z Shell) 3. Fish (Friendly Interactive SHell) 4. Ksh (Korn SHell) 5. Csh …

青春送温暖 立夏寄真情

(通讯员:赵灿飞 图:杨美、孙红浪) 在青春洋溢的五月,为传承中华民族尊老敬老的传统美德,促进当代青年与老人的跨代交流,增强青年的社会责任感和使命感,传递正能量和关爱困难群体…

linux下sd卡的备份与还原

在Ubuntu上制作SD卡备份镜像,你可以使用dd命令。以下是一个基本的步骤和示例代码: 插入SD卡到电脑。确定SD卡设备路径,使用lsblk或sudo fdisk -l命令。确定备份镜像文件的路径。使用dd命令制作备份。 示例代码: bash# 查看连接的…

ubuntu 安装单节点HBase

下载HBase mkdir -p /home/ellis/HBase/ cd /home/ellis/HBase/ wget https://downloads.apache.org/hbase/2.5.8/hbase-2.5.8-bin.tar.gz tar -xvf hbase-2.5.8-bin.tar.gz安装java jdk sudo apt install openjdk-11-jdksudo vim /etc/profileexport JAVA_HOME/usr/lib/jvm/…

(delphi11最新学习资料) Object Pascal 学习笔记---第11章第1节(混合引用中的错误)

11.1.3 混合引用中的错误 ​ 在使用对象时,你通常应该只使用对象变量或接口变量来访问它们。混合使用这两种方法会破坏对象 Pascal 所提供的引用计数机制,并可能导致极难跟踪的内存错误。在实践中,如果你决定使用接口,你可能应该…

windows驱动开发-内核编程技术汇总(五)

使用安全字符串函数 和应用层不一样的是,windows内核完全使用Unicode字符串,许多支持AsciiC的windowsAPI,是在应用层完成项Unicode的切换的。许多系统安全问题是由缓冲区处理不善和生成的缓冲区溢出引起的。 糟糕的缓冲区处理通常与字符串操…

利用super解决问题

1 问题 在继承问题中,我们可以怎么使用super函数呢? 2 方法 super() 函数是用于调用父类(超类)的一个方法,目的是用来解决多重继承时父类的查找问题。Python中类的初始化都是init(), 所以父类和子类的初始化方式都是init(), 但是如果子类初始…

代码随想录算法训练营第56天| 583. 两个字符串的删除操作*、 72. 编辑距离*

583. 两个字符串的删除操作* 力扣题目链接 代码 示例代码 class Solution { public:int minDistance(string word1, string word2) {vector<vector<int>> dp(word1.size() 1, vector<int>(word2.size() 1));for (int i 0; i < word1.size(); i) dp…

代码随想录算法训练营Day12 | 二叉树理论基础、递归遍历、迭代遍历、统一迭代

今日收获&#xff1a; 二叉树的递归遍历二叉树的迭代遍历&#xff0c;中序的迭代法和前、后序不一样二叉树的统一迭代法主要是用了标记法来实现&#xff08;要处理的节点放入栈之后&#xff0c;紧接着放入一个空指针作为标记&#xff09; 二叉树理论基础篇 题目分类 题目分…