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

一、微服务(容器)的注册与发现——微服务架构中极其重要的组件

1、定义:是一种分布式管理系统以及定位服务的方法。传统架构中,应用程序之间直连到已知的服务,设备提供的网络(IP地址),基于TCP/IP协议:端口。由于现代微服务部署,服务的动态性、数量增加,传统的基于IP地址+端口的方式已不太适用,应运而生服务注册及发现

2、服务注册及发现核心:微服务的位置信息(IP地址+端口+服务名称+健康状态)统一注册到服务注册中心表中,可以允许其他服务动态的查询和发现这些服务(发现和查询机制)

3、工作机制

(1)服务注册:当一个服务启动时,会把自己的元数据【IP地址+端口+服务名称+健康状态(服务是否在运行)】注册到服务注册表(consul、zookeeper、云平台)中

(2)服务发现:其他服务需要和这个服务通信时,只需要向注册表查询服务位置信息(IP地址+端口),这样可以直接在服务注册表中直接获取需要的信息,不需要到静态配置查看

注:一旦服务停止,会从服务注册中心表中移除该服务的所有信息

4、服务注册与发现的优点

(1)动态性:可以在运行时动态添加或移除服务,无需额外的人工操作和配置

(2)弹性:一旦某个服务不可用,服务注册表会及时更新,通知其他服务避免请求失败

(3)可扩展:适应不断变化的服务数量

(4)透明性:服务方调用时,前端和后端实现解耦

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

二、consul

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

2、特点

(1)服务发现与自动注册:保存位置信息(IP地址+端口+服务名称)

(2)健康检查:服务注册到consul,一并加入系统的还有其健康状态,定期发送一个心跳检查,若服务挂了,consul会自动解除

(3)分布式锁:consul提供一个分布式锁的功能,可协调多个节点之间的操作,防止竞争条件和数据冲突

①创建锁:每一个服务的发现与注册都是一个会话session。微服务1注册到consul时,consul会和这个服务的会话创建一个锁,锁用来表示具体的服务,会话和锁之间进行关联

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

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

4KV存储:key-value分布式的键值对存储系统,存储配置信息、锁、特性等,应用程序可以使用consul的键值对存储来动态的获取配置信息

(5)多数据中心支持:consul可以在多个地域部署,可以实现数据中心之间的发现和注册功能

(6)DNS和HTTP API:consul支持DNS接口,通过域名解析定位服务的位置,HTTP API通过API应用接口调用consul的信息(服务信息、健康检查等)

(7)事件通知:若有关键信息可以随时获取通知

三、一键化自动管理以及自动发现和管理(consul-template工具)

1、定义:用于consul集成,自动更新配置文件,实现配置管理的自动化

2、作用

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

②支持多种后端的模板:比如nginx配置、ETCD等

四、容器自动发现与注册、配置实验

主机名

作用

IP地址

组件

docker1

consul服务器

20.0.0.16

consul、docker-ce、nginx二进制、sonsul-template(自动发现与自动配置)

docker2

registrator服务器

20.0.0.26

运行注册机制和微服务

docker3

consul服务器

20.0.0.36

多节点服务器,加入到consul集群中

1、consul部署和服务发现docker1

(1)安装consul

consul agent \

> -server \

> -bootstrap \

> -ui \

> -data-dir=/var/lib/consul-data \

> -bind=20.0.0.16 \

> -client=0.0.0.0 \

> -node=consul-server01 &> /var/log/consul.log &

(2)启动consul

consul agent

开启监听服务

-server

指定集群当中的服务器节点,consul的RAFT算法实现分布式结构中节点的在一致性。集群中的成员,直接成为集群的leader,后续加入的服务器都是follower

-bootstrap

表示该节点是引导节点,引导选举过程,以及为后续加入的server做引导,加入集群

-ui

表示启动图形化界面

-data-dir=/var/lib/consul-data

consul存储数据的路径

-bind=20.0.0.16

服务端绑定的IP地址,用于节点通信

-client=0.0.0.0

所有主机都可以和server建立通信(生产环境中指定IP地址)

 -node=consul-server01

指定consul节点的名称(在集群中,名称是唯一且不可重复的)

&> /var/log/consul.log

混合重定向输出到/consul.log中

&

后台运行

(3)查看consul端口

8300

RAFT协议的端口,保持分布式集群的一致性,端口处理复制和领导者选举

8301

LAN Gossip的端口,局域网内进行节点通信和信息传播的协议

8302

Wan Gossip的端口,广域网内进行节点通信和信息传播的协议

8500

web ui的端口,用来访问consul的图形化界面

8600

DNS解析的端口

①查询集群信息

consul members

②查看集群状态

consul operator raft list-peers

③查看集群的server成员

curl 127.0.0.1:8500/v1/status/peers

④查看集群的leader

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

2、自动发现与配置【docker2】

(1)创建自动注册的容器

docker run -d \

> --name=registrator \

> --net=host \

> -v /var/run/docker.sock:/tmp/docker.sock \

