【Docker六】Docker-consul

目录

一、docker-consul概述

1、服务注册和发现:

1.1、服务注册和发现概念

1.2、服务注册和发现工作机制:

1.3、服务注册与发现的优点:

2、docker-consul概念

2.1、consul的主要特点:

二、consul架构部署:

1、consul服务器配置

1.1、架构:三台服务器:

1.2、consul安装:

1.3、相关端口:

2、检查consul集群相关命令:

3、集群自动发现和注册

3.1、启动consul server

3.2、检测自动发现和注册

4、配置consul-template

4.1、 准备 template nginx 模板文件

4.2、docker1安装nginx:

4.3、配置nginx

4.4、配置并启动 template

4.5、配置并运行template-nginx

4.6、访问template-nginx

5、实现consul的多节点:


一、docker-consul概述

1、服务注册和发现:

1.1、服务注册和发现概念

什么叫做微服务(容器)的注册与发现?

是一种分布式管理系统,定位服务的方法。

在传统的架构中,应用程序之间是直连到已知的服务,由设备提供的网络:IP地址,基于tcp/ip协议的端口

由于现代微服务部署,服务的动态性,数量增加了,传统的基于ip+端口的形式已经不太适用。所以有了服务注册和发现。

微服务的位置信息(ip+端口+健康状态)统一注册到一个中心化的服务注册表中。可以允许其他服务动态的查询和发现这些服务

服务发现和注册时微服务架构中非常重要的组件

1.2、服务注册和发现工作机制:
  1. 服务注册:当一个服务启动时,会把自己的元数据(ip、端口、服务名称、健康状态)注册到服务注册表中。这个注册表的服务(consul,zookeeper)。也可以在云平台部署
  2. 服务发现:其他服务需要和这个服务通信时,只需要向注册表查询服务位置信息(ip+端口),这样的话可以直接在服务注册表中,直接获取我要的信息,不需要到静态配置查看

1.3、服务注册与发现的优点:
  1. 动态性:可以在运行时动态添加和移除服务,不需要额外的人工操作和配置。
  2. 弹性:一旦某个服务不可用,服务注册表可以及时更新,通知其他服务避免请求的失败。
  3. 可扩展:可以适应不断变化的服务数量
  4. 透明性:服务方调用时,透明性,前端和后端实现解耦

服务注册和发现机制与其他工具配置使用,如负载均衡、健康检查、配置管理(一键同步)

2、docker-consul概念

docker-consul:容器的自动发现与注册

docker-consul的核心就是发现,微服务,可以动态的管理

docker-consul的作用查、看。元数据:ip、端口、健康状态、服务名称

consul:服务注册和发现工具

consul是HashiCrop公司开发的一套工具,用于实现服务发现与注册,配置管理,分布式的系统协调

2.1、consul的主要特点:
  1. 服务发现与自动注册,位置信息(ip+端口+服务名称)
  2. 健康检查,服务注册到consul中,一并加入系统的还有他的健康状态,定期发送一个心跳检查,如果服务挂了,consul会自动移除
  3. 分布式锁:consul提供了一个分布式锁的功能,协调多个节点之间的操作,防止竞争条件和数据冲突

每一个服务的发现与注册都是一个会话,session。

创建锁:微服务1在注册到consul的时候,consul会和服务的会话创建一个锁,锁用来标识具体的服务会话和锁之间相关联

获取锁:微服务2,建立会话,获取锁,如果申请的锁没有被使用,客户端成功获取,如果已经存在,表示已有其他服务在占用,会给你分配一个新的锁(KV存储)

释放锁:任务完成或者服务断开了连接,会把锁释放,删除会话和锁之间的关系。删除与锁关联的键。实现资源的释放

  1. KV存储:key-value分布式键值对存储系统,存储配置信息、锁、特性等。应用程序可以使用consul的键值对信息来动态的获取配置信息
  2. 多数据中心支持,consul可以在多个地域部署,可以实现数据中心之间的发现和注册功能。
  3. DNS和http的API:consul支持DNS接口,通过域名解析定位服务的位置。http api:通过api应用接口,可以调用consul的信息,服务信息,健康检查等
  4. 事件通知,如果关键信息可以随时获取通知。

