Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Model Center   Code  
»áÔ±   
   
 
     
   
 ¶©ÔÄ
  ¾èÖú
·Ö²¼Ê½ÏµÍ³ÖÐzookeeperʵÏÖÅäÖùÜÀí+¼¯Èº¹ÜÀí
 
×÷Õߣº±¼ÅܵÄMan
  1478  次浏览      27
 2020-5-20
 
±à¼­ÍƼö:
ÏÖÔڵķֲ¼Ê½ÏµÍ³´ó²¿·ÖÒѾ­Àë²»¿ªzookeeper£¨»òÕßÀàËÆµÄ½â¾ö·½°¸£©ÁË£¬zookeeper¼ò»¯ÁË·Ö²¼Ê½Ó¦ÓõĹÜÀíºÍ²¿Ê𣬱¾ÎľÍͨ¹ýʵÀýÀ´Ì½ÌÖѧϰÏÂzookeeper¡£
À´×ÔÓÚ²©¿ÍÔ°,ÓÉ»ðÁú¹ûÈí¼þAlice±à¼­¡¢ÍƼö¡£

ÒýÑÔ

֮ǰ¾ÍÁ˽â¹ýkafka£¬¿´µÄËÆ¶®·Ç¶®£¬×î½üÏîÄ¿×éÖÐÒýÈëÁËkafka£¬¸ÕºÃ½Ó×ÅÕâ¸ö»ú»áÔÙ´ÎѧϰÏ¡£

KafkaÔںܶ๫˾±»ÓÃ×÷·Ö²¼Ê½¸ßÐÔÄÜÏûÏ¢¶ÓÁУ¬kafka֮ǰÎÒÖ»ÓùýredisµÄlistÀ´×ö¼òµ¥µÄ¶ÓÁд¦Àí£¬Ò²»¹ËãºÃÓ㬿ÉÄÜÊý¾ÝÁ¿±È½ÏС£¬Ò²Êǵ¥»úÔËÐУ¬Î´³öÏÖ¹ýÎÊÌ⣬ÓÃ×÷ÇáÁ¿¼¶ÏûÏ¢¶ÓÁл¹ÊDZȽϺÃÓõġ£¶øredisµÄ×÷Õßantirez£¬Éè¼ÆredisµÄ³õÖÔ²¢²»ÊÇÓÃÀ´×öÏûÏ¢¶ÓÁУ¬µ«ÓÃËü×öÏûÏ¢¶ÓÁеÄÈËÃ²ËÆ»¹Í¦¶à£¬ÒÔÖÁÓÚºóÀ´antirezºóÀ´Ð¿ªÁ˸öÏîÄ¿disque£¬×¨ÃÅÓÃÀ´×öÏûÏ¢¶ÓÁУ¬µ«Õâ¸ö²»ÊDZ¾ÎĵÄÖØµã¡£

ÔÚÁ˽âkafkaµÄʱºò£¬·¢ÏÖËûÓëzookeeper°ó¶¨µÄ±È½Ï½ôÃÜ£¬ÎªÁ˸üºÃµÄÀí½âkafka£¬ÎÒ±ØÐëÏȽ«zookeeper¸ãÃ÷°×¡£

ZooKeeperÊÇÒ»ÖÖ·Ö²¼Ê½Ð­µ÷·þÎñ£¬ÓÃÓÚ¹ÜÀí´óÐÍÖ÷»ú¡£ÔÚ·Ö²¼Ê½»·¾³ÖÐЭµ÷ºÍ¹ÜÀí·þÎñÊÇÒ»¸ö¸´ÔӵĹý³Ì¡£ZooKeeperͨ¹ýÆä¼òµ¥µÄ¼Ü¹¹ºÍAPI½â¾öÁËÕâ¸öÎÊÌâ¡£ ZooKeeperÔÊÐí¿ª·¢ÈËԱרעÓÚºËÐÄÓ¦ÓóÌÐòÂß¼­£¬¶ø²»±Øµ£ÐÄÓ¦ÓóÌÐòµÄ·Ö²¼Ê½ÌØÐÔ¡£