> --restart=always \

> gliderlabs/registrator:latest \

> --ip=20.0.0.26 \

> consul://20.0.0.16:8500

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

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

--name=registrator

容器名称

-v /var/run/docker.sock:/tmp/docker.sock

docker.sock是docker守护进程的套接字文件,把它应色号到容器中,registrator容器可以监听docker的所有事件,且完成自动注册服务

--ip=20.0.0.26

注册在consul的IP地址

consul://20.0.0.16:8500

所有发现的服务都会注册到指定的server节点

(2)浏览器访问20.0.0.16:8500

(3)模拟服务停止,consul是否能自动移除

docker stop test-2

(4)恢复服务,consul是否会自动发现

(5)查看集群中已经被注册与发现的服务【docker1】

curl 127.0.0.1:8500/v1/catalog/services

3、自动发现与配置【docker1】

(1)创建自动化更新nginx配置文件

range service "nginx"

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

server {{.Address}}:{{.Port}}

将发现和注册的nginx服务的IP地址和端口添加到test1的方法中

(2)编译安装nginx

(3)虚拟主机创建目录

(4)解压template源码包

(5)启动template服务,启动后不要按 ctrl+c 中止 consul-template 进程

consul-template --consul-addr 20.0.0.16: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 192.168.233,40:8500

指定consul的地址,告诉consul-template从server节点获取数据

/opt/consul/nginx.ctmpl:

配置文件的模板位置

/usr/local/nginx/vhost/test,conf

基于模板生成配置文件的位置

/usr/local/nginx/sbin/nginx -s reload

只要集群中服务发生变化,可以随时更新到配置文件中

--log-level=info

设置consul-template的日志级别为info

consul是一个中间件,nginx服务通过consul-template获取模板,反向代理,consul-template,consul来获取服务的IP地址和端口,然后nginx调用发现的服务实现负载均衡

4、添加多个consul节点【docker3】

(1)解压consul源码包

(2)在集群中添加节点服务器【docker2】

docker run -d --name=registrator3 -v /var/run/docker.sock:/tmp/docker.sock --restart=always gliderlabs/registrator:latest --ip=20.0.0.26 consul://20.0.0.36:8500

(3)启动consul

consul agent-server \

-ui \

-data-dir=/var/lib/consul-databind=20.0.0.36 \

client=0.0.0.0 \

-node=consul-server02 \

-enable-script-checks=true \

-datacenter=dc1 \

-join 20.0.0.16 &> /var/log/consul.log &

-enable-script-checks=true

设置检查服务为可用,也可以发现原集群中的服务

-datacenter=dc1

加入到40的数据中心

-join 192.168.233.40

加入到已有的集群中

(4)查看集群状态

consul operator raft list-peers

查询集群信息consul members

(5)脱离集群consul leave

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

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

相关文章

高级前端开发工程师

