【Docker】Docker的服务更新与发现

news2024/11/26 11:34:38

consul

    • 一、服务注册与发现
    • 1. 服务注册与发现的概念
    • 2. 服务发现的机制
  • 二、consul 的概念
    • 1. 什么是 consul
    • 2. consul 的特性
  • 三、consul 的部署
    • 1. consul 服务器架构
    • 2. consul 的部署过程
      • 2.1 环境配置
      • 2.2 consul 服务器
        • 建立 Consul 服务
        • 查看集群信息
        • 通过 http api 获取集群信息
      • 2.3 registrator 服务器
        • 容器服务自动加入 Nginx 集群
      • 2.4 consul-template
        • 安装nginx
        • 准备 template nginx 模板文件
        • 配置并启动 template
        • 访问 template-nginx
        • 增加一个 nginx 容器节点
      • 2.5 consul 多节点
  • 总结
    • 1. consul 服务自动发现和注册
    • 2. consuld 模式
    • 3. consuld 的命令


一、服务注册与发现

1. 服务注册与发现的概念

  服务注册与发现是微服务架构中不可或缺的重要组件。

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

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

2. 服务发现的机制

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

二、consul 的概念

1. 什么是 consul

  consul是google开源的一个使用go语言开发的服务管理软件。支持多数据中心、分布式高可用的、服务发现和配置共享。采用Raft算法,用来保证服务的高可用。内置了服务注册与发现框架、分布一致性协议实现、健康检查、Key/Value存储、多数据中心方案,不再需要依赖其他工具(比如ZooKeeper等)。

  服务部署简单,只有一个可运行的二进制的包。每个节点都需要运行agent,他有两种运行模式server 和 client。 每个数据中心官方建议需要3或5个server节点以保证数据安全,同时保证server-leader的选举能够正确的进行。

在client模式下,所有注册到当前节点的服务会被转发到server节点,本身是不持久化这些信息。

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

在这里插入图片描述

2. consul 的特性

  服务注册与发现:consul通过DNS或者HTTP接口使服务注册和服务发现变的很容易,一些外部服务,例如SAAS提供的也可以一样注册。

  健康检查:健康检测使consul可以快速的告警在集群中的操作。和服务发现的集成,可以防止服务转发到故障的服务上面。

  Key/Value存储:一个用来存储动态配置的系统。提供简单的HTTP接口,可以在任何地方操作。

  多数据中心:无需复杂的配置,即可支持任意数量的区域。

  安装consul是用于服务注册,也就是容器本身的一些信息注册到consul里面,其他程序可以通过consul获取注册的相关服务信息,这就是服务注册与发现。

三、consul 的部署

1. consul 服务器架构

  consul template:基于consul的注册信息自动根据文件模板生成配置文件并替换;

  nginx:代理服务器、负载均衡器,根据consul template生成的配置进行代理转发;

  consul server/consul agent:收集自动发现的信息,将所有需要注册的信息持久化本地可以通过server-leader将注册信息同步给其它server节点,以及对各个server节点做健康检查;

  registrator:发现应用的网络位置,发送给consul server/client的自动发现模块进行注册。

2. consul 的部署过程

2.1 环境配置

consul服务器			192.168.145.60		运行consul服务、nginx服务、consul-template守护进程
registrator服务器		192.168.145.75		运行registrator容器、运行nginx容器
#关闭防火墙
systemctl stop firewalld.service
setenforce 0

在这里插入图片描述

2.2 consul 服务器

建立 Consul 服务

cd /opt/
unzip consul_0.9.2_linux_amd64.zip
mv consul /usr/local/bin/
consul version				#查看版本

在这里插入图片描述

#设置代理,在后台启动 consul 服务端
consul agent \
-server \
-bootstrap \
-ui \
-data-dir=/var/lib/consul-data \
-bind=192.168.145.60 \
-client=0.0.0.0 \
-node=consul-server01 &> /var/log/consul.log &
----------------------------------------------------------------------------------------------------------
-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。
----------------------------------------------------------------------------------------------------------
netstat -lntp | grep consul