ÕâÊÇ´Ó»¥ÁªÍøÉÏÒýÓõÄÒ»¶Î»°£¬·Ö²¼Ê½Ó¦Óò»Í¬ÓÚµ¥»úÒýÓã¬Î¬»¤ÆðÀ´·Ç³£¸´ÔÓ£¬ÏÖÔڵķֲ¼Ê½ÏµÍ³´ó²¿·ÖÒѾ­Àë²»¿ªzookeeper£¨»òÕßÀàËÆµÄ½â¾ö·½°¸£©ÁË£¬zookeeper¼ò»¯ÁË·Ö²¼Ê½Ó¦ÓõĹÜÀíºÍ²¿Ê𣬱¾ÎľÍͨ¹ýʵÀýÀ´Ì½ÌÖѧϰÏÂzookeeper¡£

ʵÀý

±¾ÈËÒ²ÊdzÖ×ÅѧϰµÄ̬¶ÈÀ´Ð´±¾ÆªÎÄÕµģ¬ºóÎĵÄʵÀý¶¼Î´ÔÚÉú²ú»·¾³ÖÐʹÓùý£¬¶¼ÊÇѧϰ֮ºóµÄʵ¼ùÕûÀí£¬Æ«ÏòÓÚÓ¦Óã¬¶ÔÆäÖеÄËã·¨Ô­Àí²¢Î´É¡£ÓÐ覴ÃÒÅ©µÄµØ·½»¹Íû¸«Õý¡£

ÅäÖùÜÀí

¼ÙÈ磬ÎÒÃÇÏßÉÏÓиö·þÎñÆ÷¼¯Èº£¬³É°ÙÉÏǧ̨·þÎñÆ÷£¬Èç¹û¸üдúÂëµÄʱºòÔõô¸üÐÂÄØ£¬Ò»Ì¨Ì¨»úÆ÷È¥¸üУ¿¾ÍËãÊÇÇ¿´óµÄ÷è÷ë±ÛÅÀÒ²ÒªÀÛÕÛÁË£¬½ñÌìÎÒÃǾÍÊÔÊÔÓÃzookeeperÀ´¸ø·þÎñÆ÷¼¯Èº²¿Êð´úÂë¡£

Ô­Àí

zookeeperÌṩÁ˽ڵãwatchµÄ¹¦ÄÜ£¬zookeeperµÄclient£¨¶ÔÍâÌṩ·þÎñµÄserver£©¼à¿ØzookeeperÉϵĽڵ㣨znode£©£¬µ±½Úµã±ä¶¯µÄʱºò£¬client»áÊÕµ½±ä¶¯Ê¼þºÍ±ä¶¯ºóµÄÄÚÈÝ£¬»ùÓÚzookeeperµÄÕâ¸öÌØÐÔ£¬ÎÒÃÇ¿ÉÒÔ¸ø·þÎñÆ÷¼¯ÈºÖеÄËùÓлúÆ÷£¨client£©¶¼×¢²áwatchʼþ£¬¼à¿ØÌض¨znode£¬½ÚµãÖд洢²¿Êð´úÂëµÄÅäÖÃÐÅÏ¢£¬ÐèÒª¸üдúÂëµÄʱºò£¬ÐÞ¸ÄznodeÖеÄÖµ£¬·þÎñÆ÷¼¯ÈºÖеÄÿһ̨server¶¼»áÊÕµ½´úÂë¸üÐÂʼþ£¬È»ºó´¥·¢µ÷Ó㬸üÐÂÄ¿±ê´úÂë¡£Ò²¿ÉÒÔºÜÈÝÒ׵ĺáÏòÀ©Õ¹£¬¿ÉÒÔËæÒâµÄÔöɾ»úÆ÷£¬»úÆ÷Æô¶¯µÄʱºò×¢²á¼à¿Ø½Úµãʼþ¼´¿É¡£

ÎҵĻúÆ÷ÊýÁ¿ÓÐÏÞ£¬ÔÚ±¾µØÄ£Äâzookeeper¼¯ÈººÍ·þÎñÆ÷¼¯Èº£¬Ô­Àí¶¼ÊÇÒ»ÑùµÄ£¬¿ÉÄܾßÌåʵʩµÄʱºòÓÐЩСÒì¡£

ÔÚ±¾»úͨ¹ý3¸ö¶Ë¿ÚÄ£Äâzookeeper¼¯Èº£¬¶à¸öĿ¼ģÄâ·þÎñÆ÷¼¯Èº¡£

zookeeperÅäÖÃ

±¾ÎÄÖ»ÊÇÄ£Ä⣬ΪÁË·½±ã£¬ËùÓеĽڵãÈ«ÔÚһ̨»úÆ÷ÉÏ£¬Ð§¹ûÊÇÀàËÆµÄ¡£

´´½¨/path/to/zookeeper/conf/zoo1.cfg £¬ /path/to/zookeeper/conf/zoo2.cfg £¬/path/to/zookeeper/conf/zoo3.cfg Èý¸öÎļþ£¬ÅäÖ÷ֱðÈçÏ£º

zoo1.cfg

tickTime=2000
initLimit=10
syncLimit=5
dataDir=/tmp/zk1/data
dataLogDir=/tmp/zk1/log
clientPort=2181
server.1=localhost:2888:3888
server.2=localhost:2899:3899
server.3=localhost:2877:3877

zoo2.cfg

tickTime=2000
initLimit=10
syncLimit=5
dataDir=/tmp/zk2/data
dataLogDir=/tmp/zk2/log
clientPort=2182
server.1=localhost:2888:3888
server.2=localhost:2899:3899
server.3=localhost:2877:3877

zoo3.cfg

ickTime=2000
initLimit=10
syncLimit=5
dataDir=/tmp/zk3/data
dataLogDir=/tmp/zk3/log
clientPort=2183
server.1=localhost:2888:3888
server.2=localhost:2899:3899
server.3=localhost:2877:3877

ÅäÖÃÎļþÖÐdataDir£¬dataLogDir£¬clientPortÕâÈý¸öÅäÖÃÊÇÓвî±ðµÄ¡£

·Ö±ðÔÚ3¸ö½Úµã¶ÔÓ¦µÄdataDirÖн¨Á¢myidÎļþ£¬ÀïÃæÊäÈë·þÎñÆ÷±êʶºÅ

echo 1 > /tmp/zk1/data/myid
echo 2 > /tmp/zk2/data/myid
echo 3 > /tmp/zk3/data/myid

Æô¶¯Èý¸ö½Úµã

bin/zkServer.sh start conf/zoo1.cfg
bin/zkServer.sh start conf/zoo2.cfg
bin/zkServer.sh start conf/zoo3.cfg

²é¿´Èý¸ö½Úµã£¬¿ÉÒÔ¿´µ½1¡¢3ºÅ½Ó½ÚµãÊÇfollower½Úµã£¬2ºÅ½ÚµãÊÇleader½Úµã

zookeeper bin/zkServer.sh status conf/zoo3.cfg
ZooKeeper JMX enabled by default
Using config: conf/zoo3.cfg
Mode: follower
zookeeper bin/zkServer.sh status conf/zoo2.cfg
ZooKeeper JMX enabled by default
Using config: conf/zoo2.cfg
Mode: leader
zookeeper bin/zkServer.sh status conf/zoo1.cfg
ZooKeeper JMX enabled by default
Using config: conf/zoo1.cfg
Mode: follower

¿Í»§¶Ë´úÂëÄ£Äâ

from kazoo.client import KazooClient
import time
import json
import subprocess
import os

zk = KazooClient(hosts="10.222.76.148:2181, 10.222.76.148:2182, 10.222.76.148:2183")
zk.start()
FILE_DIR = os.path.split(os.path.realpath(__file__))[0]
'''Çл»µ½Ö¸¶¨Îļþ¼Ð£¬²»´æÔڵϰ´´½¨²¢Çл»'''
def go_dir(dir_name):
if os.path.exists(dir_name):
pass
else:
os.makedirs(dir_name)
os.chdir(dir_name)
'''´Ógit»ñÈ¡´úÂë'''
def handle_watch(data):
try:
info = json.loads(data)
if not isinstance(info, dict):
raise Exception("½ÚµãÊý¾Ý²»ÊÇjson´©")
if not "relativePath" in info:
raise Exception("½ÚµãjsonȱÉÙ[relativePath]×Ö¶Î")
if not "url" in info:
raise Exception("½ÚµãjsonȱÉÙ[url]×Ö¶Î")
if not "commitId" in info:
raise Exception("½ÚµãjsonȱÉÙ[commitId]×Ö¶Î")

