谁说dubbo接口只能Java调用,我用Python也能轻松稿定

news2024/11/25 7:21:39

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

01、实现原理

根据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接口了。下面,让我们一步步来实现

02、dubbo架构

在这里插入图片描述

调用关系说明 服务容器负责启动,加载,运行服务提供者。服务提供者在启动时,向注册中心注册自己提供的服务。

服务消费者在启动时,向注册中心订阅自己所需的服务。

注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。

服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。

服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。

Dubbo架构具有以下几个特点,分别是连通性、健壮性、伸缩性、以及向未来架构的升级性。

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

03、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 = ''.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()


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

04、注意事项

请求参数

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

请求参数异常

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

当要批量请求时

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


             【下面是我整理的2023年最全的软件测试工程师学习知识架构体系图】


一、Python编程入门到精通


二、接口自动化项目实战 

三、Web自动化项目实战


四、App自动化项目实战 

五、一线大厂简历


六、测试开发DevOps体系 

七、常用自动化测试工具


八、JMeter性能测试 

九、总结(尾部小惊喜)

生命不息,奋斗不止。每一份努力都不会被辜负,只要坚持不懈,终究会有回报。珍惜时间,追求梦想。不忘初心,砥砺前行。你的未来,由你掌握!

生命短暂,时间宝贵,我们无法预知未来会发生什么,但我们可以掌握当下。珍惜每一天,努力奋斗,让自己变得更加强大和优秀。坚定信念,执着追求,成功终将属于你!

只有不断地挑战自己,才能不断地超越自己。坚持追求梦想,勇敢前行,你就会发现奋斗的过程是如此美好而值得。相信自己,你一定可以做到!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/786226.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

裂缝处理优化策略

裂缝缺陷检测:检测道路中的裂缝,无项目背景 数据:分为两类,正常、裂缝 方案介绍 数据预处理 将原始数据标签处理为两类,正常和裂缝原始图片均为320*480,使用的显卡为2080,内存足够,不进行图片大小调整模型后处理 二分类使用softmax处理,使用最大值作为结果分类效…

操作系统第五章 错题整理

5.1 设备控制器也就是IO控制器 A对于一些简单的IO设备 控制他也许用不到IO寄存器 B 只是设备控制器与CPU(主机)交互的接口 D 只是 接口 C 对IO控制器所接收到的CPU的信息进行译码 并送到外设中 IO逻辑是个芯片 数据通路是逻辑上的 实际上还是通过总线 …

SpringBoot复习:(2)Tomcat容器是怎么启动的?

SpringApplication的run方法包含如下代码: 其中调用的refreshContext代码如下: 其中调用的refresh方法片段如下: 其中调用的refresh方法代码如下: 其中调用的super.refresh方法代码如下: public void refresh() th…

STM32CUBUMX配置RS485(中断接收)--保姆级教程

———————————————————————————————————— ⏩ 大家好哇!我是小光,嵌入式爱好者,一个想要成为系统架构师的大三学生。 ⏩最近在开发一个STM32H723ZGT6的板子,使用STM32CUBEMX做了很多驱动&#x…

python selenium爬虫自动登录实例

拷贝地址:python selenium爬虫自动登录实例_python selenium登录_Ustiniano的博客-CSDN博客 一、概述 我们要先安装selenium这个库,使用pip install selenium 命令安装,selenium这个库相当于机器模仿人的行为去点击浏览器上的元素&#xff0…

24 ==比较的是地址在.equals比较的是内容

public class Demo1 {public static void main(String[] args) {byte[] arr {97,98,99};String s1 new String(arr);String s2 new String(arr);System.out.println(s1s2);System.out.println(s1.equals(s2));} }

pgvector 源码分析

简介 pgvector 库是一种用于计算向量距离的库,它的核心是提供了聚类索引,棸类索引使用的算法是 kmeans(相对于 kmeans 最主要的区别是初始化起点的位置)。 pgvector 索引的存储结构 meta page → list page → entry page inse…

vue2和vue3关于class类的绑定以及style的绑定的区别

本篇为个人笔记 1.对于class类的绑定的区别 vue2:对于vue2而言&#xff0c;所有类的绑定都是基于对象{}来进行的 例如&#xff1a;单个类绑定 <div :class"{active:isActive}"></div> 多个类绑定&#xff1a; <div :class"{active,hasError…

CNN(卷积神经网络)的实现过程详解

概要 在图像处理领域&#xff0c;CNN(卷积神经网络)处于绝对统治地位&#xff0c;但对于CNN具体是如何用神经网络实现的&#xff0c;能找到的介绍要么是一大堆数学公式&#xff0c;要么是大段晦涩的文字说明&#xff0c;读起来很是辛苦&#xff0c;想写好一片完整的而且有深度的…

