赞
踩
目录
2.3 验证 nginx 和 apache 服务是否注册到 consul
在当今的微服务架构中,容器化和服务发现已经成为了不可或缺的一部分。Docker作为目前最流行的容器化解决方案之一,而Consul则是一个强大的服务发现工具,它们的结合为构建可靠的、可扩展的应用程序提供了便利
本文旨在探讨如何有效地使用Docker和Consul来实现容器服务的更新与发现。我们将深入研究如何利用这些工具来简化微服务架构中的部署和管理,以及如何确保服务的高可用性和可靠性。通过本文的学习,读者将能够更好地理解如何利用Docker-Consul组合来构建灵活且稳健的容器化应用程序
服务注册与发现是微服务架构中不可或缺的重要组件。起初服务都是单节点的,不保障高可用性,也不考虑服务的压力承载,服务之间调用单纯的通过接口访问。
直到后来出现了多个节点的分布式架构,起初的解决手段是在服务前端负载均衡,这样前端必须要知道所有后端服务的网络位置,并配置在配置文件中。
这里就会有几个问题:
既然有这些问题,那么服务注册与发现就是解决这些问题的:
- 后端服务A-N可以把当前自己的网络位置注册到服务发现模块,服务发现就以K-V的方式记录下来,K一般是服务名,V就是IP:PORT
- 服务发现模块定时的进行健康检查,轮询查看这些后端服务能不能访问的了
- 前端在调用后端服务A-N的时候,就跑去服务发现模块问下它们的网络位置,然后再调用它们的服务
- 这样的方式就可以解决上面的问题了,前端完全不需要记录这些后端服务的网络位置,前端和后端完全解耦!
两种运行模式 server 和 client:
- 在client模式下,所有注册到当前节点的服务会被转发到server节点,本身是不持久化这些信息
- 在server模式下,功能和client模式相似,唯一不同的是,它会把所有的信息持久化到本地,这样遇到故障,信息是可以被保留的
- server-leader是所有server节点的老大,它和其它server节点不同的是,它需要负责同步注册的信息给其它的server节点,同时也要负责各个节点的健康监测
优点
缺点
综合来看,Docker和Consul的结合为微服务架构提供了强大的基础设施,但在使用过程中需要权衡好其优势和劣势,以便更好地应用于实际场景中
在传统模式下,应用程序通常需要硬编码或手动配置其依赖的服务的位置和连接信息。这意味着每当服务的位置或连接信息发生变化时,就需要手动更新相关配置。传统模式下,通常会使用静态配置文件或环境变量来指定服务的位置和连接信息
优点:
缺点:
自动发现注册模式利用服务发现工具(比如Consul、etcd等)来动态地注册和发现服务实例。应用程序不需要显式地知道服务的位置,而是通过服务发现工具来获取所需服务的实际位置和连接信息。当新的服务实例加入或退出时,服务发现工具会自动更新可用服务的列表
优点:
缺点:
总的来说,自动发现注册模式相对于传统模式更加智能化和高效,能够适应大规模、动态变化的系统环境
Consul-Template是基于Consul的自动替换配置文件的应用。Consul-Template是一个守护进程,用于实时查询Consul集群信息,并更新文件系统上任意数量的指定模板,生成配置文件。更新完成以后,可以选择运行 shell 命令执行更新操作,重新加载 Nginx
Consul-Template可以查询Consul中的服务目录、Key、Key-values 等。这种强大的抽象功能和查询语言模板可以使 Consul-Template 特别适合动态的创建配置文件。例如:创建Apache/Nginx Proxy Balancers 、 Haproxy Backends等
以下是 Consul-Template 的一些关键概念:
模板文件:模板文件是包含占位符或变量的文件,用于生成最终的配置文件。这些占位符会在运行时由 Consul-Template 替换为实际的数值、
Consul 数据源:Consul-Template 从 Consul 服务中获取数据。Consul 是一个用于服务发现、健康检查和动态配置的工具,Consul-Template 可以从 Consul 中读取键值对等数据
模板语法:Consul-Template 使用类似于 Go 语言模板包的语法来定义模板文件中的变量和控制结构。这使得用户能够在模板文件中使用条件语句、循环等控制结构
生成配置文件:Consul-Template 根据模板文件和从 Consul 中获取的数据生成最终的配置文件。这些配置文件可以用于配置各种应用程序或服务
自动更新:Consul-Template 具有自动更新功能,可以监视 Consul 中的数据变化,并在数据发生变化时重新生成配置文件。这样可以确保配置文件始终保持最新状态
总的来说,Consul-Template 可以帮助简化配置管理过程,使得将动态数据注入到配置文件中变得更加灵活和高效
是一个轻量级的代理程序,用于运行在每个部署了服务的节点上。它负责与Consul集群通信,并执行各种任务,包括服务注册、健康检查、服务发现和处理来自其他节点的RPC请求等
是一个服务注册器,它是一个独立的进程,运行在容器编排环境中;它的主要作用是监视运行中的服务实例,并将它们注册到服务发现系统中,例如Consul或etcd。通过这种注册,其他服务可以发现并与这些服务进行通信,而无需事先知道它们的位置或IP地址
Consul 是一种用于服务发现、配置和管理的工具,它使用了一些默认的端口来实现不同的功能。在启动 Consul 时,默认监听的五个端口如下:
8300:用于内部集群通信的RPC服务端口。这是Consul代理之间进行Raft协议通信所使用的端口。Raft协议用于保证Consul集群中数据的一致性和可靠性
8301:用于成员节点之间的LAN gossip通信的UDP端口。此端口用于Consul代理之间进行局域网(LAN)级别的成员信息交换,例如心跳检测、健康状态更新等
8302:这是用于Serf WAN(广域网)通信的UDP端口。如果您的Consul集群跨越多个数据中心,则节点之间的Serf通信将使用8302端口
8500:这是用于Web UI的端口。Consul提供了一个Web界面,供用户可视化地查看集群中的节点、服务、健康检查等信息。通过访问8500端口,用户可以在浏览器中访问Consul的Web UI
8600:用于DNS查询的DNS接口。Consul提供了一个DNS服务器,使得应用程序可以通过DNS方式来发现服务。这个端口用于处理DNS查询请求。
这些默认端口的详细说明可以帮助您更好地理解Consul在集群中的通信和管理方式。在启动Consul时,确保这些端口没有被其他应用程序占用,以确保Consul能够正常运行并实现所需的功能
zookeeper 使用临时节点特性来用于服务发现(当服务断开时,临时节点删除)这种服务发现机制比心跳检测更精致,复杂,但是同样也有一些固有的扩展性问题和增加客户端复杂性,所有的服务端都必须维持同 zookeeper 的活动连接
consul 的服务发现机制:Consul 在集群的每一个节点都运行一个客户端,这些客户端就是 gossip pool(分布式健康检查 分布式健康检查)的一部分,gossip 协议实现在服务宕机发现上很高效,无论服务集群中服务数多少,Consul 可以通过简单的检查服务返回200状态来进行健康检查
区别 | consul | zookeeper |
---|---|---|
一致性协议 | cp模型 | cp模型 |
健康检查 | TCP/HTTP/gRPC/Cmd | KeepAlive |
负载均衡策略 | Fabio | - |
雪崩保护 | 无 | 无 |
自动注销实例 | 不支持 | 支持 |
访问协议 | HTTP/DNS | TCP |
监听支持 | 支持 | 支持 |
多数据中心 | 支持 | 不支持 |
跨注册中心同步 | 支持 | 不支持 |
SpringCloud集成 | 支持 | 不支持 |
Dubbo集成 | 不支持 | 支持 |
K8s集成 | 支持 | 不支持 |
主机 | 主机名 | IP 地址 | 需要安装的软件 |
Consul 服务器 | consul | 172.16.12.10 | docker-ce、consul、consul-template、nginx |
Registrator 服务器 | registrator | 172.16.12.15 | doker-ce、registrator、运行nginx和apache容器 |
(1)关闭所有设备的防火墙和核心防护
- systemctl disable --now firewalld
- setenforce 0
(2)修改两台服务器的主机名,方便区分
- [root@localhost ~]#hostnamectl set-hostname consul
- [root@localhost ~]#bash #修改consul服务器主机名
-
- [root@localhost ~]#hostnamectl set-hostname registrator
- [root@localhost ~]#bash #修改registrator服务器主机名
- [root@consul ~]#mkdir /opt/consul
- [root@consul consul]#cd /opt/consul #需在此路径上传 consul_0.9.2_linux_amd64.zip
- [root@consul consul]#unzip consul_0.9.2_linux_amd64.zip
- [root@consul consul]#mv consul /usr/local/bin/
- [root@consul consul]#consul agent \
- -server \
- -bootstrap \
- -ui \
- -data-dir=/var/lib/consul-data \
- -bind=172.16.12.10 \
- -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