chdir = os.path.join(FILE_DIR, info["relativePath"])
go_dir(chdir)

print("¿ªÊ¼Ö´ÐÐgit clone ...")
res = subprocess.call(['git', 'status'])

if 0 == res:
res = subprocess.call(['git', 'pull'])
else:
res = subprocess.call(['git', 'clone', info["url"], '.'])
if 0 != res:
raise Exception("clone/pull´úÂëʧ°Ü") commitId = subprocess.check_output(["git", "rev-parse", "HEAD"])
commitId = commitId.decode()
commitId = commitId.strip()
if commitId != info["commitId"]:
raise Exception("ÕýÈ·°æ±¾Id[%s]£¬µ±Ç°°æ±¾Id[%s]" % (commitId, info["commitId"])) except Exception as e:
print(e)
print("¸üÐÂʧ°Ü")
return 1
else:
print("ÕýÈ·°æ±¾Id[%s]£¬µ±Ç°°æ±¾Id[%s]" % (commitId, info["commitId"]))
print("¸üгɹ¦")
return 0
finally:
pass
@zk.DataWatch("/app/business/config")
def watch_node(data, stat):
if data:
data = data.decode("utf-8")
handle_watch(data)
else:
print("Êý¾ÝΪ¿Õ")
while True:
time.sleep(100)
print('tick')

н¨2¸öÎļþ¼ÐÄ£Äâserver¼¯Èº£¬¸´ÖÆclient.pyµ½Ã¿¸ö·þÎñÆ÷ÖÐ

mkdir /tmp/server1
mkdir /tmp/server2

·Ö±ðÔËÐзþÎñÆ÷ÉÏ¼à¿Øzookeeper½Úµã±ä¶¯µÄ´úÂë:

python3 /tmp/server1/client.py
python3 /tmp/server2/client.py

Æô¶¯Ö®ºó£¬Ïñznode½Úµã/app/business/configÖÐдÈëÐÅÏ¢£º

from kazoo.client import KazooClient
import json
zk = KazooClient(hosts="192.168.0.105:2181, 192.168.0.105:2182, 192.168.0.105:2183")
zk.start()
znode = {
"url": "https://github.com/aizuyan/daemon.git",
"commitId": "d5f5f144c66f0a36d452e9e13067b21d3d89b743",
"relativePath": "daemon"
}
znode = json.dumps(znode)
znode = bytes(znode, encoding="utf-8")
zk.set("/app/business/config", znode);

дÍêÖ®ºó£¬»á¿´µ½ÉÏÃæÁ½¸öÄ£ÄâµÄ·þÎñÆ÷»áÂíÉÏÊÕµ½ÐÅÏ¢:

¿ªÊ¼Ö´ÐÐgit clone ...
On branch master
Your branch is up-to-date with 'origin/master'.
nothing to commit, working tree clean
Already up-to-date.
ÕýÈ·°æ±¾Id[aea4096f490ff9556124fa5059ca702cc2acdf0e]£¬µ±Ç°°æ±¾Id[aea4096f490ff9556124fa5059ca702cc2acdf0e]
¸üгɹ¦
¿ªÊ¼Ö´ÐÐgit clone ...
On branch master
Your branch is up-to-date with 'origin/master'.
nothing to commit, working tree clean
Already up-to-date.
ÕýÈ·°æ±¾Id[aea4096f490ff9556124fa5059ca702cc2acdf0e]£¬µ±Ç°°æ±¾Id[aea4096f490ff9556124fa5059ca702cc2acdf0e]
¸üгɹ¦

ÅäºÏÉÏgitµÄhook»úÖÆ£¬¿ÉÒÔ×öÒ»¸öÍêÕûµÄϵͳ£¬µ±´úÂëÓиüеÄʱºò¸üб£´æ´úÂëÐÅÏ¢znodeÉϵÄÊý¾Ý£¬zookeeper pushµ½ËùÓÐwatchÕâ¸ö½ÚµãµÄ·þÎñÆ÷£¬·þÎñÆ÷¸üдúÂ룬ËùÓзþÎñÆ÷Íê³ÉÒ»´Î¸üвÙ×÷¡£