在这里插入图片描述

启动consul后默认会监听5个端口:
8300:集群内数据的读写和复制
8301:单个数据中心gossip协议通讯
8302:跨数据中心gossip协议
8500:提供获取服务列表、注册服务、注销服务等HTPP接口;提供UI服务
8600:采用DNS协议服务发现功能

查看集群信息

#查看members状态
consul members
Node             Address              Status  Type    Build  Protocol  DC
consul-server01  192.168.145.60:8301  alive   server  0.9.2  2         dc1


#查看集群状态
consul operator raft list-peers
Node             ID                   Address              State   Voter  RaftProtocol
consul-server01  192.168.145.60:8300  192.168.145.60:8300  leader  true   2

consul info | grep leader
	leader = true
	leader_addr = 192.168.145.60:8300

在这里插入图片描述

通过 http api 获取集群信息

curl 192.168.145.60:8500/v1/status/peers 			#查看集群server成员
curl 192.168.145.60:8500/v1/status/leader			#集群 server-leader
curl 192.168.145.60:8500/v1/catalog/services		#注册的所有服务
curl 192.168.145.60:8500/v1/catalog/nginx			#查看 nginx 服务信息
curl 192.168.145.60:8500/v1/catalog/nodes			#集群节点详细信息

在这里插入图片描述

2.3 registrator 服务器

容器服务自动加入 Nginx 集群

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

#安装 Gliderlabs/Registrator
docker pull gliderlabs/registrator:latest
docker images

在这里插入图片描述

docker run -d \
--name=registrator \
--net=host \
-v /var/run/docker.sock:/tmp/docker.sock \
--restart=always \
gliderlabs/registrator:latest \
--ip=192.168.145.75 \
consul://192.168.145.60: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和端口。
----------------------------------------------------------------------------------------------------------

在这里插入图片描述

#测试服务发现功能是否正常
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 httpd
docker run -itd -p:89:80 --name test-04 -h test04 httpd				#-h:设置容器主机名

在这里插入图片描述

#验证 http 和 nginx 服务是否注册到 consul
浏览器中,输入 http://192.168.145.60:8500,在 Web 页面中“单击 NODES”,然后单击“consurl-server01”,会出现 5 个服务。

#在consul服务器使用curl测试连接服务器
curl 192.168.145.60:8500/v1/catalog/services 
{"consul":[],"httpd":[],"nginx":[]}

在这里插入图片描述

在这里插入图片描述

2.4 consul-template

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

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

安装nginx

yum install -y nginx
systemctl start nginx

在这里插入图片描述

准备 template nginx 模板文件

