Python dubbo 接口转换成 http 便捷请求 - 基于 fastapi

底层贫困人员 · 2021年05月28日 · 最后由 底层贫困人员 回复于 2021年05月31日 · 5890 次阅读

GitHub 地址:https://github.com/JokerChat/dubbo_fastapi
Telnet 命令参考手册:https://dubbo.apache.org/zh/docs/v2.7/user/references/telnet/#status

使用方法

  • pip install requirements.txt
  • config.py 文件配置上你的 zookeeper 地址
  • 右键运行 main 文件
  • 访问http://127.0.0.1:5000/api/xxx 即可开始测试 dubbo 接口
  • 具体传参可看下面的 dubbo 接口文档
  • 基于 fastapi,将 dubbo 接口转换成便捷的 http 接口测试
  • dockerFile 部署,直接docker build -t xx:xx .

基于 http 协议 dubbo 接口文档

原理:基于 python telnetlib 库,模拟 Telnet 命令进行 dubbo 接口测试,再封装成 http 接口

备注:部署服务的主机必须可以连接上 dubbo 服务

前言

修改记录

编号 修改日期 修改内容 修改人
1 2021-3-9 创建文档 Fang

服务地址

测试环境:http://xxx.xx.xx.xx:5000

## 接口说明

### 1)查询服务名下的所有方法

接口地址

  • 说明:根据 dubbo 接口地址和 dubbo 接口服务名,查询服务名下的所有方法
  • 地址:/api/dubbo/list
  • 方法:POST

请求头

序号 类型 说明
1 Content-Type application/json JSON 格式

请求体

序号 键值 类型 说明
1 serviceName String 服务名
2 methodName String 非必传,查询服务名下指定方法名的传值类型,不传查所有

请求体示例

{
  "serviceName": "string",
  "methodName": "string"
}

返回体

序号 键值 类型 说明
1 responseCode Int 返回 code
2 responseMsg String 返回信息
3 responseData Array data 数组
4 - type int 0-枚举值,1-无需传参
2- 集合对象,3-自定义对象
- paramType string 方法传值类型
- methodName string 方法名

返回值示例(成功)

{
    "responseCode": 200,
    "responseMsg": "请求成功",
    "responseData": [
        {
            "methodName": "xxxxxx",
            "paramType": "java.util.HashMap",
            "type": 3
        },
        {
            "methodName": "xxxxxx",
            "paramType": [
                "java.lang.String",
                "java.lang.String",
                "java.lang.String",
                "java.lang.Integer",
                "java.lang.Integer"
            ],
            "type": 0
        },
        {
            "methodName": "xxxxxx",
            "paramType": "",
            "type": 1
        },
        {
            "methodName": "xxxxxx",
            "paramType": "java.util.List",
            "type": 2
        }
    ]
}

返回值示例(失败)

{
    "responseCode": 400,
    "responseMsg": "相应的异常信息"
}

2)dubbo 接口 - 业务接口

接口地址

  • 说明:根据 dubbo 接口地址和 dubbo 接口服务名,方法名,参数值实现 dubbo 接口逻辑
  • 地址:/api/invoke
  • 方法:POST

请求头

序号 类型 说明
1 Content-Type application/json JSON 格式

请求体

序号 键值 类型 说明
1 url string dubbo 接口地址,IP:端口
2 serviceName string 服务名
3 methodName string 方法名
4 data object 传值 4 种情况,具体看示例

请求体示例 1 -- 原生对象或者自定义对象传参(xxDto、jsonObj、java.util.HashMap)

{
    "serviceName": "xxxxxx",
    "methodName": "xxxxxx",
    "data": {        //data传入对应的对象数据,一般为json格式的
        "productStoreQueryDTOS": [
            {
                "productNoNumDTOList": [
                    {
                        "num": 13,
                        "productNo": "10000620"
                    },
                    {
                        "num": 13,
                        "productNo": "10000014"
                    }
                ],
                "storeCode": "4401S1389"
            }
        ]
    }
}

请求体示例 2 -- 枚举值类型传参(java.lang.String、java.lang.Integer)

{
    "serviceName": "xxxx",
    "methodName": "xxxxx",
    "data": {         //格式为json,枚举值顺序必须按照dubbo接口定义的传参顺序,注意是否为int还是string
        "account":"123456",
        "password":"3fd6ebe43dab8b6ce6d033a5da6e6ac5"
    }
}

请求体示例 3 -- 方法名无需传参

{
    "serviceName": "xxxx",
    "methodName": "xxxxxx",
    "data":{}      //传入空对象
}

请求体示例 4 --集合对象传参(java.util.List)

{
    "serviceName": "xxxx",
    "methodName": "xxxxxx",
    "data":{
        "empList": [
            "30000445",
            "30000444"
        ]
    } //传入对象,里面嵌套数组
}

请求体示例 5 --集合对象传参,后面跟着枚举值(java.util.List 、 java.lang.String 、 java.lang.Integer)

{
    "serviceName": "xxxx",
    "methodName": "xxxxxx",
    "data":{
        "userCode": ["12345","686838"],
        "startTime": "2021-04-16 13:30:00",
        "endTime": "2021-04-16 14:30:00"
}
}

请求体示例 6 --多个自定义对象传参,对象顺序按照 dubbo 接口定义的传参顺序 (xxdtox、xxdto)

{
    "serviceName": "xxxx",
    "methodName": "xxxxxx",
    "data":[
      {
        "userCode": "7932723",
        "startTime": "2021-04-16 13:30:00",
        "endTime": "2021-04-16 14:30:00"
},
      {
        "name": "fang",
        "age": "20"
}
    ]
}

返回值示例(成功)只展示其中一种

{
    "responseData": "dubbo接口返回什么,就返回什么"
}

返回值示例(失败)

{
    "responseCode": 400,
    "responseMsg": "相应的异常信息"
}

### 3)查询服务名的配置信息

接口地址

  • 说明:根据 dubbo 接口服务名,查询服务名下的配置信息 (url,端口,dubbo 版本等)
  • 地址:/api/dubbo/search
  • 方法:POST

请求头

序号 类型 说明
1 Content-Type application/json JSON 格式

请求体

序号 键值 类型 说明
1 serviceName String 服务名

请求体示例

{
  "serviceName": "string"
}

返回体

序号 键值 类型 说明
1 responseCode Int 返回 code
2 responseMsg String 返回信息
3 responseData Array data 数组
4 - xx String 省略,具体可问开发相关的解释

返回值示例(成功)

{
  "responseCode": 200,
  "responseMsg": "请求成功",
  "responseData": {
    "url": "xxxx",
    "dubbo_service": "xxxx",
    "anyhost": "xxxx",
    "application": "xxxx",
    "bean.name": "xxxxx",
    "dubbo": "xxxx",
    "generic": "xxxx",
    "interface": "xxxx",
    "methods": [
      "xxxx",
      "xxxx",
      "xxxx"
    ],
    "owner": "xxxx",
    "pid": "xxxx",
    "revision": "xxxx",
    "side": "xxxx",
    "timeout": "xxxx",
    "timestamp": "xxxx"
  }
}

返回值示例(失败)

{
    "responseCode": 400,
    "responseMsg": "相应的异常信息"
}
共收到 5 条回复 时间 点赞

好奇问下,dubbo 的传输协议,本身就支持 http 的吧?而且这个内部配置对 rpc 调用来说是无感知的,是否有和开发沟通过,测试环境切换为 http 协议,方便测试?

https://dubbo.apache.org/zh/docs/v2.7/user/references/protocol/http/

陈恒捷 回复

可能还有其他服务依赖这个 dubbo 服务,不能随便切换协议。
我也是几个月前也做了一个 http 转 dubbo 的。

陈恒捷 回复

这个之前问过开发,开发说公司内部系统对接大多走的是 Dubbo 协议,这是公司的开发规范

嗯嗯,明白

我们之前用 dubbo ,本身底层选择的就是 http 协议,所以做接口测试和普通的接口差异不大,http 的工具可以复用。不过你们开发如果不允许换的话,那就只能从外部绕了。

陈恒捷 回复

是啊,没办法了,解决痛点就好了😂

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册