·þÎñ·¢ÏÖ

Ô­Àí

×¢²áÒ»¸ö³Ö¾Ã½Úµã/service/business/what£¬ËûÏÂÃæµÄÿ¸ö×ӽڵ㶼ÊÇÒ»¸ö¿ÉÓ÷þÎñ£¬±£´æÁË·þÎñµÄµØÖ·¶Ë¿ÚµÈÐÅÏ¢£¬·þÎñµ÷ÓÃÕßͨ¹ýzookeeper»ñÈ¡/service/business/whatËùÓÐ×Ó½ÚµãÐÅÏ¢À´µÃµ½¿ÉÓõķþÎñ¡£ÏÂÃæµÄ½Úµã¶¼ÊÇÁÙʱ½Úµã£¬·þÎñÆ÷Æô¶¯µÄʱºò»á¹ýÀ´×¢²áÒ»¸öÁÙʱ½Úµã£¬·þÎñÆ÷¹ÒµôÖ®ºó»òÖ÷¶¯¹Ø±ÕÖ®ºó£¬ÁÙʱ½Úµã»á×Ô¶¯ÒƳý£¬ÕâÑù¾Í¿ÉÒÔ±£Ö¤Ê¹ÓÃÕß»ñÈ¡µÄwhat·þÎñ¶¼ÊÇ¿ÉÓõ쬶øÇÒ¿ÉÒÔ¶¯Ì¬µÄÀ©ÈÝËõÈÝ¡£

ÎÒÔÚ±¾µØÍ¨¹ýdockerÀ´Ä£Äâ·þÎñÆ÷¼¯Èº£¬¼¯ÈºÖеÄËùÓÐnginx¶¼Í¨¹ý¸÷×ÔµÄ80¶Ë¿Ú¶ÔÍâÌṩ·þÎñ¡£Í¨¹ýpython-nmap¶¨Ê±É¨Ãè¶Ë¿ÚÕ¼ÓÃÇé¿ö£¬Èç¹ûÊÇopen״̬Ôò¿É¶ÔÍâÌṩ·þÎñ£¬Èç¹ûÊÇclosed״̬£¬ÔòÍ£Ö¹¶ÔÍâÌṩ·þÎñ¡£Èç¹ûÓÉÓÚÍøÂç¶¶¶¯É¾³ýÁËÁÙʱ½Úµã£¬ÍøÂç»Ö¸´Ö®ºó£¬»áÖØÐÂɨÃèµ½×ÔÉí·þÎñ¿ÉÓã¬È»ºó´´½¨ÁÙʱ½Úµã¡£

¼à¿Ø·þÎñ

ÈÝÆ÷ÖÐÆô¶¯Ò»¸önginx£¬Í¨¹ýÒ»¸ö½ø³Ì¼à¿Ønginx°ó¶¨µÄ¶Ë¿Ú£¬µ±¶Ë¿Ú¶ÔÍâÌṩ·þÎñʱ£¬ÎÒ¾ÍÈÏΪ·þÎñ¿ÉÓ㬵±¶Ë¿ÚÍ£Ö¹¶ÔÍâÌṩ·þÎñʱ£¬ÎÒ¾ÍÈÏΪ·þÎñ²»¿ÉÓã¬ÏàÓ¦µÄɾ³ý»òÕß´´½¨ÁÙʱ½Úµã£¬´úÂëÈçÏÂËùʾ£º

from kazoo.client import KazooClient
import time
import nmap
import os
import json
ZNODE_BASE_PATH="/service/business/what/"
zk = KazooClient(
hosts="192.168.0.105:2181, 192.168.0.105:2182, 192.168.0.105:2183"
)
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)

dockerÅäÖÃ

ÿ¸ö·þÎñÆ÷°ó¶¨µÄ¶Ë¿ÚÐÅϢͨ¹ýdockerÔËÐеÄʱºò´«Èë²ÎÊý¾ö¶¨£¬ÕâÑù¾Í¿ÉÒÔͨ¹ýͬһ¸ö¾µÏñ·½±ãµÄ´´½¨¶à¸öÈÝÆ÷ʵÀýÁË£¬·½±ã¿ì½Ý£¬ÏÂÃæÊÇdockerfile:

FROM python:latest
MAINTAINER Liam Yan
# À©³äÔ´
RUN grep '^deb ' /etc/apt/sources.list | sed 's/^deb/deb-src/g' > /etc/apt/sources.list.d/deb-src.list
RUN apt-get update -y
RUN apt-get install nginx -y
RUN mkdir /usr/share/nginx/logs
RUN apt-get install nmap -y
RUN pip3 install python-nmap
RUN pip3 install kazoo
ADD nginx.conf /etc/nginx/nginx.conf
ADD is_alive.py /usr/local/is_alive.py
ADD run.sh /usr/local/run.sh
EXPOSE 80
CMD ["/bin/bash", "/usr/local/run.sh"]

ÆäÖÐnginx.confÊÇÈÝÆ÷ÖеÄnginxÅäÖÃÎļþ£¬×î¼òµ¥µÄ¾Í¿ÉÒÔ£¬Ö»Òª¿ÉÒÔÑéÖ¤¸Ã·þÎñÆ÷ÊÇ·ñ¿ÉÓü´¿É£¬µ«Ò»¶¨Òª×¢Ò⣬ҪÔÚnginxÅäÖÃÎļþÖмÓÈëdaemon off;£¬²»È»docker¿ÉÄÜ»áÆô¶¯Ö®ºóÂíÉÏÍ˳ö¡£is_alive.py¾ÍÊÇÉÏÃæµÄÓÃÀ´¼ì²âÈÝÆ÷ÖеķþÎñÊÇ·ñ¿ÉÓá£run.shÄÚÈÝÈçÏ£¬Æô¶¯Ò»¸öºǫ́¼à¿Ø½ø³ÌÖ®ºó£¬ÔÙÆô¶¯nginx¡£

nohup python3 /usr/local/is_alive.py &
nginx

´´½¨¾µÏñ²¢ÔËÐÐ

ͨ¹ýdockerfile´´½¨¾µÏñdocker build --rm -t zookeeper_test .£¬´´½¨³É¹¦Ö®ºóÔËÐÐ5¸ö·þÎñÆ÷£º

docker run -e "URL=127.0.0.1" -e "PORT=9099" --name yrt5 -p 9099:80 -d nzookeeper_test
docker run -e "URL=127.0.0.1" -e "PORT=9098" --name yrt4 -p 9098:80 -d nzookeeper_test
docker run -e "URL=127.0.0.1" -e "PORT=9097" --name yrt3 -p 9097:80 -d nzookeeper_test
docker run -e "URL=127.0.0.1" -e "PORT=9096" --name yrt2 -p 9096:80 -d nzookeeper_test
docker run -e "URL=127.0.0.1" -e "PORT=9095" --name yrt1 -p 9095:80 -d nzookeeper_test

Æô¶¯Ö®ºóÔËÐÐdocker ps -a£¬¿ÉÒÔ¿´µ½£¬¶Ë¿Ú¿ÉÒÔËæ±ãÈ¡£¬Ö»Òª±ð³åÍ»¾ÍÐУ¬

zookeeper git:(master) docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5ae23ae351ed nginx_python_alive "/bin/bash /usr/loca¡­" Less than a second ago Up 2 seconds 0.0.0.0:9096->80/tcp yrt5
e4a961e7853e nginx_python_alive "/bin/bash /usr/loca¡­" 44 seconds ago Up 49 seconds 0.0.0.0:9095->80/tcp yrt4
f96650b188be nginx_python_alive "/bin/bash /usr/loca¡­" 35 minutes ago Up 35 minutes 0.0.0.0:9099->80/tcp yrt3
084f71db25f2 nginx_python_alive "/bin/bash /usr/loca¡­" 35 minutes ago Up 35 minutes 0.0.0.0:9090->80/tcp yrt2
159199bee2ed nginx_python_alive "/bin/bash /usr/loca¡­" 36 minutes ago Up 36 minutes 0.0.0.0:8080->80/tcp yrt1

¶ÔÍâÌṩ·þÎñ

ͨ¹ý¶ÁÈ¡/service/business/what½ÚµãϵÄËùÓÐ×Ó½Úµã¾Í¿ÉÒÔ»ñÈ¡µ½ËùÓеĿÉÓ÷þÎñ£¬´úÂëÈçÏ£º

