栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

【DUBBO】python通过nacos调用dubbo接口

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【DUBBO】python通过nacos调用dubbo接口

文章目录
  • 一、DUBBO接口请求方法:
    • 1.1、首先需要安装dubbo-python插件:
    • 1.2、建立NacosMethods.py文件:
    • 1.3、建立DubboClientNew.py文件:
    • 1.4、body参数类型为json
    • 1.5、body参数为int类型
    • 1.6、目前支持的数据类型:

一、DUBBO接口请求方法:

目前dubbo接口有很多请求方式,例如:Jmeter利用第三方dubbo-sample插件请求接口,还有封装talent方法,本篇主要借用目前常用方法-python+nacos+dubbo方式

1.1、首先需要安装dubbo-python插件:

我这里下载安装版本为:0.0.4版本

pip install dubbo-python

1.2、建立NacosMethods.py文件:
import json

from dubbo.client import NacosRegister
from dubbo.common.constants import DUBBO_NC_PROVIDERS
from dubbo.common.exceptions import RegisterException


class NacosMethods(NacosRegister):

    def get_methods_from_nacos(self, interface, version):
        """ 从nacos中根据interface获取到providers信息,methods信息 :param interface: :param version: :return: """
        service = DUBBO_NC_PROVIDERS.format(interface, version)
        providers = self.nc.get_service_list(timeout=self.timeout, group_name=self.group_name,
                                             namespace_id=self.namespace_id)
        if not providers or service not in providers:
            raise RegisterException('no providers for service {}'.format(service))
        self.nc.subscribe([], service_name=service)
        services = self.nc.subscribed_local_manager.get_local_instances(service) or {}
        self.close()
        instance_r = None
        for k, v in services.items():
            service = v.__dict__
            instance = service.get('instance')
            instance_r = instance
            if not isinstance(instance, list):  instance = [instance]
            hosts = []
            for ins in instance:
                host = '{}:{}'.format(ins.get('ip'), ins.get('port'))
                hosts.append(host)
            self.hosts[interface] = hosts
        return json.loads(instance_r['metadata']['methodParamType'])
1.3、建立DubboClientNew.py文件:
from dubbo.client import NacosRegister, DubboClient
from dubbo.codec.encoder import Object

from Dubbo.NacosMethods import NacosMethods
from pprint import pprint


class DubboClientNew:

    def __init__(self, host, username, password):
        self.host = host
        self.username = username
        self.password = password

    def callDubbo(self, className, methodName, *args, **param):
        methods = NacosMethods(self.host, self.username, self.password) 
            .get_methods_from_nacos(className, ':')
        nc = NacosRegister(self.host, self.username, self.password)
        methodNames = methods.keys()
        obj = ''
        for method in methodNames:
            if method == methodName:
                obj = methods[method][0]

        queryRequest = Object(obj)

        if args != ():
            queryRequest = args
        elif param != {}:
            for key in param.keys():
                queryRequest[key] = param[key]
        dubbo_cli = DubboClient(className, nacos_register=nc, version=':')
        result = dubbo_cli.call(methodName, queryRequest)
        return result


if __name__ == '__main__':
    dubboClient = DubboClientNew('nacos地址:端口号', username='nacos账号', password='nacos密码')

     param = {
         "pageNo": 1,
         "pageSize": 10
    }
    result = dubboClient.callDubbo('dubbo接口interface', 'dubbo接口method',
                                    **param)

    pprint(result)
1.4、body参数类型为json
    dubboClient = DubboClientNew('nacos地址:端口号', username='nacos账号', password='nacos密码')

     param = {
         "pageNo": 1,
         "pageSize": 10
    }
    result = dubboClient.callDubbo('dubbo接口interface', 'dubbo接口method',
                                    **param
1.5、body参数为int类型
    dubboClient = DubboClientNew('nacos地址:端口号', username='nacos账号', password='nacos密码')

     param = 1
    result = dubboClient.callDubbo('dubbo接口interface', 'dubbo接口method',
                                    param
1.6、目前支持的数据类型:
:param args: 方法参数
                    1. 对于没有参数的方法,此参数不填;
                    2. 对于只有一个参数的方法,直接填入该参数;
                    3. 对于有多个参数的方法,传入一个包含了所有参数的列表;
                    4. 当前方法参数支持以下类型:
                        * bool
                        * int
                        * long
                        * float
                        * double
                        * java.lang.String
                        * java.lang.Object

看插件源码即可获得有标注

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/935456.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号