利用python模擬dubbo+zk框架的rpc接口測試

基於阿里開源的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)

代碼並非原創,部分參考了一位前輩的文章,但是忘了出處,特此說明

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章