from kazoo.client import KazooClient
import json

def get_servers():
zk = KazooClient(hosts="192.168.0.105:2181, 192.168.0.105:2182, 192.168.0.105:2183")
zk.start()
ZNODE = "/service/business/what"
children = zk.get_children(ZNODE)
servers = []
for child in children:
child_znode = ZNODE + "/" + child
child_server_info, stat = zk.get(child_znode)
child_server_info = child_server_info.decode()
child_server_info = json.loads(child_server_info)
servers.append(child_server_info[0] + ":" + child_server_info[1])
return servers

ÔËÐÐÖ®ºóµÃµ½¿ÉÓ÷þÎñÁбí['127.0.0.1:9096', '127.0.0.1:9095', '127.0.0.1:8080', '127.0.0.1:9099', '127.0.0.1:9090']£¬Ê¹ÓÃÕßÖ»ÐèÒªËæ»úÑ¡ÔñÒ»¸öʹÓþͿÉÒÔÁË¡£

³ý´ËÖ®Í⣬»¹¿ÉÒÔÔÚ´Ózookeeper»ñÈ¡¿ÉÓ÷þÎñÁбíµÄʱºò¼ÓÒ»²ã»º´æ£¬Ìá¸ßÐÔÄÜ£¬¶îÍâÒ»¸ö½ø³Ìwatch/service/business/whatµÄ×Ó½Úµã±ä¶¯£¬µ±ÓÐ×Ó½Úµã±ä¶¯µÄʱºò£¬É¾³ý»º´æ£¬ÕâÑù¾Í¿ÉÒÔ×öµ½»º´æÖеÄÄÚÈÝ'ʱʱ'ºÍzookeeperÖб£³ÖÒ»ÖÂÁË

ÔÚkafkaÖеÄ×÷ÓÃ

ÖÁ´Ë´ó¸Å¶ÔzookeeperÔÚʵ¼ÊÓ¦ÓÃÖеÄ×÷ÓÃÓÐÁË´ó¸ÅÁ˽⣬Õâ¶ÔÎÒÀí½âËûÔÚkafkaÖеÄ×÷ÓÃÓкܴóµÄ°ïÖú¡£ÔÚkafkaÖУ¬zookeeper¸ºÔðµÄÊÇ´æ´¢kafkaÖеÄÔªÊý¾ÝÐÅÏ¢£¬¶ÓÁеÄÊý¾ÝÊDz»»á´æ´¢µ½zookeeperµÄ£¬kafkaÊÇ·Ö²¼Ê½µÄ£¬zookeeperЭµ÷broker¡¢producer¡¢consumerÖ®¼äµÄ¹ØÏµ£¬µ±ÓÐеĽÇÉ«¼ÓÈëµÄʱºò£¬¸üÐÂzookeeperÖеÄÊý¾Ý£¬ÆäËû½ÇÉ«¾Í¿ÉÒԵõ½Í¨Öª£¬²¢×÷³öÏàÓ¦µÄµ÷Õû£¬²»ÐèҪͣ»ú¸üÐÂÅäÖã¬×öµ½¶¯Ì¬À©ÈÝ¡£ÏÂͼÀ´×Ô»¥ÁªÍø£¬±È½ÏÇåÎúµÄչʾÁËzookeeperÖд洢µÄkafkaÔªÐÅÏ¢Êý¾Ý¡£

zookeeperÔÚkafkaÖг䵱µÄ¸üÏñÊÇ·Ö²¼Ê½·þÎñÖÐÅäÖÃÖÐÐĵĽÇÉ«£¬ËùÓÐÅäÖÃÐÅÏ¢¡¢¹«¹²ÐÅÏ¢¶¼¶ªµ½ÕâÀïÀ´ÁË£¬´ËΪÎáÖ®ÓÞ¼û£¬Íû¸«Õý

 

   
1478 ´Îä¯ÀÀ       27
Ïà¹ØÎÄÕÂ

ÆóÒµ¼Ü¹¹¡¢TOGAFÓëArchiMate¸ÅÀÀ
¼Ü¹¹Ê¦Ö®Â·-ÈçºÎ×öºÃÒµÎñ½¨Ä££¿
´óÐÍÍøÕ¾µçÉÌÍøÕ¾¼Ü¹¹°¸ÀýºÍ¼¼Êõ¼Ü¹¹µÄʾÀý
ÍêÕûµÄArchimateÊÓµãÖ¸ÄÏ£¨°üÀ¨Ê¾Àý£©
Ïà¹ØÎĵµ

