[云原生1. ] Docker consul的详细介绍(容器服务的更新与发现)

文章目录

  • 1. 服务注册与发现的概述
    • 1.1 cmp问题
    • 1.2 解决方法
  • 2. Consul的概述
    • 2.1 简介
    • 2.2 为什么要使用Consul服务模块
    • 2.2 Consul的服务架构
    • 2.3 Consul的一些关键特性
  • 3. consul服务部署
    • 3.1 前置准备
    • 3.2 Consul服务器
      • 3.2.1 建立 Consul 服务
      • 3.2.2 设置代理,在后台启动 consul 服务端
      • 3.2.3 查看集群信息
    • 3.3 Registrator服务器
      • 3.3.1 安装 Gliderlabs/Registrator
      • 3.3.2 测试服务发现功能是否正常
      • 3.3.4 验证 http 和 nginx 服务是否注册到 consul
      • 3.3.5 在consul server 通过curl命令测试
    • 3.4 配置consul-template
      • 3.4.1 准备 template nginx 模板文件
      • 3.4.2 安装nginx
      • 3.4.3 配置并启动 template
      • 3.4.4 访问 template-nginx
      • 3.4.5 增加一个 nginx 容器节点
    • 3.5 consul多节点 (拓展)

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

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

1.1 cmp问题

在这里插入图片描述
起初服务都是单节点的,不保障高可用性,也不考虑服务的压力承载,服务之间调用单纯的通过接口访问

直到后来出现了多个节点的分布式架构,起初的解决手段是在服务前端负载均衡,这样前端必须要知道所有后端服务的网络位置,并配置在配置文件中。

这里就会有几个问题:

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

1.2 解决方法

在这里插入图片描述
后端服务A-N可以把当前自己的网络位置注册到服务发现模块,服务发现就以K-V的方式记录下来,K一般是服务名,V就是IP:PORT

服务发现模块定时的进行健康检查,轮询查看这些后端服务能不能访问的了。
前端在调用后端服务A-N的时候,就跑去服务发现模块问下它们的网络位置,然后再调用它们的服务

这样的方式就可以解决上面的问题了,前端完全不需要记录这些后端服务的网络位置,前端和后端完全解耦!

2. Consul的概述

2.1 简介

consul是google开源的一个使用go语言开发的服务管理软件。

支持多数据中心分布式高可用服务发现和配置共享</font。

采用Raft算法,用来保证服务的高可用。
内置了服务注册与发现框架、分布一致性协议实现、健康检查、Key/Value存储、多数据中心方案,不再需要依赖其他工具(比如ZooKeeper等)。

2.2 为什么要使用Consul服务模块

如果后端应用服务器集群节点数量很多,前端负载均衡器配置和管理会很麻烦的问题

(负载均衡器的节点配置条目数量会很多,后端节点的网络位置发生了变化还需要修改所有调用这些后端节点的负载均衡器配置等问题)

2.2 Consul的服务架构

consul由两种模式组成:cilent模式和server模式。

在这里插入图片描述

  • client模式:可用于接收后端服务发来的注册信息,并转发给server节点,没有持久化能力
  • server模式:可用于接收后端服务/client模式的节点发来的注册信息,还可在server节点之间同步注册信息,具有持久化注册信息到本地的能力

Server模式下还有个特殊的节点: server-leader节点。
在这里插入图片描述

server-leader节点负责同步注册信息给其它的server节点,并对各个节点做健康检查

Leader基于Raft算法进行选举,在Leader选举过程中,整个集群都无法对外提供服务。

2.3 Consul的一些关键特性

  • 服务注册与发现:consul通过DNS或者HTTP接口使服务注册和服务发现变的很容易
  • 健康检查:健康检测使consul可以快速的告警在集群中的操作。和服务发现的集成,可以防止服务转发- 到故障的服务上面。
  • Key/Value存储:一个用来存储动态配置的系统。提供简单的HTTP接口,可以在任何地方操作。
    多数据中心:无需复杂的配置,即可支持任意数量的区域。

3. consul服务部署

在这里插入图片描述

3.1 前置准备

ServerIPUsage
consul服务器192.168.67.100运行consul服务、nginx服务、consul-template守护进程
registrator服务器192.168.67.101运行registrator容器、运行nginx容器
systemctl stop firewalld.service
setenforce 0

3.2 Consul服务器

不需要安装docker

3.2.1 建立 Consul 服务

#建立工作目录,上传并解压代码包

mkdir /opt/consul
cp consul_0.9.2_linux_amd64.zip /opt/consul

cd /opt/consul
unzip consul_0.9.2_linux_amd64.zip

在这里插入图片描述

mv consul /usr/local/bin/

3.2.2 设置代理,在后台启动 consul 服务端

#启动consul server
consul agent \
-server \
-bootstrap \
-ui \
-data-dir=/var/lib/consul-data \
-bind=192.168.67.100 \
-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。
----------------------------------------------------------------------------------------------------------
#查看相关端口
ss -natp | grep consul

在这里插入图片描述

#启动consul后默认会监听5个端口:
8300:replication、leader farwarding的端口
8301:lan cossip的端口
8302:wan gossip的端口
8500:web ui界面的端口
8600:使用dns协议查看节点信息的端口

3.2.3 查看集群信息

#查看members状态
consul members

在这里插入图片描述

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

在这里插入图片描述

consul info | grep leader
#这个命令也可以查看集群状态

在这里插入图片描述

curl 127.0.0.1:8500/v1/status/peers 			
#查看集群server成员

curl 127.0.0.1:8500/v1/status/leader			
#集群 server-leader

curl 127.0.0.1:8500/v1/catalog/services		
#注册的所有服务

curl 127.0.0.1:8500/v1/catalog/nginx			
#查看 nginx 服务信息

curl 127.0.0.1:8500/v1/catalog/nodes			
#集群节点详细信息

在这里插入图片描述

#测试能否访问consul的web界面
浏览器访问
http://192.168.67.100:8500

在这里插入图片描述

3.3 Registrator服务器

容器服务自动加入 Nginx 集群

3.3.1 安装 Gliderlabs/Registrator

Gliderlabs/Registrator 可检查容器运行状态自动注册,还可注销 docker 容器的服务到服务配置中心。

目前支持 ConsulEtcdSkyDNS2

部署docker,详情见 [云原生1.] Docker容器的简单介绍和基本管理

docker pull gliderlabs/registrator:latest
#获取镜像

在这里插入图片描述

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

# registrator为容器名
# host为网络模式
# always为重启策略

在这里插入图片描述

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

docker pull nginx
docker pull httpd

在这里插入图片描述

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:设置容器主机名

在这里插入图片描述

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

#通过consul web界面验证

浏览器中,输入 http://192.168.67.100:8500,在 Web 页面中“单击 NODES”,然后单击“consurl-server01”,会出现 5 个服务。

在这里插入图片描述

3.3.5 在consul server 通过curl命令测试

#通过curl命令查询到Consul上注册的一些服务
curl 127.0.0.1:8500/v1/catalog/services 

在这里插入图片描述

3.4 配置consul-template

前往consul服务器上操作

3.4.1 准备 template nginx 模板文件

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.67.100;
    access_log /var/log/nginx/scj.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;
    }
}

3.4.2 安装nginx

#安装依赖
yum -y install pcre-devel zlib-devel gcc gcc-c++ make

在这里插入图片描述

#新建管理用户
useradd -M -s /sbin/nologin nginx
tar zxvf nginx-1.22.0.tar.gz -C /opt/

cd /opt/nginx-1.22.0/
#编译安装
./configure --prefix=/usr/local/nginx --user=nginx --group=nginx && make && make install

在这里插入图片描述

#制作软连接
ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/
vim /usr/local/nginx/conf/nginx.conf

