【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++ make

2、创建运行用户
useradd -M -s /sbin/nologin nginx

3、编译安装
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_module

make && make install

4、优化路径
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.target

chmod 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=info


consul-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.html

docker 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

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

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

相关文章

实战 | OpenCV传统方法实现密集圆形分割与计数(详细步骤 + y源码)

导 读 本文主要介绍基于OpenCV传统方法实现密集圆形分割与计数应用,并给详细步骤和代码。 背景介绍 实例图片来源于网络,目标是分割下图中圆形目标并计数。 本文实现效果如下: 实现步骤 【1】灰度转换 + 均值滤波 + 二值化,得到参考背景 img = cv2.imread(src.jpg)c…

S1试讲讲稿

习题题目 答案 用到的概念: 概率之和等于1 E ( x ) ∑ i 1 4 x i P i E(x)\sum_{i1}^4x_iP_i E(x)∑i14​xi​Pi​ E ( x 2 ) ∑ i 1 4 x i 2 P i E(x^2)\sum_{i1}^4x_i^2P_i E(x2)∑i14​xi2​Pi​ V a r ( X ) Var(X) Var(X) ∑ i 1 4 ( x i − x ‾ ) 2…

微服务保护--线程隔离(舱壁模式)

一、线程隔离的实现方式 线程隔离有两种方式实现: 线程池隔离 信号量隔离(Sentinel默认采用) 如图: 线程池隔离:给每个服务调用业务分配一个线程池,利用线程池本身实现隔离效果 信号量隔离&#xff1a…

eclipse连接mysql数据库(下载eclipse,下载安装mysql,下载mysql驱动)

前言: 使用版本:eclipse2017,mysql5.7.0,MySQL的jar建议使用最新的,可以避免警告! 1:下载安装:eclipse,mysql在我之前博客中有 http://t.csdnimg.cn/UW5fshttp://t.csdn…

Linux-CentOS7(无图形界面版)部署stable-diffusion-webui 全过程

Linux-CentOS7(无图形界面版)部署Stable Diffusion webui 全过程 前置要求 git的版本不能是CentOS默认的版本(1.8),版本太老,在后面安装过程会失败。去github上下载最新的git源码包 安装成功显示版本号 …

《Linux C编程实战》笔记:目录操作

目录的创建和删除 mkdir函数 #include <sys/stat.h> #include <sys/types.h> int mkdir(const char *pathname, mode_t mode); mkdir创建一个新的空目录。空目录中会自动创建.和..目录项。所创建的目录的存取许可权由mode (mode &~umask)指定。 新创建目录的…

Linux---cp和mv命令选项

1. cp命令选项 命令选项说明-i交互式提示-r递归拷贝目录及其内容-v显示拷贝后的路径描述-a保留文件的原有权限 cp -i命令选项效果图: cp -r命令选项效果图: cp -v命令选项效果图: cp -a命令选项效果图: -a选项说明: -a 选项还支持拷贝文件夹并且文件夹中的文件权限不丢失 …

如何发布自定义 npm 组件包

准备工作 1. 注册 npm 账号 还没有 npm 账号&#xff1f;去官网注册&#xff1a; https://www.npmjs.com 需要记住用户名、密码、邮箱&#xff0c;后面需要用到。 2. 查看本地 npm 镜像&#xff0c;如果不是默认的&#xff0c;需要改回来 npm config get registry重置镜像路…

C语言--求数组的最大值和最小值【两种方法】

&#x1f357;方法一&#xff1a;用for循环遍历数组&#xff0c;找出最大值与最小值 &#x1f357;方法二&#xff1a;用qsort排序&#xff0c;让数组成为升序的有序数组&#xff0c;第一个值就是最小值&#xff0c;最后一个是最大值 完整代码&#xff1a; 方法一&#xff1a; …

国外博士论文下载网址

系列文章目录 前言 如果你想补充其他相关网址&#xff0c;请留言 一、pqdtcn 1.1 使用说明 浏览本数据库建议使用chrome浏览器&#xff01; ProQuest检索平台在今年暑假做了界面升级。为了使您能更快了解升级后的界面功能&#xff0c;ProQuest公司准备了中文版用户使用手册…

【CSS】前端点点点加载小点样式css动画过程实现

对话的 ... 加载动画&#xff0c;直接用 CSS 就可以实现&#xff0c;样式可以自己改&#xff0c;逻辑大差不差 <div class"loading-text"><span class"dot1"></span><span class"dot2"></span><span class&quo…

锁--07_1----插入意向锁-Insert加锁过程

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 插入意向锁MySQL执行插入Insert时的加锁过程MySQL官方文档MySQL insert加锁流程1.加插入意向锁2.判断插入记录是否有唯一键3. 插入记录并对记录加X锁插入意向锁----…

基于单片机的智能导盲杖设计 (论文+源码)

1. 系统设计 应用STC89C52单片机微处理器进行研究一种智能手杖系统&#xff0c;需要同时实现超声波自动测距、语音自动报警、距离自动显示、电机震动报警、LED指示灯灯光明灭自动提醒等多种功能&#xff0c;在手机通信提醒模式下手机用户可拨打固定手机电话信号实现手机通信提…

RabbitMQ插件详解:rabbitmq_message_timestamp【Rabbitmq 五】

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 RabbitMQ时空之旅&#xff1a;rabbitmq_message_timestamp的奇妙世界 前言什么是rabbitmq_message_timestamprabbitmq_message_timestamp 的定义与作用&#xff1a;如何在 RabbitMQ 中启用消息时间戳&…

【setDS】牛客小白月赛83 E

登录—专业IT笔试面试备考平台_牛客网 题意 思路 首先&#xff0c;一个必要步骤是把它转化为两个序列&#xff0c;这样就变成了一个序列DS问题 我们的答案是一个位置 pos 后面还有多少位置和这个位置的颜色相同&#xff0c;考虑得到这个答案我们需要维护什么东西 我们只需要…

Knife4j 接口文档如何设置 Authorization 鉴权参数?

&#x1f680; 作者主页&#xff1a; 有来技术 &#x1f525; 开源项目&#xff1a; youlai-mall &#x1f343; vue3-element-admin &#x1f343; youlai-boot &#x1f33a; 仓库主页&#xff1a; Gitee &#x1f4ab; Github &#x1f4ab; GitCode &#x1f496; 欢迎点赞…

uniapp实现检查版本检测,更新

1.首先需要获取当前app的版本 const systemInfo uni.getSystemInfoSync();// 应用程序版本号// #ifdef APPme.version systemInfo.appWgtVersion;// #endif// #ifdef H5me.version systemInfo.appVersion;// #endif2.在获取到服务器保存的app版本 3.点击按钮验证版本号 //…

每天五分钟计算机视觉:Inception网络是由多个Inception模块构成

本文重点 inception从另一种角度来提升训练结果:能更高效的利用计算资源,在相同的计算量下能提取到更多的特征,从而提升训练结果。可以简单的理解为Inception 网络是由一个一个的Inception模块构建成的,我们来看一下。 Inception模块 如上就是Inception模块的 通过一个1…

【AI美图】第03期效果图,AI人工智能全自动绘画,二次元美图欣赏

带来一组二次元人工智能自动绘图 对比分析&#xff1a; 标题手画二次元需要技巧&#xff1a; 二次元高清图片的绘制技巧主要包括以下几点&#xff1a; 线条的运用&#xff1a;在二次元风格的绘画中&#xff0c;线条的运用非常重要。要绘制出流畅、细腻的线条&#xff0c;需…

人工智能计算机视觉:解析现状与未来趋势

导言 随着人工智能的迅速发展&#xff0c;计算机视觉技术逐渐成为引领创新的关键领域。本文将深入探讨人工智能在计算机视觉方面的最新进展、关键挑战以及未来可能的趋势。 1. 简介 计算机视觉是人工智能的一个重要分支&#xff0c;其目标是使机器具备类似于人类视觉的能力。这…