基於阿里開源的dubbo框架,利用zookeeper作爲註冊中心,利用python模擬rpc協議接口進行測試。
1、首先從pypi上安裝kazoo和dubbo_telnet兩個包
2、利用kazoo連接zk註冊中心拉取服務列表
3、利用dubbo_telnet,通過telnet的方式,模擬rpc的服務調用。
#coding=utf8
import sys
from kazoo.client import KazooClient
import urllib
import urllib3
import json
import telnetlib
import socket
import dubbo_telnet
Host = '192.168.1.1:2181' # zookeeper的地址
def coondoubble_data(servhost, servport,interface,method,param):
try:
# 初始化dubbo對象
conn = dubbo_telnet.connect(servhost, servport)
# 設置telnet連接超時時間
conn.set_connect_timeout(10)
# 設置dubbo服務返回響應的編碼
conn.set_encoding('utf8')
data=conn.invoke(interface, method, param)
return data
except Exception as e:
return e
def get_dubbo_full():
global Host
zk = KazooClient(hosts="{}".format(Host))
zk.start()
urls = []
list = zk.get_children("dubbo")
for i in list:
if 'serv' in i: #關鍵字過濾
# print i
try:
gg = zk.get_children("/dubbo/{}/providers".format(i))
if gg:
for j in gg:
url = urllib.parse.unquote(j)
if url.startswith('dubbo:'):
urls.append(url.split('?')[0].split('dubbo://')[1])
except Exception as e:
print(e)
print(i)
services = {}
for i in urls:
try:
path, service = i.split('/')
if not services.get(path):
services.update({path: []})
services[path].append(service)
except Exception as e:
pass
print(json.dumps(services, indent=4))
def get_dubbo(servername):
global Host
zk = KazooClient(hosts="{}".format(Host))
zk.start()
urls = []
list = zk.get_children("dubbo")
for i in list:
if servername in i:
try:
# 獲取服務發佈方
gg = zk.get_children("/dubbo/{}/providers".format(i))
if gg:
for j in gg:
url = urllib.parse.unquote(j)
if url.startswith('dubbo:'):
urls.append(url.split('dubbo://')[1])
except Exception as e:
print(e)
paths=[]
for i in urls:
try:
path, temp = i.split('/')
service=temp.split('?')[0]
method=temp.split('methods=')[1].split('&')[0].split(',')
paths.append(path)
except Exception as e:
print(e)
services = {"service": service, "paths": paths, "method": method}
print(json.dumps(services, indent=4))
if __name__ == '__main__':
#使用方法get_dubbo('<服務名>')
get_dubbo('com.serv.finance.service.CommReimQueryService__1_0')
get_dubbo('com.serv.finance.ats.CommReimQueryATS__1_0')
param='''{"batSubmitId":null, "logonId":"8ybbmd01.c.0200", "len":"20", "groupId":"020090006110982", "start":"0", "logonLevel":"3", "limitSum1":"40000", "limitSum":"90000000000000000", "endTime":"20200101", "beginTime":"20190101", "batFileName":null, "channelFlag":"1"}'''
#使用方法coondoubble_data('服務提供者ip','服務提供者port','服務名','調用方法','發送數據')
#'服務提供者ip','服務提供者port','服務名','調用方法'從get_dubbo()返回結果中獲取
resp=coondoubble_data("192.168.1.100", "35009", "com.serv.finance.service.CommReimQueryService__1_0", "commReimQueryBatch", param)
print(resp)
代碼並非原創,部分參考了一位前輩的文章,但是忘了出處,特此說明