......
http {
     include       mime.types;
     include  vhost/*.conf;       				#添加虚拟主机目录
     default_type  application/octet-stream;
......

在这里插入图片描述

#创建虚拟主机目录
mkdir /usr/local/nginx/conf/vhost

#创建日志文件目录
mkdir /var/log/nginx

#启动nginx
/usr/local/nginx/sbin/nginx

在这里插入图片描述

3.4.3 配置并启动 template

#上传并解压代码包
unzip consul-template_0.19.3_linux_amd64.zip -d /opt/

在这里插入图片描述

cd /opt/
mv consul-template /usr/local/bin/
#在前台启动 template 服务,启动后不要按 ctrl+c 中止 consul-template 进程。
consul-template --consul-addr 192.168.67.100:8500 \
--template "/opt/consul/nginx.ctmpl:/usr/local/nginx/conf/vhost/scj.conf:/usr/local/nginx/sbin/nginx -s reload" \
--log-level=info

在这里插入图片描述

#另外打开一个终端查看生成配置文件
cd /usr/local/nginx/conf/vhost/
cat scj.conf

在这里插入图片描述

3.4.4 访问 template-nginx

docker ps -a

在这里插入图片描述

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

在这里插入图片描述

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

在这里插入图片描述

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

在这里插入图片描述
在这里插入图片描述

#注:访问失败的话,需要开启路由转发。
vim /etc/sysctl.conf

net.ipv4.ip_forward = 1

3.4.5 增加一个 nginx 容器节点

#增加一个 nginx 容器节点,测试服务发现及配置更新功能
#在registor节点添加

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

在这里插入图片描述

#查看子配置文件

cd /usr/local/nginx/conf/vhost/
cat scj.conf

在这里插入图片描述

#在新容器节点添加测试页面,测试能否负载均衡

docker ps -a

docker exec -it 4305e3bcddde  bash
echo "this is test5 web" > /usr/share/nginx/html/index.html

在这里插入图片描述

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

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

可以看到,请求正常轮询到各个容器节点

3.5 consul多节点 (拓展)

consul -leave  脱离节点
       -enable-script-checks=true :设置检查服务为可用
       -datacenter : 数据中心名称
       -join :加入到已有的集群中

#添加一台已有docker环境的服务器192.168.67.102/24加入已有的群集中
consul agent \
-server \
-ui \
-data-dir=/var/lib/consul-data \
-bind=192.168.67.102 \
-client=0.0.0.0 \
-node=consul-server02 \
-enable-script-checks=true  \
-datacenter=dc1  \
-join 192.168.67.100 &> /var/log/consul.log &
consul members

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

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

相关文章

python爬虫(数据获取——selenium)

环境测试 from selenium import webdriverchromedriver_path r"C:\Program Files\Google\Chrome\Application\chromedriver.exe" driver webdriver.Chrome()url "https://www.xinpianchang.com/discover/article?fromnavigator" driver.get(url)drive…

使用lua-resty-request库编写爬虫IP实现数据抓取

目录 一、lua-resty-request库介绍 二、使用lua-resty-request库进行IP数据抓取 1、获取IP地址 2、设置请求 3、处理数据 三、代码实现 四、注意事项 五、总结 本文将深入探讨如何使用lua-resty-request库在爬虫程序中实现IP数据抓取。我们将首先介绍lua-resty-request…

FFmpeg直播能力更新计划与新版本发布

// 编者按&#xff1a;客户端作为直接面向用户大众的接口&#xff0c;随着技术的发展进化与时俱进&#xff0c;实现更好的服务是十分必要的。FFmpeg作为最受欢迎的视频和图像处理开源软件&#xff0c;被相关行业的大量用户青睐&#xff0c;而随着HEVC标准的发布到广泛使用&am…

SpringBoot整合Mybatis-plus

MyBatis-Plus与MyBatis区别&#xff1a; 导入坐标不同数据层实现简化 1.创建项目 2.选择依赖 3.pom文件 说明&#xff1a;配置pom.xml文件 <dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId>&…

DB-GPT介绍

DB-GPT介绍 引言DB-GPT项目简介DB-GPT架构关键特性私域问答&数据处理多数据源&可视化自动化微调Multi-Agents&Plugins多模型支持与管理隐私安全支持数据源 子模块DB-GPT-Hub微调参考文献 引言 随着数据量的不断增长和数据分析的需求日益增多&#xff0c;将自然语言…

P9831 [ICPC2020 Shanghai R] Gitignore

P9831 [ICPC2020 Shanghai R] Gitignore - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 只看题意翻译这道题是做不出来的&#xff0c;还要去看英文里面的规定&#xff08;这里就不放英文了&#xff09;&#xff0c;主要问题是不要公用子文件夹。 例如: 1 / a / 2 2 / a / 3…

Java Jar 包还不知道怎么反编译,赶紧看看这个 IDEA 插件!

前言 当我们使用 Java 开发时&#xff0c;经常会遇到一种情况&#xff1a;我们拿到了一个 JAR 文件&#xff0c;但是却没有源代码。这时候&#xff0c;我们就需要使用反编译工具来帮助我们还原出源代码。 反编译工具可以将编译后的 JAR 文件转换回可读的 Java 源代码。这样&a…

Mysql库操作

一&#xff1a;库的操作 1&#xff1a;创建数据库 mysql> create database test1; Query OK, 1 row affected (0.00 sec)mysql> create database test2 charsetutf8;create database test2 character utf8;Query OK, 1 row affected (0.00 sec)mysql> create databa…

差生文具多之(一)eBPF

前言 在问题排查过程中, 通常包含: 整体观测, 数据采集, 数据分析这几个阶段. 对于简单问题的排查, 可以跳过前两个步骤, 无需额外收集数据, 直接通过分析日志中的关键信息就可以定位根因; 而对于复杂问题的排查, 为了对应用的行为有更完整的了解, 可以通过以下形式收集更多的…

掌握Maven和SpringBoot的灵活性:定制化lib目录和依赖范围

前言 在开发基于Maven和SpringBoot的项目时&#xff0c;我们经常会使用第三方库来满足需求。然而&#xff0c;有时候我们需要更灵活地控制这些库的依赖范围和加载方式。本文将介绍如何使用Maven和SpringBoot实现定制化的lib目录和依赖范围。经过如下定制化后&#xff0c;打包执…

【算法 | 哈希表 No.2】leetcode 219. 存在重复元素II

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【手撕算法系列专栏】【LeetCode】 &#x1f354;本专栏旨在提高自己算法能力的同时&#xff0c;记录一下自己的学习过程&#xff0c;希望…

JVM类的声明周期

文章目录 版权声明生命周期概述加载阶段查看内存中的对象 连接阶段连接阶段之验证连接阶段之准备连接阶段之解析 初始化阶段练习题目一练习题目二练习题目三练习题目四 使用阶段卸载阶段总结 版权声明 本博客的内容基于我个人学习黑马程序员课程的学习笔记整理而成。我特此声明…

Microsoft Edge不能工作了,可能原因不少,那么如何修复呢

Microsoft Edge打不开或不能加载网页是用户在Windows 10、Android、Mac和iOS设备上的网络浏览器上遇到的许多错误之一。其他Microsoft Edge问题可能包括浏览器窗口和选项卡冻结、网站崩溃、互联网连接错误消息以及丢失Microsoft Edge书签、收藏夹、密码和收藏。 Microsoft Edg…

【安全】Java幂等性校验解决重复点击(6种实现方式)

目录 一、简介1.1 什么是幂等&#xff1f;1.2 为什么需要幂等性&#xff1f;1.3 接口超时&#xff0c;应该如何处理&#xff1f;1.4 幂等性对系统的影响 二、Restful API 接口的幂等性三、实现方式3.1 数据库层面&#xff0c;主键/唯一索引冲突3.2 数据库层面&#xff0c;乐观锁…

学习Opencv(蝴蝶书/C++)相关——1. 前言 和 第1章.概述

文章目录 1. 整体架构1.1 OpenCV3.01.2 Opencv4.xX. 在线文档X.1 Opencv cheatsheet(小抄)1. 整体架构 1.1 OpenCV3.0 对于Opencv3.x版本,网上最常见的图,图自OpenCV Tutorial-Itseez 现在已经不是500+的算法了,而是2500+,详见:About

STM32G030F6P6 芯片实验 (二)

STM32G030F6P6 芯片实验 (二) Hello World - GPIO LED 尝试了下, 从 0 开始建 MDK HAL M0plus Project, 成功点亮 LED了。 但是 ST-LINK跑着跑着, 码飞了! 不知飞哪去了。 只好拿 MX 建了个 MDK Base。 呼叫 SysTick HAL_Delay(), 切换 LED。 基本上都是一样的用法, 只是换…

ICCV2023 Tracking paper汇总(一)(多目标跟随、单目标跟随等)

一、PVT: A Simple End-to-End Latency-Aware Visual Tracking Framework paper&#xff1a; https://openaccess.thecvf.com/content/ICCV2023/papers/Li_PVT_A_Simple_End-to-End_Latency-Aware_Visual_Tracking_Framework_ICCV_2023_paper.pdf github&#xff1a; https://…

java EE 进阶

java EE 主要是学框架(框架的使用,框架的原理) 框架可以说是实现了部分功能的半成品,还没装修的毛坯房,然后我们再自己打造成自己喜欢的成品 这里学习四个框架 : Spring ,Spring Boot, Spring MVC, Mybatis JavaEE 一定要多练习,才能学好 Maven 目前我们主要用的两个功能: …

图像新型拼接

道路摄像头拼接 拼接道路上的摄像头&#xff0c;比较麻烦&#xff0c;如图所示 前后的摄像头都是如此&#xff0c;那么如何拼接摄像头画面呢&#xff0c;像下面这样拼接 测试代码 测试一下代码&#xff0c;使用python import cv2 import numpy as npimg cv2.imread("…

antv/g6之交互模式mode

什么是mode 在 AntV G6 中&#xff0c;“mode” 是用于配置图表交互模式的一种属性。通过设置 “mode”&#xff0c;可以控制图表的行为&#xff0c;以满足不同的交互需求。可能在不同的场景需要展现的交互行为不一样。比如查看模式下点击一个点就选中的状态&#xff0c;在编辑…