- [root@consul consul]#ss -natp | grep consul
- #过滤consul的进程,判断consul服务是否启动
- #查看members状态
- consul members
- #查看集群状态
- consul operator raft list-peers
- #返回有关当前Consul集群中领导者节点的信息
- 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 #集群节点详细信息
Gliderlabs/Registrator 可检查容器运行状态自动注册,还可注销 docker 容器的服务到服务配置中心。目前支持 Consul、Etcd 和 SkyDNS2。运行一个 Registrator 容器,开启自动发现服务
- docker run -d \
- --name=registrator \
- --net=host \
- -v /var/run/docker.sock:/tmp/docker.sock \
- --restart=always \
- gliderlabs/registrator:latest \
- --ip=172.16.12.15 \
- consul://172.16.12.10: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:80:80 --name nginx-01 -h nginx01 nginx
- docker run -itd -p:81:80 --name nginx-02 -h nginx02 nginx
- docker run -itd -p:82:80 --name apache-03 -h apache03 httpd
- docker run -itd -p:83:80 --name apache-04 -h apache04 httpd
- #-h:设置容器主机名
-
- docker ps -a #查看当前所有的容器
步骤:
①浏览器中,输入 http://172.16.12.10:8500
②在 Web 页面中“单击 NODES”,然后单击“consurl-server01”,会出现 5 个服务
- #在consul服务器使用curl测试连接服务器
- curl 127.0.0.1:8500/v1/catalog/services
Consul-Template是基于Consul的自动替换配置文件的应用。Consul-Template是一个守护进程,用于实时查询Consul集群信息,并更新文件系统上任意数量的指定模板,生成配置文件。更新完成以后,可以选择运行 shell 命令执行更新操作,重新加载 Nginx
Consul-Template可以查询Consul中的服务目录、Key、Key-values 等。这种强大的抽象功能和查询语言模板可以使 Consul-Template 特别适合动态的创建配置文件。例如:创建Apache/Nginx Proxy Balancers 、 Haproxy Backends等
在 consul 服务器上操作
- #定义nginx upstream一个简单模板,用于配置反向代理时的后端服务器列表
- vim /opt/consul/nginx.ctmpl
- upstream http_backend {
- #定义了一个名为http_backend的upstream块,它是一个逻辑组,用于将请求转发到后端服务器
- {{range service "nginx"}}
- #这是Go语言的模板语法,它会在每个Nginx服务实例上迭代执行内部的代码块。在Docker环境中,可能有多个Nginx服务实例运行,这个模板会为每个实例生成一行配置
- server {{.Address}}:{{.Port}};
- #定义了每个后端服务器的地址和端口号。.Address和.Port是从服务发现工具(比如Consul)中获取的后端服务的IP地址和端口号
- {{end}}
- }
- #将Nginx的请求转发到一组由服务发现工具管理的后端服务器上,这些后端服务器由nginx服务定义,并且它们的地址和端口号会动态地从服务发现工具中获取
-
- #定义一个server,监听8000端口,反向代理到upstream
- server {
- listen 8000;
- server_name localhost 172.16.12.10;
- access_log /var/log/nginx/dh.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;
- }
- }