二、consul架构部署:

1、consul服务器配置

1.1、架构:三台服务器:

consul服务器:Docker1:20.0.0.51 consul Docker-ce nginx(二进制部署) consul-template(自动发现和部署)

registrator服务器:Docker2:20.0.0.52 运行注册机制和微服务(容器服务)

consul服务器:多节点服务器 Docker3 20.0.0.28(加入到consul集群中)

1.2、consul安装:

consul agent \
-server \
-bootstrap \
-ui \
-data-dir=/var/lib/consul-data \
-bind=20.0.0.51 \
-client=0.0.0.0 \
-node=consul-server01 &> /var/log/consul.log &
consul agent:开启监听服务
-server:指定集群中的服务器节点,consul的RAFT算法实现分布式结构中节点的一致性。集群的成员,直接成为集群的leader,后续加入的服务器都是follower
-bootstrap:表示该节点是引导节点,引导选举过程,以及为后续加入的server做引导,加入集群
-ui:启动图形化界面
-data-dir=/var/lib/consul-data:consul存储数据的路径
-bind=20.0.0.51:服务器绑定的IP地址,节点中通信
-client=0.0.0.0:客户端的地址,所有主机都可以server建立通信(生产中是指定的服务器)
-node=consul-server01:指定consul节点的名称,在集群中consul节点的名称都是唯一的,不可重复
&> /var/log/consul.log:混合重定向输出到consul.log
&:后台运行

1.3、相关端口:
8300:RAFT协议端口,保持分布式集群的一致性,端口处理复制和领导者选举
8301:LAN Gossip的端口,局域网内部进行节点通信和信息传播的协议
8302:WAN Gossip的端口,广域网内部节点的通信和信息传播协议
8500:web ui的端口,用来访问consul的图形化界面
8600:DNS解析端口

2、检查consul集群相关命令:

consul members
集群信息
consul operator raft list-peers
查看集群状态
curl 127.0.0.1:8500/v1/status/peers
查看集群的server成员
curl 127.0.0.1:8500/v1/status/leader
查看集群的领导者
curl 127.0.0.1:8500/v1/catalog/services
查看已经被集群发现和注册的服务
curl 127.0.0.1:8500/v1/catalog/nodes
查看集群节点的详细信息

3、集群自动发现和注册

3.1、启动consul server
docker run -d \
--name=registrator \
-v /var/run/docker.sock:/tmp/docker.sock \
--restart=always \
gliderlabs/registrator:latest \
--ip=20.0.0.52 \
consul://20.0.0.51:8500 -v /var/run/docker.sock:/tmp/docker.sock :指定挂载卷
docker.sock是docker守护进程的Unix的套接字文件,把他映射到容器当中,registrator容器可以监听docker的所有事件,并且完成自动注册服务
--ip=20.0.0.52:注册在consul的IP地址
consul://20.0.0.51:8500 :所有发现的服务都会注册到指定的server节点

3.2、检测自动发现和注册

docker run -itd -p 81:80 --name test-1 -h test1 nginx

docker run -itd -p 82:80 --name test-2 -h test2 httpd

docker run -itd -p 83:80 --name test-3 -h test3 nginx

-h指定容器里的主机名

去浏览器访问consul:

20.0.0.51:8500 查看被监测的节点

consul-template:实现配置管理自动化

用于consul集成,自动更新配置文件,实现噢诶之管理的自动化

作用:

1、动态的配置更新。consul-template监听consul中key-value的存储键值对,键值对发生变化会自动的更新配置文件,无需重启服务

2、支持多种后端的模版:nginx配置、ETCD等等

4、配置consul-template

consul-template:

自动化管理配置文件的工具,获取consul中注册的服务信息,可以自动的添加到配置文件中,即使生效无需重启服务

做到自动化更新配置文件

4.1、 准备 template nginx 模板文件

vim /opt/consul/nginx.ctmpl

upstream test1 {{{range service "nginx"}}server {{.Address}}:{{.Port}};{{end}}
}server {listen 8000;server_name localhost 20.0.0.51;access_log /var/log/nginx/test1-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;
}
}

在这个配置当中,test1的反向代理的方法会遍历由consul注册的所有服务名称为nginx的服务

server {{.Address}}:{{.Port}};  将发现和注册的nginx服务的IP地址和端口,添加到test1的upstream方法当中

4.2、docker1安装nginx:
1、安装依赖包
yum -y install pcre-devel zlib-devel gcc gcc-c++ make2、创建运行用户
useradd -M -s /sbin/nologin nginx3、编译安装
cd /opt
tar zxvf nginx-1.22.0.tar.gz -C /opt/cd nginx-1.22.0/
./configure \
--prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-http_stub_status_modulemake && make install4、优化路径
ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/5、添加 Nginx 系统服务
vim /lib/systemd/system/nginx.service
[Unit]
Description=nginx
After=network.target
[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true
[Install]
WantedBy=multi-user.targetchmod 754 /lib/systemd/system/nginx.service
systemctl start nginx.service
启动nginx 查看端口

4.3、配置nginx

改nginx的配置文件

18行

创建虚拟主机目录
mkdir /usr/local/nginx/conf/vhost
创建日志文件目录
mkdir /var/log/nginx
停止nginx
nginx -s stop 
启动nginx
nginx

4.4、配置并启动 template
unzip consul-template_0.19.3_linux_amd64.zip -d /opt/
cd /opt/
mv consul-template /usr/local/bin/

4.5、配置并运行template-nginx

docker1运行template

consul-template --consul-addr 20.0.0.51:8500 \
--template "/opt/consul/nginx.ctmpl:/usr/local/nginx/conf/vhost/test.conf:/usr/local/nginx/sbin/nginx -s reload" \
--log-level=infoconsul-template --consul-addr 20.0.0.51:8500 指定consul的地址,告诉 consul-template从server节点获取数据
template "/opt/consul/nginxctmpl:/usr/local/nginx/vhost/test.conf:/usr/local/nginx/sbin/nginx -s reload"
/opt/consul/nginx.ctmpl:配置文件的模版位置
/usr/local/nginx/vhost/test.conf:基于模版生成配置文件的位置
/usr/local/nginx/sbin/nginx -s reload" 只要集群中服务发生变化,可以随时更新到配置文件中
--log-level=info	设置consul-template的日志级别为info

开个docker1终端,看日志

var/log/consul.log

consul是一个中间件:nginx服务通过consul-template获取模版,反向代理,consul-template——consul来获取注册服务的ip和端口然后nginx调用nginx调用发现的服务来实现负载均衡

template——本机nginx——调用容器nginx,实现负载均衡

4.6、访问template-nginx
docker exec -it test-1 bash
echo "this is test1 web" > /usr/share/nginx/html/index.htmldocker exec -it test-3 bash
echo "this is test2 web" > /usr/share/nginx/html/index.html

浏览器访问:http://20.0.0.51:8000/ ,并不断刷新。实现轮询

自动生成的配置文件在

/usr/local/nginx/conf/vhost/test.conf

5、实现consul的多节点:

consul的多节点:一旦选举出了leader,后续的服务器都是follower。server的名称不能重复,唯一,但是在一个数据中心上

docker3安装consul

docker3添加到consul集群中去:

consul agent \
-server \
-ui \
-data-dir=/var/lib/consul-data \
-bind=20.0.0.28 \
-client=0.0.0.0 \
-node=consul-server02 \
-enable-script-checks=true \
-datacenter=dc1 \
-join 20.0.0.51 &> /var/log/consul.log &

-enable-script-checks=true \
设置检查服务为可用,他也可以发现原集群当中的服务
-datacenter=dc1 \
加入到docker1的数据中心
-join 20.0.0.51加入到已有的集群中

consul members
consul operator raft list-peers

在docker2上执行:

让docker3也监控docker2上的容器

docker run -d \
> --name=registrator2 \
> -v /var/run/docker.sock:/tmp/docker.sock \
> --restart=always \
> gliderlabs/registrator:latest \
> --ip=20.0.0.52 \
> consul://20.0.0.28:8500

浏览器consul查看:

http://20.0.0.51:8500/

脱离集群:

consul leave

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

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

相关文章

构建强大应用的引擎:深度解析Spring Boot Starter机制

目录 引言1. Spring Boot Starter机制1.1 什么是Spring Boot Starter1.2 为什么要使用Spring Boot Starter1.3.应用场景1.4.自动加载核心注解说明 2. 综合案例配置类制作控制功能实现 总结 引言 在当今互联网时代,构建高性能、可维护的应用已成为开发者的首要任务。…

ArcGIS Pro SDK 将几何输出为要素

需求: 在获取到一个几何(geometry)的数据,我们需要将其输出为要素 解决方案: 1.创建要素 2.将几何写进要素中 //构建面几何 ArcGIS.Core.Geometry.Polygon mfGeoPolygon new PolygonBuilderEx(mfGeoList, mapFra…

利用有限制通配符来提升API的灵活性

在Java中,有限制通配符(bounded wildcard)允许你在泛型中指定一个范围,从而提升API的灵活性。通配符使得你能够编写更通用、适用于多种类型的代码。以下是一个利用有限制通配符提升API灵活性的例子: 假设有一个简单的…

x86上运行LoongArch的环境

很多朋友只有x86的系统,因为我们上学时代和工作机大部分都x86系统。loongson推出LoongArch指令集后,也想尝尝鲜或者作为一个开发者又不想买新的机器,此时就可以用到我下边为大家介绍的方法。 此处也给大家提供一个debian社区发布的官方的文档…

QT笔记(节选)具体图片等下载资源

QT笔记(节选)具体图片等下载资源 根据b站视频做的笔记: https://www.bilibili.com/video/BV1g4411H78N?p44&spm_id_frompageDriver&vd_sourcea3e6a48ccd3d7d1f969f662653ed68c9 qt是一个跨平台的c图形用户界面应用程序框架&#x…

js获取浏览器指纹

需要移入crypto-js-4.0.0.min.js 官方文档:https://cryptojs.gitbook.io/docs/ github:https://github.com/brix/crypto-js finger: function () {// 获取浏览器 User Agent 信息var userAgent navigator.userAgent;// 获取浏览器 Accept Headers 信息…

Linux 命令

记录一下用到的很有用的Linux 命令: grep指定内容并显示前后若干行 grep -A 10 ‘xxx’ test.log //打印匹配行的后10行 grep -B 10 ‘xxx’ test.log//打印匹配行的前10行 grep -10 ‘xxx’ test.log//打印匹配行的前后10行 或 grep -C 10 ‘xxx’ test.log//打印…

【最新版】PyCharm基础调试功能详解

文章目录 一、断点1. 断点的类型a. 行断点b. 异常断点 2. 设置断点a. 设置行断点b. 设置异常断点 3. 管理断点a. 删除断点b. 将断点静音 二、调试功能0. 测试代码1. 设置断点2. 调试的多种启动方式3. 观察调试控制台a. 步过b. 步入c. 单步执行代码d. 步出e. 运行到光标处f. 重新…

LVS简介及LVS-NAT负载均衡群集的搭建

目录 LVS群集简介 群集的含义和应用场景 性能扩展方式 群集的分类 负载均衡(LB) 高可用(HA) 高性能运算(HPC) LVS的三种工作模式 NAT 地址转换 TUN IP隧道 IP Tunnel DR 直接路由 Direct Rout…

【fabrc.js】 操作鼠标自由绘制图形:矩形、圆形、直线等图形【画图功能】

前言: 在图形编辑器类型的项目当中,通过键盘触发想要绘制的图形类型,然后通过鼠标在fabric画布上自由绘制你想需要的内容。从画基本的矩形、圆形、直线、文本、三角形、折线等功能中,可以扩展出“钢笔path贝塞尔路径”、“多图形组…

Leaflet.Graticule源码分析以及经纬度汉化展示

目录 前言 一、源码分析 1、类图设计 2、时序调用 3、调用说明 二、经纬度汉化 1、改造前 2、汉化 3、改造效果 总结 前言 在之前的博客基于Leaflet的Webgis经纬网格生成实践中,已经深入介绍了Leaflet.Graticule的实际使用方法和进行了简单的源码分析。认…

鸿蒙小车之多任务调度实验

说到鸿蒙我们都会想到华为mate60:遥遥领先!我们一直领先! 我们这个小车也是采用的是鸿蒙操作系统,学习鸿蒙小车,让你遥遥领先于你的同学。 文章目录 前言一、什么是任务?为什么要有任务二、任务的状态三、任…

AI影响谷歌正在推出新的人工智能模型,用于医疗保健。以下是医生如何使用它们的介绍

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

FreeSWITCH rtp endpoint recvonly

查了下rtp.c的源码,远端端口为0就意味着recvonly,但其实不然,调用switch_rtp_new会马上返回失败 经过反复测试,增加下面几行代码之后终于变成了recvonly: tech_pvt->mode RTP_RECVONLY; rtp_flags[SWITCH_RTP_FLAG_AUTOADJ];…

flutter Pageview组件

PageView组件说明 组件说明PageView,PageController的源码简单demo 组件说明 属性说明scrollDirection滑动反向 Axis.vertical上下滑动 Axis.horizontal左右滑动reverse是否反转 true从最后一个记0controllerPageController见下文physics滚动方式pageSnapping是否有…

ad23如何分层打印SCH、PCB的pdf文件

执行快捷键F --> M --> N --> N --> 选择所需的SCH和PCB --> Next --> Export a Bill of Materials(勾选会打印物料清单) --> Next --> 空白区右键 --> Create Final --> YES --> 可以根据层进行输出 --> 根据需要删…

彻底搞清楚多线程编程

很多时候在主线程中运行的程序需要一个while true,但是这样会导致程序整体上非常庞大,引入多线程来减少主线程的内容,同时也能顺利的实现功能,还有一个问题在于多线程还可以一定程度上减少全局变量(但是也是需要反复运…

Python 自动化之收发邮件(二)

发邮件之Windows进程监控 文章目录 发邮件之Windows进程监控前言一、基本内容二、基本结构三、库模块四、函数模块1.进程监控2.邮件发送 五、程序运行模块1.获取时间2.用户输入3.进程监控3.1进程启动发邮件3.2进程停止发邮件 总结 前言 上一篇简单写了一下如何进行邮件的收发操…

如何正确理解和使用 Golang 中 nil ?

目录 指针中的 nil 切片中的 nil map 中的 nil 通道中的 nil 函数中的 nil 接口中的 nil 避免 nil 相关问题的最佳实践 小结 在 Golang 中,nil 是一个预定义的标识符,在不同的上下文环境中有不同的含义,但通常表示“无”、“空”或“…

LeetCode 2415. 反转二叉树的奇数层:深度优先搜索(DFS)

【LetMeFly】2415.反转二叉树的奇数层:深度优先搜索(DFS) 力扣题目链接:https://leetcode.cn/problems/reverse-odd-levels-of-binary-tree/ 给你一棵 完美 二叉树的根节点 root ,请你反转这棵树中每个 奇数 层的节点值。 例如&#xff0c…