python+telnet做dubbo接口测试

 dubbo优势

  • 负载均衡——同一个服务部署在不同的机器时该调用那一台机器上的服务
  • 服务调用链路生成——随着系统的发展,服务越来越多,服务间依赖关系变得错踪复杂,甚至分不清哪个应用要在哪个应用之前启动,架构师都不能完整的描述应用的架构关系。Dubbo 可以为我们解决服务之间互相是如何调用的。
  • 服务访问压力以及时长统计、资源调度和治理——基于访问压力实时管理集群容量,提高集群利用率。
  • 服务降级——某个服务挂掉之后调用备用服务
  • 另外,Dubbo 除了能够应用在分布式系统中,也可以应用在现在比较火的微服务系统中。不过,由于 Spring Cloud 在微服务中应用更加广泛,所以,我觉得一般我们提 Dubbo 的话,大部分是分布式系统的情况。

以上转载于:https://blog.csdn.net/zuozewei/article/details/85333060

测试实践

依赖库:kazoo和dubbo_telnet

kazoo是向zookeeper注册中心获取dubbo接口实例地址

telnet是用来连接实例进行接口调试

过程:查询实例地址,查询方法列表,设计传参发送请求

  • 查询实例地址
    def get_dubbo_services(self):
        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
        zk.stop()
        print(json.dumps(services, indent=4))
  • 查询实例服务提供的方法列表
    def get_dubbo_methods(self, 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:') and url.find("group=" + self.run_env)>=0:
                                urls.append(url.split('dubbo://')[1])
                except Exception as e:
                    zk.stop()
                    print(e)
        paths=[]
        if len(urls)==0:
            print(json.dumps({"error":1, "errorMsg":"urls is null"}, indent=4))
            zk.stop()
            return

        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:
                zk.stop()
                print(e)
        services = {"service": service, "paths": paths, "method": method}
        print(json.dumps(services, indent=4))
        zk.stop()
        return services
  • 向指定方法发送请求
    def send_dubbo_msg(self, servhost, servport, interface, method, param):
        try:
            # 初始化dubbo对象
            conn = dubbo_telnet.connect(servhost, servport)
            # 设置telnet连接超时时间
            conn.set_connect_timeout(5)
            # 设置dubbo服务返回响应的编码
            conn.set_encoding('gbk')
            data=conn.invoke(interface, method, param)
            return data
        except Exception as e:
            print(e)
            return e
  • 使用示例
    #zookeeper的地址
    env = 'test'
    dubbo = dubboHelper(env)

    #返回zk中注册的 每个(主机IP + 端口) 下所有的服务名称
    #dubbo.get_dubbo_services()

    #返回zk中注册的Server所有的服务实例地址和方法名称
    dubbo.get_dubbo_methods(serverName)

    # send_dubbo_msg('服务提供者ip','服务提供者port','服务名','调用方法','发送数据')
    param='{"class":xxx,"appId":xxx,"activityId":xxx,"orderId":"xxx","startTime":xxx,"endTime":xxx}'
    res=dubbo.send_dubbo_msg(host, port, serverName, methodName, param)
    print(res)

你可能感兴趣的:(dubbo,python)