【java安全】RMI

文章目录 【java安全】RMI前言RMI的组成RMI实现Server0x01 编写一个远程接口0x02 实现该远程接口0x03 Registry注册远程对象 Client 小疑问RMI攻击 【java安全】RMI 前言 RMI全称为&#xff1a;Remote Method Invocation 远程方法调用&#xff0c;是java独立的一种机制。 RM…

软件检测报告CMA/CNAS标识加盖和不加盖的区别在哪?

在生活中&#xff0c;我们经常会听到CMA(中国计量认证)和CNAS(中国合格评定国家认可委员会)这两个标识&#xff0c;尤其在软件检测领域更是如此。那么&#xff0c;软件检测报告CMA/CNAS标识加盖和不加盖有哪些区别呢CMA和CNAS认可的软件测评机构又有什么样的好处呢?本文将为您…

各电商平台api接口开发系列(数据分享)接口封装高并发

淘宝API接口就是第三方公司&#xff0c;通过淘宝开放平台接入淘宝数据&#xff0c;并进行再开发&#xff0c;将功能封装打包成函数&#xff0c;客户只需要传入参数&#xff0c;接收返回值就可以实现具体功能&#xff0c;其他1688&#xff0c;京东&#xff0c;拼多多以及海外跨境…

[Android 13]Input系列--触摸事件在应用进程的分发和处理

hongxi.zhu 2023-7-21 Android 13 前面我们已经梳理了input事件在native层的传递&#xff0c;这一篇我们接着探索input事件在应用中的传递与处理&#xff0c;我们将按键事件和触摸事件分开梳理&#xff0c;这一篇就只涉及触摸事件。 一、事件的接收 从前面的篇幅我们知道&…

STM32CubeMX v6.9.0 BUG:FLASH_LATENCY设置错误导致初始化失败

背景 今天在调试外设功能时&#xff0c;发现设置了使用外部时钟之后程序运行异常&#xff0c;进行追踪调试并与先前可以正常运行的项目进行对比之后发现这个问题可能是由于新版本的STM32CubeMX配置生成代码时的BUG引起的。 测试环境 MCU: STM32H750VBT6 STM32CubeIDE: Versi…

Android 屏幕适配各种宽高比的手机

由于android 手机的屏幕宽高比样式太多了&#xff0c;在设计UI时&#xff0c;很多时候&#xff0c;会因为宽高比&#xff0c;分辨率不同会有展示上的差异。 我是这样解决的 在activity的onCreate方法前&#xff0c;调用&#xff1a; fun screenFit(context: Context) {val me…

Gitee 上传项目到仓库(上传文件夹)

一、将仓库下载到本地 1.首先打开仓库&#xff0c;点击下载压缩包 2.将下载的压缩包解压&#xff0c;并打开&#xff0c;在当前目录下打开 二、git操作 1.在文件当前目录打开git bash 2.初始化git git init 该命令会生成一个隐藏的.git文件夹 如果不是第一次使用&#…

自然语言处理14-基于文本向量和欧氏距离相似度的文本匹配,用于找到与查询语句最相似的文本

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下自然语言处理14-基于文本向量和欧氏距离相似度的文本匹配&#xff0c;用于找到与查询语句最相似的文本。NLP中的文本匹配是指通过计算文本之间的相似度来找到与查询语句最相似的文本。其中一种常用的方法是基于文本…

MybatisPlus使用排序查询时,将null值放到最后

1用户需求 查询结果&#xff0c;按照某些字段进行排序&#xff0c;将为null的值放到最后。按照更新时间排序&#xff0c;但是更新时间可能为null&#xff0c;因此将null的数据放到最后。 2解决方案 最简单的方式&#xff0c;当然是下面这种直接在SQL最后面 NULLS LAST &…

FAPI,2471983-20-5,放射性示踪剂成纤维细胞激活蛋白抑制剂显像剂

资料编辑|陕西新研博美生物科技有限公司小编MISSwu​ 一、产品描述&#xff1a; 成纤维细胞激活蛋白抑制剂显像剂FAPI&#xff08;CAS号&#xff1a;2471983-20-5&#xff09;&#xff0c;FAPI是一种放射性示踪剂&#xff0c;全称为成纤维细胞活化蛋白抑制剂。为小分子酶活性抑…

elasticsearch操作(API方式)

说明&#xff1a;es操作索引库、文档&#xff0c;除了使用它们自带的命令外&#xff08;参考&#xff1a;http://t.csdn.cn/4zpmi&#xff09;&#xff0c;在IDEA中可以添加相关的依赖&#xff0c;使用对应的API来操作。 准备工作 搭建一个SpringBoot项目&#xff0c;DAO使用…