测试开发 -- python实现dubbo接口的调用

2023-10-29

由于公司使用基于Java语言的
Dubbo技术栈,而本人对Python技术栈更为熟悉。为了使不懂JAVA代码的同学也能进行Dubbo接口层的测试,总结一个通过python实现dubbo接口调用的实现方案。

一、实现原理:

根据Dubbo官方文档中提到的:dubbo可以通过telnet命令进行服务治理,可以通过telnet链接dubbo服务,再通过invoke方法调用dubbo接口
详情见​​http://dubbo.apache.org/zh-cn/docs/user/references/telnet.html
在这里插入图片描述在这里插入图片描述

而在Python中有一个第三方包 telnetlib,所以我们可以通过这个包来执行telnet命令,进而对dubbo接口进行调用

通过上面官方文档截图,我们可以看到,当我们拿到dubbo服务的IP和端口号,就能去调用指定的dubbo接口了。下面,让我们一步步来实现

二、dubbo架构:

在这里插入图片描述

调用关系说明 服务容器负责启动,加载,运行服务提供者。 服务提供者在启动时,向注册中心注册自己提供的服务。
服务消费者在启动时,向注册中心订阅自己所需的服务。
注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。
服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。
服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。 Dubbo
架构具有以下几个特点,分别是连通性、健壮性、伸缩性、以及向未来架构的升级性。

通过上面架构图我们可以类似 zookeeper 这样的服务注册中心找到对应的服务,所部署的机器和端口
在这里插入图片描述
也通过dubbo-monitor上面进行查询在这里插入图片描述

三、python实现dubbo的调用

通过上述收到查到到要调用的dubbo接口所处的服务器IP和端口,我们就可以通过python实现dubbo的调用了。详细代码如下:

import re
import telnetlib
import time
import logging

logging.basicConfig(level = logging.INFO,format = '%(asctime)s - %(name)s - %(levelname)s - %(message)s')
logger = logging.getLogger(__name__)

'''
方法调用案例:
conn = InvokeDubboApi('127.0.0.1:88888')
data = {
    'dubbo_service': 'xxx.xxx.xx.xxxx.xxxx.xxxx.Service',
    'dubbo_method': 'xxxxx',
    'parameters': ({"age":41,"name":"tom"},"sh",564645,)
    }
invoke = json.loads(conn.invoke_dubbo_api(data))
conn.logout()
'''

class TelnetClient(object):
    """通过telnet连接dubbo服务, 执行shell命令, 可用来调用dubbo接口
    """

    def __init__(self, server_host, server_port):
        self.conn = telnetlib.Telnet()
        self.server_host = server_host
        self.server_port = server_port

    # telnet登录主机
    def connect_dubbo(self):
        try:
            logging.info("telent连接dubbo服务端: telnet {} {} ……".format(self.server_host, self.server_port))
            self.conn.open(self.server_host, port=self.server_port)
            return True
        except Exception as e:
            logging.info('连接失败, 原因是: {}'.format(str(e)))
            return False

    # 执行传过来的命令,并输出其执行结果
    def execute_command(self, command):
        # 执行命令
        cmd = 'invoke {}\n'.format(command).encode("utf-8")
        self.conn.write(cmd)
        # 初始化调用次数
        invoke_count = 0
        # 若调用无返回时,记录次数并重试
        result = self.conn.read_very_eager().decode(encoding='utf-8').split('\r\n')[0]
        while result == '':
            time.sleep(1)
            result = self.conn.read_very_eager().decode(encoding='utf-8').split('\r\n')[0]
            invoke_count += 1
            if invoke_count>=5:
                logging.info("调用dubbo接口超过五次,调用失败")
                return '调用dubbo接口失败'
        return result
    # 退出telnet
    def logout_host(self):
        self.conn.write(b"exit\n")
        logging.info("登出成功")

class InvokeDubboApi(object):

    def __init__(self, content):
        #解析dubbo部署的ip和port
        try:
            dubboaddrre = re.compile(r"([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+:[0-9]+)", re.I)
            result = dubboaddrre.search(str(content)).group()
            server_host = result.split(":")[0]
            server_port = result.split(":")[1]
            logging.info("获取到dubbo部署信息" + result)
        except Exception as e:
            raise Exception("获取dubbo部署信息失败:{}".format(e))

        try:
            self.telnet_client = TelnetClient(server_host, server_port)
            self.login_flag = self.telnet_client.connect_dubbo()
        except Exception as e:
            logging.info("invokedubboapi init error" + e)

    #调用dubbo接口
    def invoke_dubbo_api(self, data):
        cmd = data.get("dubbo_service") + "." + data.get("dubbo_method") + "{}".format(data.get("parameters"))
        logging.info("调用命令是:{}".format(cmd))
        resp = None
        try:
            if self.login_flag:
                result= self.telnet_client.execute_command(cmd)
                logging.info("接口响应是,result={}".format(resp))
                return result
            else:
                logging.info("登陆失败!")
        except Exception as e:
            raise Exception("调用接口异常, 接口响应是result={}, 异常信息为:{}".format(result, e))
        self.logout()

    # 调用多个dubbo接口,注:确保所有接口是同一个ip和port
    def invoke_dubbo_apis(self,datas):
        summary = []
        if isinstance(datas,list):
            for i in range(len(datas)):
                result = self.invoke_dubbo_api(datas[i])
                summary.append({"data":datas[i],"result":result})
            return summary
        else:
            return "请确认入参是list"

    def logout(self):
        self.telnet_client.logout_host()

if __name__ == '__main__':
    data = {
        'dubbo_service': 'xxx.xxx.xx.xxxx.xxxx.xxxxService',
        'dubbo_method': 'xxxxx',
        'parameters': ({"id":"123456789","mobile":12456},)
    }
    i = InvokeDubboApi('127.0.0.1:110741')
    i.invoke_dubbo_api(data)
    i.logout()

请求结果:
在这里插入图片描述

四、注意事项

1、请求参数

数据data中的参数字段parameters是一个元组,后面的 ‘,’ 不能少

2、请求参数异常

请求Dubbo接口如果填入的参数有误,会报 no such method 的错误,请检查一下参数是否正常

3、当要批量请求时

传入的参数必须是list,且需要同样的IP和端口。。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

测试开发 -- python实现dubbo接口的调用 的相关文章

随机推荐

  • 【干货】MySQL底层架构设计,你了解多少?

    很多开发同学对SQL优化如数家珍 却对MySQL架构一知半解 岂不是只见树叶 不见森林 终将陷入细节中不能自拔 今天就一块学习MySQL分层架构 深入了解MySQL底层实现原理 以及每层的作用 我们常见的SQL优化到底在哪一层做了优化 小伙
  • vs code使用power mode设置鼠标光标动效

    记录一个开发的题外话 vs code编辑器使用插件 power mode来设置鼠标光标动效 如下 1 vscode 安装 power mode插件 2 打开vscode编辑器 文件 首选项 设置 设置界面 开启power mode插件 设置
  • [Pyhon疫情大数据分析] 三.新闻信息抓取及词云可视化、文本聚类和LDA主题模型文本挖掘

    思来想去 虽然很忙 但还是挤时间针对这次肺炎疫情写个Python大数据分析系列博客 包括网络爬虫 可视化分析 GIS地图显示 情感分析 舆情分析 主题挖掘 威胁情报溯源 知识图谱 预测预警及AI和NLP应用等 希望该系列线上远程教学对您有所
  • 数据结构 算法大全 基础篇

    数据结构和算法是计算机科学中的两个重要部分 它们对于编写高效 可扩展性强的程序非常重要 数据结构是一种组织和存储数据的方式 它包括一些基本的数据结构 例如数组 链表 栈 队列 树 图等等 数据结构的选择取决于所要解决的问题和使用场景 因此需
  • centos服务器系统下安装python3并与自带的python2

    centos服务器系统下安装python3并与自带的python2 在centos中 自带有python2 因此需要经常安装python3 但是这里有一个坑 就是centos的yum是用python2写的 如果正常编译安装python3 那
  • GDB调试原理

    本地调试gdb 桌面调试主要是本地调试 以gdb为例 1 1 1 gdb调试原理 1 未执行进程调试 启用gdb调试运行gdb test的时候 在操作系统里发生了很多复杂的事情 系统首先会启动gdb进程 这个进程会调用系统函数fork 来创
  • 规则引擎Drools使用 第十四篇 Spring整合Drools

    使用Spring管理整合drools 首先需要引入依赖 然后配置spring文件 引入依赖
  • 基于stm32F103C8T6的智能门禁(毕业设计)

    刷卡 分享一期 RC522刷卡模块做的门禁系统 上面是视频呈现 功能文字说明 拓展空间非常大 识别卡号以及卡类并显示 刷管理卡 按下按键 提示刷卡录入 刷未录入的卡即可录入 刷用户卡 按下按键 提示刷卡录入 刷未录入的卡即可录入 再次刷卡
  • 【Cesium入门】一、Cesium安装部署运行

    1 介绍 CesiumJS是一个用于Web上3D地图的JavaScript库 开发者通过Cesium 实现无插件的创建三维球 Cesium通过WebGL技术实现图形的硬件加速 并且跨平台 跨浏览器 2 Cesium项目下载 1 在官网下载压
  • java arraylist<>_Java ArrayList

    Java ArrayList的构造方法和方法 Constructor Summary Constructors ConstructorDescription Constructs an empty list with an initial
  • STM32+AIR800关于温湿度采集上传阿里云以及进行云端下发指令简单的控制

    一 主要功能实现 1 STM32采集温湿度上传至阿里云 进行云端显示 2 云端下发指令控制STM32的LED亮灭 直接控制STM32 A 的LED亮灭 以及设置定时时间自动打开和关闭LED 3 云端下发指令通过NRF24L01间接控制第二个
  • Qt学习笔记:自定义窗体的移动+控件图标

    在这里首先感谢刘大师的作品 Qt编写通用主界面导航 开源 贴上演示 本博客主要是研究了刘大师的作品然后自己总结 做点笔记 不喜勿喷 废话不多说 先贴出代码解析一下 AppInit Instance gt start 单例模式 Instanc
  • sublime的代码错误提示 挺好!后面啥问题怎么显示那个结果???

    sublime的代码错误提示 挺好 后面啥问题怎么显示那个结果 两套软件运行一样的代码结果还不一样 code blocks 每次运行还不一样的
  • 华为swot分析2020_【分析】鸿蒙2.0要来?华为开发者大会2020时间确认!

    昨天晚上九点半 华为终端官方微博正式宣布 将在2020年9月1 0日至 9 月12日正式举办华为开发者大会 HDC2020 这次大会将在广东东莞 松山湖举行 关于华为开发者大会我这里再简单讲讲 这是华为面向信息与通信领域全球开发者大会的年度
  • odoo部署极简3分钟,浏览器编程

    本篇文章将给各位小伙伴们来带重大福利 使用odoo镜像搭建一套完整的开发环境 3分钟就能让你在本地启动odoo并开发程序 不需要你安装python 不需要你安装pycharm 不需要你安装数据库 甚至都不需要你clone odoo代码 对你
  • 石墨文档,幕布,Effie,开箱评论者写出好评或差评之前的选择……

    拿着鸡蛋换石头这样的故事 多是出现在笑话大全里 想到这个画面让人觉得交易中买家脑子似乎坏掉了 笑话揭露了不公平 可在这商贾云集的当下 不对等的交易却屡见不鲜 当偶然成为了小概率 继而转变成潜移默化之后 买东西就成了一场不明就里的 押宝 谁都
  • sybase :数据库不能打开的解决办法(状态装载或可疑)

    平台资料 操作系统平台 Windows 2000 5 00 2195 Service Pack 4 数据库平台 Sysbase 12 5 server db jc database db text db jd db jh db app 现象
  • python中strip()函数的详解

    一 背景 最近对于字符串处理的过程中对strip 函数的功能不是很了解 此篇博客就对strip 函数进行解读 strip函数的解释 就字面上的意思就是 返回删除前导和尾随空格的字符串副本 如果给定了chars而不是None 则删除chars
  • 高德地图的测试key_获取高德地图key

    概述 高德地图key的设置位于系统 APP iPhone App 设置 SDK设置中 它主要用于定位 如门店系统中 开启定位 可以从APP上看到距离最近的门店 定位功能可实现 但在后台中无配置组件 如要在APP中使用定位功能 请联系响站技术
  • 测试开发 -- python实现dubbo接口的调用

    由于公司使用基于Java语言的 Dubbo技术栈 而本人对Python技术栈更为熟悉 为了使不懂JAVA代码的同学也能进行Dubbo接口层的测试 总结一个通过python实现dubbo接口调用的实现方案 一 实现原理 根据Dubbo官方文档