本文参考:https://www.cnblogs.com/iforever/p/9095095.html
对其中运行docker部分异常进行修改
服务发现
客户端维持zookeeper的一个watcher,监控/sevice/business/what
节点下节点变化,来获取可用服务器地址
![](https://img.haomeiwen.com/i4497639/cd4f7087386c88b2.png)
上述方法弊端:浪费客户端链接资源,我们可以通过加一级缓存进行判断,缓存存在的情况下不在进行服务获取
![](https://img.haomeiwen.com/i4497639/7dffd6910e1bbb4c.png)
服务注册
简介
服务器启动后加载监听脚本,当web服务器启动后,我们认为服务器可以对外服务,将当前服务器注册到zookeeper,当web服务器挂掉后,将当前服务器从zookeeper移除
web服务器监控 is_alive.py
# 使用python构建
from kazoo.client import KazooClient
import time
import nmap
import os
import json
ZNODE_BASE_PATH = '/service/business/what/'
zk = KazooClient(
hosts="192.168.3.111:2181,192.168.3.112:2181,192.168.3.113:2181"
)
zk.start()
znode = ZNODE_BASE_PATH+"/s"+os.environ['PORT']
def get_server_info():
server_info = (os.environ['URL'], os.environ['PORT'])
return server_info
def is_port_run(ip, port):
nm = nmap.PortScanner()
info = nm.scan(ip, port)
state = info['scan'][ip]['tcp'][int(port)]['state']
ret = False
if state == "open":
ret = True
return ret
server_info = get_server_info()
server_info = json.dumps(server_info).encode("utf-8")
while True:
time.sleep(2)
is_alive = is_port_run("127.0.0.1", "80")
if is_alive:
if not zk.exists(znode):
zk.create(znode, server_info, ephemeral=True, makepath=True)
else:
if zk.exists(znode):
zk.delete(znode)
监控脚本 run.sh
#!/bin/bash
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
nohup python3 /usr/local/is_alive.py &
nginx -g "daemon off"
测试
本测试使用docker,dockerfile如下
FROM centos:latest
RUN yum update -y
RUN yum install python3 -y
RUN yum install nginx -y
RUN yum install nmap -y
RUN pip3 install python-nmap
RUN pip3 install kazoo
ADD is_alive.py /usr/local/is_alive.py
ADD run.sh /usr/local/run.sh
RUN chmod +x /usr/local/run.sh
EXPOSE 80
CMD ["/bin/bash", "/usr/local/run.sh"]
将is_alive.py
、run.sh
、dockerfile
放在同一个目录下
# 构建镜像
docker build --rm -t zktest .
# 启动容器
docker run -e "URL=127.0.0.1" -e "PORT=9091" --name server_1 -p 9091:80 -d -it zktest
docker run -e "URL=127.0.0.1" -e "PORT=9092" --name server_2 -p 9092:80 -d -it zktest
docker run -e "URL=127.0.0.1" -e "PORT=9093" --name server_3 -p 9093:80 -d -it zktest
docker run -e "URL=127.0.0.1" -e "PORT=9094" --name server_4 -p 9094:80 -d -it zktest
docker run -e "URL=127.0.0.1" -e "PORT=9095" --name server_5 -p 9095:80 -d -it zktest
容器启动后zookeeper变化
![](https://img.haomeiwen.com/i4497639/5b9512ca166f01ec.png)
[root@localhost python]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ccfd3667124b zktest "/bin/bash /usr/loca…" 24 seconds ago Up 23 seconds 0.0.0.0:9095->80/tcp server_5
c0e63e0b60a8 zktest "/bin/bash /usr/loca…" 26 seconds ago Up 26 seconds 0.0.0.0:9094->80/tcp server_4
d0a3ab878b91 zktest "/bin/bash /usr/loca…" 27 seconds ago Up 26 seconds 0.0.0.0:9093->80/tcp server_3
b696e7522011 zktest "/bin/bash /usr/loca…" 28 seconds ago Up 27 seconds 0.0.0.0:9092->80/tcp server_2
16ac41ed8493 zktest "/bin/bash /usr/loca…" About a minute ago Up About a minute 0.0.0.0:9091->80/tcp server_1
# 进入容器server_5将nginx停掉
[root@localhost python]# docker exec -it ccfd3667124b /bin/bash
[root@ccfd3667124b /]# ps -aux|grep nginx
root 7 0.0 0.2 103324 7408 pts/0 S+ 05:21 0:00 nginx: master process nginx -g daemon off;
nginx 8 0.0 0.1 122548 4480 pts/0 S+ 05:21 0:00 nginx: worker process
nginx 9 0.0 0.1 122548 4008 pts/0 S+ 05:21 0:00 nginx: worker process
root 85 0.0 0.0 9172 724 pts/1 S+ 05:25 0:00 grep --color=auto nginx
[root@ccfd3667124b /]# kill -9 7
此时zookeeper中s9095节点消失
![](https://img.haomeiwen.com/i4497639/632d7749e4f41dde.png)
网友评论