在 consul 服务器上操作:
- yum -y install pcre-devel zlib-devel gcc gcc-c++ make
- useradd -M -s /sbin/nologin nginx
- #上传nginx安装包到当前目录下,再解压到/opt/目录下
- tar zxvf nginx-1.12.0.tar.gz -C /opt/
- cd /opt/nginx-1.12.0/
- ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx && make -j2 && make install
- ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/
在 consul 服务器上操作:
- #修改nginx主配置文件
- vim /usr/local/nginx/conf/nginx.conf
- ......
- http {
- include mime.types;
- include /usr/local/nginx/conf/vhost/*.conf; #添加虚拟主机目录
- default_type application/octet-stream;
- ......
- #创建虚拟主机目录
- mkdir /usr/local/nginx/conf/vhost
- #创建日志文件目录
- mkdir /var/log/nginx
- #启动nginx
- nginx
在 consul 服务器上操作:
- #安装 template 组件,安装包解压后,能直接使用
- #上传consul-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 172.16.12.10:8500 \
- --template "/opt/consul/nginx.ctmpl:/usr/local/nginx/conf/vhost/test.conf:/usr/local/nginx/sbin/nginx -s reload" \
- --log-level=info
- #在另外打开一个consul终端查看生成配置文件
- cd /usr/local/nginx/conf/vhost/
- #切换至虚拟主机目录
- ls
- #查看生成的配置文件
- cat test.conf
- docker ps #查看当前正在运行中的容器
-
- #在现实生产环境中两个后端nginx容器提供的静态页面内容是一样的,这里为了方便查看轮询效果,采用不同的界面
- docker exec -it nginx-01 bash #进入nginx-01容器内,更改网页文件
- echo "this is test01 web" > /usr/share/nginx/html/index.html
- exit
-
- docker exec -it nginx-02 bash #进入nginx-02容器内,更改网页文件
- echo "this is test02 web" > /usr/share/nginx/html/index.html
- exit
浏览器访问:http://172.16.12.10:8000/,并不断刷新
(1)增加一个 nginx 容器节点,测试服务发现及配置更新功能
- docker run -itd -p:84:80 --name nginx-03 -h nginx03 nginx
-
- #观察 template 服务,会从模板更新/usr/local/nginx/conf/vhost/test.conf 文件内容,并且重载 nginx 服务
(2)查看/usr/local/nginx/conf/vhost/test.conf 文件内容
cat /usr/local/nginx/conf/vhost/test.conf
(3)通过浏览器测试访问:http://172.16.12.10:8000/,并不断刷新
(4)查看三台 nginx 容器日志,请求正常轮询到各个容器节点上
- docker logs -f nginx-01
- docker logs -f nginx-02
- docker logs -f nginx-03
(1)关闭一个 nginx 容器节点
docker stop nginx-01 #关闭nginx-01容器节点
(2)查看/usr/local/nginx/conf/vhost/test.conf 文件内容
cat /usr/local/nginx/conf/vhost/test.conf
(3)浏览器访问:http://172.16.12.10:8000/,并不断刷新
(1)拷贝 consul 相关服务文件到新的consul节点
scp /usr/local/bin/consul 172.16.12.12:/usr/local/bin/
(2) 启动 consul 服务
- #添加一台已有docker环境的服务器172.16.12.12/24加入已有的群集中
- consul agent \
- -server \
- -ui \
- -data-dir=/var/lib/consul-data \
- -bind=172.16.12.12 \
- -client=0.0.0.0 \
- -node=consul-server02 \
- -enable-script-checks=true \
- -datacenter=dc1 \
- -join 172.16.12.10 &> /var/log/consul.log &
-
- #-enable-script-checks=true :设置检查服务为可用
- #-datacenter : 数据中心名称
- #-join :加入到已有的集群中
两个 consul 服务器节点都能查看
- #查看members状态
- consul members
-
- #查看集群状态
- consul operator raft list-peers
web 页面查看集群状态
步骤:
①浏览器中,输入 http://172.16.12.10:8500 或者 http://172.16.12.12:8500
②在 Web 页面中“单击 SERVICES”,然后单击“consurl”,会出现 consul 集群节点信息
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。