美文网首页Zookeeper
Zookeeper 应用场景六、 服务注册/发现

Zookeeper 应用场景六、 服务注册/发现

作者: 泡水鱼干 | 来源:发表于2021-05-20 16:03 被阅读0次

本文参考:https://www.cnblogs.com/iforever/p/9095095.html
对其中运行docker部分异常进行修改

服务发现

客户端维持zookeeper的一个watcher,监控/sevice/business/what节点下节点变化,来获取可用服务器地址

服务发现.png

上述方法弊端:浪费客户端链接资源,我们可以通过加一级缓存进行判断,缓存存在的情况下不在进行服务获取

服务发现缓存.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.pyrun.shdockerfile放在同一个目录下

# 构建镜像
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变化

006.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节点消失

007.png

相关文章

网友评论

    本文标题:Zookeeper 应用场景六、 服务注册/发现

    本文链接:https://www.haomeiwen.com/subject/zocbjltx.html