mkdir /opt/consul/
vim /opt/consul/nginx.ctmpl
#定义nginx upstream一个简单模板
upstream http_backend {
   {{range service "nginx"}}
   server {{.Address}}:{{.Port}};
   {{end}}
}
#定义一个server,监听8000端口,反向代理到upstream
server {
    listen 8000;
    server_name localhost 192.168.145.75;
    access_log /var/log/nginx/test.com-access.log;					#修改日志路径
    index index.html index.php;
    location / {
    	proxy_pass http://http_backend;
        proxy_set_header HOST $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

在这里插入图片描述

配置并启动 template

cd /opt/
unzip consul-template_0.19.3_linux_amd64.zip
mv consul-template /usr/local/bin/
#在前台启动 template 服务,启动后不要按 ctrl+c 中止 consul-template 进程。
consul-template --consul-addr 192.168.145.60:8500 \
--template "/opt/consul/nginx.ctmpl:/etc/nginx/conf.d/test.conf:/usr/sbin/nginx -s reload" \
--log-level=info			#日志类型

在这里插入图片描述

#另外打开一个终端查看生成配置文件
vim /etc/nginx/conf.d/test.conf
upstream http_backend {

   server 192.168.145.75:83;

   server 192.168.145.75:84;

}
server {
    listen 8000;
    server_name localhost 192.168.145.60;
    access_log /var/log/nginx/test.com-access.log;
    index index.html index.php;
    location / {
        proxy_pass http://http_backend;
        proxy_set_header HOST $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

在这里插入图片描述

访问 template-nginx

docker ps -a
CONTAINER ID   IMAGE                           COMMAND                  CREATED       STATUS          PORTS                NAMES
9f0dc08956f4   httpd                           "httpd-foreground"       1 hours ago   Up 1 hours      0.0.0.0:89->80/tcp   test-04
a0bde07299da   httpd                           "httpd-foreground"       1 hours ago   Up 1 hours      0.0.0.0:88->80/tcp   test-03
4f74d2c38844   nginx                           "/docker-entrypoint.…"   1 hours ago   Up 1 hours      0.0.0.0:84->80/tcp   test-02
b73106db285b   nginx                           "/docker-entrypoint.…"   1 hours ago   Up 1 hours      0.0.0.0:83->80/tcp   test-01
409331c16824   gliderlabs/registrator:latest   "/bin/registrator -i…"   1 hours ago   Up 1 hours                        registrator

docker exec -it c1213e897f6f bash
echo "this is test1 web" > /usr/share/nginx/html/index.html

docker exec -it 2f2919cd2bc9 bash
echo "this is test2 web" > /usr/share/nginx/html/index.html

在这里插入图片描述

浏览器访问:http://192.168.145.90:8000/ ,并不断刷新。

在这里插入图片描述

增加一个 nginx 容器节点

#增加一个 nginx 容器节点,测试服务发现及配置更新功能。
docker run -itd -p:85:80 --name test-05 -h test05 nginx

#观察 template 服务,会从模板更新/etc/nginx/conf.d/test.conf 文件内容,并且重载 nginx 服务。

在这里插入图片描述

#查看/etc/nginx/conf.d/test.conf 文件内容
cat /etc/nginx/conf.d/test.conf
upstream http_backend {

   server 192.168.145.75:83;
   
   server 192.168.145.75:84;
   
   server 192.168.145.75:85;

}

在这里插入图片描述

#查看三台 nginx 容器日志,请求正常轮询到各个容器节点上
docker logs -f test-01
docker logs -f test-02
docker logs -f test-05

在这里插入图片描述

2.5 consul 多节点

#添加一台已有docker环境的服务器192.168.145.75/24加入已有的群集中
consul agent \
-server \
-ui \
-data-dir=/var/lib/consul-data \
-bind=192.168.145.75 \
-client=0.0.0.0 \
-node=consul-server02 \
-enable-script-checks=true  \
-datacenter=dc1  \
-join 192.168.145.60 &> /var/log/consul.log &
------------------------------------------------------------------------
-enable-script-checks=true :设置检查服务为可用
-datacenter : 数据中心名称
-join :加入到已有的集群中
------------------------------------------------------------------------

在这里插入图片描述

#查看members状态
consul members

#查看集群状态
consul operator raft list-peers

在这里插入图片描述

总结

1. consul 服务自动发现和注册

#解决什么问题?
如果后端应用服务器集群节点数量很多,负载均衡器配置和管理非常麻烦的问题
(节点配置条目数量众多,后端节点的网络位置发生变化,还需要修改所有使用这些后端节点的负载均衡器配置的问题)。

2. consuld 模式

client模式:负责转发注册信息给server节点,没有持久化能力
server模式:在server节点之间同步注册信息,持久化注册信息
server-leader节点:负责转发注册信息给其他server节点,对各节点监控检查

3. consuld 的命令

#consul启动命令
consul agent -server -bootstrap -ui -data-dir=数据目录 -bind=consul内部通信IP -client=consul外部通信IP -node=节点名称 &> /var/log/consul.log &

#registrator启动命令
docker run -d --name=registrator --net=host -v /var/run/docker.sock:/tmp/docker.sock --restart=always gliderlabs/registrator:latest \
--ip=registrator服务器IP  consul://consul服务器IP:8500

#consul-template启动命令
consul-template --consul-addr consul服务器IP:8500 --template "consul-template模板文件路径:生成的配置文件路径:应用程序重载命令" --log-level=info

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

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

相关文章

Jenkins 安装构建

一、CentOS 安装 1. 使用该存储库 sudo wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo sudo rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io-2023.key 2. 安装 Java yum install fontconfig java-11-openjdk配…

聚焦APP开发:理解并预防常见的安全问题

移动应用程序是我们日常生活中不可或缺的一部分,它帮助我们处理信息,完成任务,甚至更多。因此,移动应用程序在我们日常生活中的重要性是毋庸置疑的。随着越来越多的人使用智能手机和平板电脑进行工作和娱乐,移动应用程…

项目管理系统软件有哪些?别错过!这款超好用!(免费试用)

如今,很多企业都面临着复杂的业务流程和庞大的项目数量,为了更好地管理和协调这些项目,企业需要一个高效的项目管理系统。然而,传统的项目管理系统已经无法满足企业的需求了。 企业需要一种新型的项目管理系统来应对这些挑战。一…

Spring Cloud【SkyWalking网络钩子Webhooks、SkyWalking钉钉告警、SkyWalking邮件告警】(十六)

目录 分布式请求链路追踪_SkyWalking网络钩子Webhooks 分布式请求链路追踪_SkyWalking钉钉告警 分布式请求链路追踪_SkyWalking邮件告警 分布式请求链路追踪_SkyWalking网络钩子Webhooks Wbhooks网络钩子 Webhok可以简单理解为是一种Web层面的回调机制。告警就是一个事件&a…

mybatisPlus进阶篇

文章目录 映射自动映射规则表映射字段映射字段失效视图属性 条件构造器条件构造器介绍 等值查询eqallEqne 范围查询gtge(>)lt(<)le(<)betweennotBetween 模糊查询likenotLikelikeLeftlikeRight 判空查询isNullisNotNull 包含查询innotIninSqlnotInSql 分组查询groupBy…

【Java基础教程】(四十七)网络编程篇:网络通讯概念,TCP、UDP协议,Socket与ServerSocket类使用实践与应用场景~

Java基础教程之网络编程 &#x1f539;本节学习目标1️⃣ 网络编程的概念&#x1f50d; TCP和 UDP协议 2️⃣ Socket 与ServerSocket 类3️⃣ 网络编程实战——Echo 程序4️⃣ 应用场景&#x1f33e; 总结 &#x1f539;本节学习目标 了解多线程与网络编程的操作关系&#xff…

JavaWeb黑马程序员——数据库相关概念

本文前提 这是黑马程序员JavaWeb视频里的笔记资源&#xff0c;我只是照搬过来以便于日后复习。 视频链接&#xff1a;https://www.bilibili.com/video/BV1Qf4y1T7Hx?p3&vd_sourced4bb8e491e28c81c780f2db9d6123a41 MySQL基础 今日目标&#xff1a; 完成MySQL的安装及登…

如何利用JMeter测试带有Token参数的POST接口

JMeter有一个很强大的功能就是可以用来做接口测试。 接口测试是测试系统组件间接口的一种测试。接口测试主要用于检测外部系统与系统之间以及内部各个子系统之间的交互点。测试的重点是要检查数据的交换&#xff0c;传递和控制管理过程&#xff0c;以及系统间的相互逻辑依赖关系…

如何将路径字符串数组(string[])转成树结构(treeNode[])?

原文链接&#xff1a;如何将路径字符串数组(string[])转成树结构(treeNode[])&#xff1f; 需求 这里的UI使用的是Element-Plus。 将一个路径字符串数组&#xff08;当然也可能是其他目标字符串数组&#xff09;&#xff0c;渲染成树。 /*source:/a/b/c/d/e/a/b/e/f/g/a/b/h/a…

深入浅出对话系统——闲聊对话系统

引言 闲聊对话系统也很多别名 聊天机器人ChatbotSocial ChatbotChit-chat botConversational AI开放领域对话系统 实现方法 现在闲聊对话系统一般有两种主要的实现方法 检索式对话系统生成式对话系统 可以任务闲聊对话系统也是一个函数 y f ( x ) yf(x) yf(x)&#xff0…

6-Linux的磁盘分区和挂载

Linux的磁盘分区和挂载 Linux分区查看所有设备的挂载情况 将磁盘进行挂载的案例增加一块磁盘的总体步骤1-在虚拟机中增加磁盘2- 分区3-格式化分区4-挂载分区5-进行永久挂载 磁盘情况查询查询系统整体磁盘使用情况查询指定目录的磁盘占用情况 磁盘情况-工作实用指令统计文件夹下…

【Docker】Docker网络之五大网络模式

Docker网络 1.Docker网络2.Docker的网络模式3.网络模式详解3.1 host模式3.2 container模式3.3 none模式3.4 bridge模式3.5 自定义网络模式 4.docker网络模式知识点总结 1.Docker网络 Docker网络实现原理 Docker使用Linux桥接&#xff0c;在宿主机虚拟一个Docker容器网桥(dock…

Cesium态势标绘专题-圆角矩形(标绘+编辑)

标绘专题介绍:态势标绘专题介绍_总要学点什么的博客-CSDN博客 入口文件:Cesium态势标绘专题-入口_总要学点什么的博客-CSDN博客 辅助文件:Cesium态势标绘专题-辅助文件_总要学点什么的博客-CSDN博客 本专题没有废话,只有代码,代码中涉及到的引入文件方法,从上面三个链…

RNN架构解析——传统RNN模型

目录 传统RNN的内部结构图使用RNN优点和缺点 传统RNN的内部结构图 使用RNN rnnnn.RNN(5,6,1) #第一个参数是输入张量x的维度&#xff0c;第二个是隐藏层维度&#xff0c;第三层是隐藏层的层数 input1torch.randn(1,3,5) #第一个是输入序列的长度&#xff0c;第二个是批次的样本…

FPGA设计时序分析二、建立/恢复时间

目录 一、背景知识 1.1 理想时序模型 1.2 实际时序模型 1.2.1 时钟不确定性 1.2.2 触发器特性 二、时序分析 2.1 时序模型图 ​2.2 时序定性分析 一、背景知识 之前的章节提到&#xff0c;时钟对于FPGA的重要性不亚于心脏对于人的重要性&#xff0c;所有的逻辑运算都离开…

[start] m40 test

software & update 470 drive version # cd /etc/apt # mv sources.list sources.list.bak # sudo vi /etc/apt/sources.list # 默认注释了源码镜像以提高 apt update 速度&#xff0c;如有需要可自行取消注释 deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ ja…

供应商管理平台:高效整合资源,提升供应链效能

随着全球市场竞争的不断升级&#xff0c;企业对供应商管理的重要性越来越重视。而供应商管理平台作为一种高效整合资源、提升供应链效能的工具&#xff0c;对于企业来说意义深远。本文将围绕供应商管理平台的概念、优势以及应用&#xff0c;探讨其在提升供应商管理和优化供应链…

面向对象编程:多态性的理论与实践

文章目录 1. 修饰词和访问权限2. 多态的概念3. 多态的使用现象4. 多态的问题与解决5. 多态的意义 在面向对象编程中&#xff0c;多态是一个重要的概念&#xff0c;它允许不同的对象以不同的方式响应相同的消息。本文将深入探讨多态的概念及其应用&#xff0c;以及在Java中如何实…

Docker 网络端口映射 四大网络模式

Docker 网络端口映射 Docker 网络实现原理 Docker使用Linux桥接&#xff0c;在宿主机虚拟一个Docker容器网桥(docker0)&#xff0c;Docker启动一个容器时会根据Docker网桥的网段分配给容器一个IP地址&#xff0c;称为Container-IP&#xff0c;同时Docker网桥是每个容器的默认网…

爆肝整理,接口测试方法总结+常问面试题(答案)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 理想的测试流程 …