Êý¾ÝÖÐ̨¼¼Êõ¼Ü¹¹·½·¨ÂÛÓëʵ¼ù
ÊÊÓÃArchiMate¡¢EA ºÍ iSpace½øÐÐÆóÒµ¼Ü¹¹½¨Ä£
ZachmanÆóÒµ¼Ü¹¹¿ò¼Ü¼ò½é
ÆóÒµ¼Ü¹¹ÈÃSOAÂ䵨
Ïà¹Ø¿Î³Ì

ÔÆÆ½Ì¨Óë΢·þÎñ¼Ü¹¹Éè¼Æ
ÖÐ̨սÂÔ¡¢ÖÐ̨½¨ÉèÓëÊý×ÖÉÌÒµ
ÒÚ¼¶Óû§¸ß²¢·¢¡¢¸ß¿ÉÓÃϵͳ¼Ü¹¹
¸ß¿ÉÓ÷ֲ¼Ê½¼Ü¹¹Éè¼ÆÓëʵ¼ù
×îл¼Æ»®
DeepSeekÔÚÈí¼þ²âÊÔÓ¦ÓÃʵ¼ù 4-12[ÔÚÏß]
DeepSeek´óÄ£ÐÍÓ¦Óÿª·¢Êµ¼ù 4-19[ÔÚÏß]
UAF¼Ü¹¹ÌåϵÓëʵ¼ù 4-11[±±¾©]
AIÖÇÄÜ»¯Èí¼þ²âÊÔ·½·¨Óëʵ¼ù 5-23[ÉϺ£]
»ùÓÚ UML ºÍEA½øÐзÖÎöÉè¼Æ 4-26[±±¾©]
ÒµÎñ¼Ü¹¹Éè¼ÆÓ뽨ģ 4-18[±±¾©]
 
×îÐÂÎÄÕÂ
¼Ü¹¹Éè¼Æ-̸̸¼Ü¹¹
ʵÏÖSaaS£¨Èí¼þ¼°·þÎñ£©¼Ü¹¹Èý´ó¼¼ÊõÌôÕ½
µ½µ×ʲôÊÇÊý¾ÝÖÐ̨£¿
ÏìӦʽ¼Ü¹¹¼ò½é
ÒµÎñ¼Ü¹¹¡¢Ó¦Óüܹ¹ÓëÔÆ»ù´¡¼Ü¹¹
×îпγÌ
Èí¼þ¼Ü¹¹Éè¼Æ·½·¨¡¢°¸ÀýÓëʵ¼ù
´Ó´óÐ͵çÉ̼ܹ¹Ñݽø¿´»¥ÁªÍø¸ß¿ÉÓüܹ¹Éè¼Æ
´óÐÍ»¥ÁªÍø¸ß¿ÉÓüܹ¹Éè¼ÆÊµ¼ù
ÆóÒµ¼Ü¹¹Ê¦ (TOGAF¹Ù·½ÈÏÖ¤)
ǶÈëʽÈí¼þ¼Ü¹¹Éè¼Æ¡ª¸ß¼¶Êµ¼ù
³É¹¦°¸Àý
ijÐÂÄÜÔ´µçÁ¦ÆóÒµ Èí¼þ¼Ü¹¹Éè¼Æ·½·¨¡¢°¸ÀýÓëʵ¼ù
Öк½¹¤ÒµÄ³Ñо¿Ëù ǶÈëʽÈí¼þ¿ª·¢Ö¸ÄÏ
ij¹ìµÀ½»Í¨ÐÐÒµ ǶÈëʽÈí¼þ¸ß¼¶Éè¼ÆÊµ¼ù
±±¾© º½Ìì¿Æ¹¤Ä³×Ó¹«Ë¾ Èí¼þ²âÊԼܹ¹Ê¦
±±¾©Ä³ÁìÏÈÊý×ÖµØÍ¼ ¼Ü¹¹Ê¦£¨Éè¼Æ°¸Àý£©