岗位需求 熟练掌握前端主流框架Vue、React、Angular,至少熟练掌控Vue全家桶 文章目录 岗位需求前言一、Vue框架二、React框架三、Angular框架四、什么是Vue全家桶前言 -那就看你表哥的电脑里有没有硬盘 -我不敲键盘 一、Vue框架 Vue(读音为/vjuː/,类似于"view"…

Linux 内存池源码剖析

1 传统的分配与释放内存的函数缺点: void *malloc(size_t size); void *calloc(size_t nmemb,size_t size);void *realloc(void *ptr, size_t size);void free(void *ptr);缺点1: 高并发时较小内存块使用导致系统调用频繁,降低了系统的执行效率 缺点2: 频繁使用时增加了系统…

【答案】2023年国赛信息安全管理与评估第三阶段夺旗挑战CTF(网络安全渗透)

【答案】2023年国赛信息安全管理与评估第三阶段夺旗挑战CTF(网络安全渗透) 全国职业院校技能大赛高职组信息安全管理与评估 (赛项) 评分标准 第三阶段 夺旗挑战CTF(网络安全渗透) *竞赛项目赛题* 本文…

柔性数组(结构体成员)

目录 前言: 柔性数组: 给柔性数组分配空间: 调整柔性数组大小: 柔性数组的好处: 前言: 柔性数组?可能你从未听说,但是确实有这个概念。听名字,好像就是柔软的数…

如何连接到 Azure SQL 数据库(下)

在《如何连接到 Azure SQL 数据库(上)》中,我们已经了解到了以下内容↓↓↓ 开始之前:Azure 连接凭据和防火墙 如何检索 Azure 连接凭据如何配置服务器防火墙使用 SQL Server Management Studio 连接到 Azure使用 dbForge Studio…

数据结构--稀疏矩阵及Java实现

一、稀疏 sparsearray 数组 1、先看一个实际的需求 编写的五子棋程序中,有存盘退出和续上盘的功能。 分析问题: 因为该二维数组的很多值是默认值 0, 因此记录了很多没有意义的数据.->稀疏数组。 2、稀疏数组基本介绍 当一个数组中大部分元素为0…

wordpress安装之正式开始安装wordpress

1、拉取wordpress镜像 docker pull wordpress 2、启动容器 启动容器,设置容器名为wordpress2并把80端口映射到宿主机的9988端口 docker run -it --name wordpress2 -p 9988:80 -d wordpress 3、查看容器状态 docker ps 4、安装wordpress博客程序 因为我们前面启…

微信小程序---使用npm包安装Vant组件库

在小程序项目中,安装Vant 组件库主要分为如下3步: 注意:如果你的文件中不存在pakage.json,请初始化一下包管理器 npm init -y 1.通过 npm 安装(建议指定版本为1.3.3) 通过npm npm i vant/weapp1.3.3 -S --production 通过y…

大数据技术14:FlinkCDC数据变更捕获

前言:Flink CDC是Flink社区开发的flink-cdc-connectors 组件,这是⼀个可以直接从 MySQL、PostgreSQL 等数据库直接读取全量数据和增量变更数据的 source 组件。 https://github.com/ververica/flink-cdc-connectors 一、CDC 概述 CDC 的全称是 Change …

换内核ubuntu

grep menuentry /boot/grub/grub.cfg我要使用第三个(索引从0开始,所以是第二个) 可以使用vi编辑(很麻烦) i变为插入模型 esc变为普通模型 :x删除单个字符,dd删除一行,:wq保存并退出 更新文件…

rabbitmq-windows安装使用-简易后台界面-修改密码

文章目录 1.下载2.安装3.安装 RabbitMQ4.后台访问5.修改密码 1.下载 将erlang运行时和rabbitmq-windows版本,上传在csdn,下载链接。https://download.csdn.net/download/m0_67316550/88633443 2.安装 右键,以管理员身份运行rabbitmq。启动…

Android 12.0 Launcher3定制化之动态时钟图标功能实现

1.概述 在12.0的系统产品rom定制化开发中,在Launcher3中的定制化的一些功能中,对于一些产品要求需要实现动态时钟图标功能,这就需要先绘制时分秒时针表盘,然后 每秒刷新一次时钟图标,时钟需要做到实时更新,做到动态时钟的效果,接下来就来分析这个功能的实现 如图: 2.动…

《Kotlin核心编程》笔记:面向对象

kotlin 中的类 // Kotlin中的一个类 class Bird {val weight: Double 500.0val color: String "blue"val age: Int 1fun fly() { } // 全局可见 }把上述代码反编译成Java的版本,然后分析它们具体的差异: public final class Bird {privat…

Linux部署MySQL5.7和8.0版本 | CentOS和Ubuntu系统详细步骤安装

一、MySQL数据库管理系统安装部署【简单】 简介 MySQL数据库管理系统(后续简称MySQL),是一款知名的数据库系统,其特点是:轻量、简单、功能丰富。 MySQL数据库可谓是软件行业的明星产品,无论是后端开发、…

【产品经理】产品专业化提升路径

产品专业化就是上山寻路,梳理一套作为产品经理的工作方法。本文作者从设计方法、三基座、专业强化、优秀产品拆解、零代码这五个方面,对产品经理的产品专业化进行了总结归纳,一起来看一下吧。 产品专业化就是上山寻路,梳理一套作为…

数据结构 | Log-Structured Merge Tree (LSM Tree)

今天介绍LSM Tree这个数据结构,严格意义上来说,他并不像他的名字一样是一棵树型的数据结构,而更多是一种设计思想。 LSM Tree最先在1996年被提出,后来被广泛运用于现代NoSQL(非关系型数据库)系统中&#xf…

虚幻学习笔记17—C++委托(单播)

一、前言 相比“代理”这个名词我更喜欢叫“委托”,虚幻的委托分为三类,分别为单播、多播和动态多播。单播顾名思义就是一次只能绑定一个函数的委托,多播能一次性绑定多个,动态多播即可以在蓝图中进行动态的绑定且可以绑定多个。 …

mybatisplus使用雪花id通过swagger返回ID时精度丢失问题

在使用mybatisplus自带雪花的时候会发现返回的ID是19位的长度,因此在通过swagger页面展示的时候会发现后端返回的和页面展示的ID不一致问题。是因为精度丢失的问题。因此需要更改雪花ID的长度跟踪进去:发现是DefaultIdentifierGenerator类实现了Identifi…

蓝桥杯专题-真题版含答案-【扑克牌排列】【放麦子】【纵横放火柴游戏】【顺时针螺旋填入】

Unity3D特效百例案例项目实战源码Android-Unity实战问题汇总游戏脚本-辅助自动化Android控件全解手册再战Android系列Scratch编程案例软考全系列Unity3D学习专栏蓝桥系列ChatGPT和AIGC 👉关于作者 专注于Android/Unity和各种游戏开发技巧,以及各种资源分…

Python Pandas 如何给DataFrame增加一行/多行 数据(第6讲)

Python Pandas 如何给DataFrame增加一行/多行 数据(第6讲)         🍹博主 侯小啾 感谢您的支持与信赖。☀️ 🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ…