HTTP 转 Dubbo 协议动态路由¶
使用 Pixiu 可以支持协议转换功能,目前已支持 Http、Dubbo2、Triple、gRPC 协议代理和转换,本文主要介绍如何使用它将 HTPP 协议转换为 Dubbo 协议。
配置说明¶
以下内容以及注释仅涉及静态配置文件配置,不涉及配置下发。 Pixiu 静态启动配置文件,内容如下,相应字段含义均已注释:
---
static_resources:
listeners:
# 名称,没有实际意义
- name: "net/http"
# 端口地址监听协议,这里固定为 *HTTP*
protocol_type: "HTTP"
# 实际代码未使用到,感觉是 bug,不需要处理,默认均为 20s
# config:
# read_timeout: 5s
# write_timeout: 5s
# idle_timeout: 5s
# 监听地址
address:
socket_address:
address: "0.0.0.0"
port: 8881
# 过滤器链
filter_chains:
filters:
# 过滤器名称,这里固定http连接管理器
- name: dgp.filter.httpconnectionmanager
config:
# 路由配置,这里固定填写即可
route_config:
routes:
- match:
prefix: "*"
http_filters:
# api配置filter
- name: dgp.filter.http.apiconfig
config:
# 表明动态加载
dynamic: true
# 动态适配器的名称
dynamic_adapter: test
# dubbo 代理 filter
- name: dgp.filter.http.dubboproxy
config:
dubboProxyConfig:
registries:
"nacos":
protocol: "nacos"
timeout: "3s"
address: "127.0.0.1:8848"
# username: nacos
# password: nacos
# group: test-group
# namespace: test-namespace
# 超时时间,无效
# timeout: 2s
# 无效
# generate_request_id: false
# 服务名称,字段无效
# server_name: "test_http_to_dubbo"
# 适配器配置,自动配置动态API
adapters:
# id 和上面的 *dynamic_adapter* 的值对应
- id: test
name: dgp.adapter.dubboregistrycenter
config:
registries:
# 注册中心map配置
"nacos":
# 协议,支持 nacos 和 zookeeper
protocol: nacos
# 注册中心的地址
address: "127.0.0.1:8848"
# 注册中心端口
timeout: "5s"
# 如果注册中心存在认证逻辑这里填写用户名
# username: nacos
# 如果注册中心存在认证逻辑这里填写密码
# password: nacos
# 需要监听的注册中心分组
# group: test-group
# 注册中心的命名空间
# namespace: test-namespace
完成该配置后,Pixiu 会自动从 adapters 中配置的注册中心获取所有服务的可用方法,并自动装配成 API,之后只需要按照固定格式请求 Pixiu, Pixiu 即可将流量转发到对应的 dubbo 服务的对应接口的对应方法,下面介绍这种方式下请求 Pixiu 的格式,一定要严格按照格式请求,否则无法匹配到对应的服务。
Info
- 请求方法必须为 POST
-
请求路径格式为:
其中 IP 和 Port 均为 Pixiu 对外暴露的 IP 和端口,另外服务名、接口名、版本号和方法名均为对应想要请求的方法的属性.
-
请求体必需为 json 格式,存在两个键,分别是 types 和 values,其中 types 为请求方法的参数类型,字符串类型, 多个参数类型以逗号分隔,values 为对应参数类型的对应值,数组类型,多个参数以逗号分隔。
Demo 示例¶
Demo 示例代码地址:https://github.com/projectsesame/pixiu-demo-dubbo.git
测试命令如下(假定本地启动的 Pixiu,且访问端口为 8881):
# 127.0.0.1 是 Pixiu 部署的 ip,8881 是 Pixiu 启动的端口,dubbo3x-provider 是服务名
# io.daocloud.skoala.dubboapi.DubboDemoService 是接口名称,0.1.1 是版本号,sayHello 是方法名称
# 这里 sayHello 方法存在一个 String 类型的参数,由于是 java 语言开发的 demo,因此类型的完整名称是 java.lang.String
# 这里参数传值为 tt,因此这里传参 {\"types\":\"java.lang.String\",\"values\":[\"tt\"]},下面例子同理
curl -XPOST http://127.0.0.1:8881/dubbo3x-provider/io.daocloud.skoala.dubboapi.DubboDemoService/0.1.1/sayHello -d "{\"types\":\"java.lang.String\",\"values\":[\"tt\"]}" -H 'Content-Type: application/json'
"[dubbo3x-provider] : Hello, tt
curl -XPOST http://127.0.0.1:8881/dubbo3x-provider/io.daocloud.skoala.dubboapi.DubboDemoService/0.1.1/returnUserInfo -d "{\"types\":\"io.daocloud.skoala.dubboapi.User\",\"values\":[{\"name\":\"yang\",\"age\":10}]}" -H 'Content-Type: application/json'
{"age":10,"name":"yang"}
curl -XPOST http://127.0.0.1:8881/dubbo3x-provider/io.daocloud.skoala.dubboapi.DubboDemoService/0.1.1/returnUserInfoAndNameAndIntAge -d "{\"types\":\"java.lang.String,io.daocloud.skoala.dubboapi.User,int\",\"values\":[\"tt\",{\"name\":\"yang\",\"age\":10},20]}" -H 'Content-Type: application/json'
"method is returnUserInfoAndNameAndIntAge,userInfo is User{name='yang', age=10},name is tt,age is 20"
curl -XPOST http://127.0.0.1:8881/dubbo3x-provider/io.daocloud.skoala.dubboapi.DubboDemoService/0.1.1/returnUserInfoAndNameAndIntegerAge -d "{\"types\":\"java.lang.String,io.daocloud.skoala.dubboapi.User,java.lang.Integer\",\"values\":[\"tt\",{\"name\":\"yang\",\"age\":10},20]}" -H 'Content-Type: application/json'
""method is returnUserInfoAndNameAndIntegerAge,userInfo is User{name='yang', age=10},name is tt, age is 20"