配置从HTTP到Dubbo协议转换

在分布式微服务场景下,后端的各个服务之间一般基于RPC框架相互调用,Dubbo就是一种常见的RPC框架。针对将一个Dubbo服务以RESTful风格向外暴露的场景,云原生网关提供从HTTP到Dubbo的协议转换功能。本文介绍通过配置协议转换使用HTTP请求访问Dubbo服务。

说明

目前仅支持Java语言的Dubbo框架。

操作步骤

  1. 登录MSE网关管理控制台,并在顶部菜单栏选择地域。

  2. 在左侧导航栏,选择云原生网关 > 网关列表,单击目标网关名称。

  3. 在左侧导航栏,单击路由管理,然后选择路由页签。

  4. 在当前页面单击创建路由,配置相关参数,下表仅说明协议转换配置项。创建路由的具体操作,请参见创建路由

    配置项

    描述

    Dubbo服务名

    Dubbo服务的完整服务名。

    服务版本

    Dubbo服务的版本,当后端服务没有设置版本时此项默认为0.0.0。

    服务分组

    Dubbo服务的分组,当后端服务没有设置分组时此项可以不填。

    方法映射

    说明

    方法映射指一个Dubbo方法的映射规则,通过单击+方法映射您可以配置多条方法映射,方法映射包含以下配置项。

    Dubbo方法名

    Dubbo方法的完整名称。

    HTTP方法

    设置HTTP请求中的Method参数。

    方法匹配路径

    匹配Path参数,需要在前缀是的Path基础上进行填写。例如,Path为/dubboDemo,则此处需要在/dubboDemo的基础上填写方法的匹配路径,例如/dubboDemo/hello

    Header透传选型

    是否需要把HTTP请求的Header作为隐式参数(Attachment)透传给后端的Dubbo服务。可选项:

    • 透传所有Header

    • 不透传Header

    • 透传指定Header

      多个Key用英文逗号(,)分隔,例如content-length,content-type

    参数映射

    配置Dubbo方法的参数映射规则,Dubbo方法的参数以key-value的形式从HTTP请求中提取。可以配置多条参数映射规则,单击+参数映射进行添加。

    • 入参位置:配置当前参数从HTTP请求中的什么位置来提取。

      • 请求参数:从HTTP请求的Query参数中提取

      • 请求头:从HTTP请求的Header中提取

      • 请求路径:从HTTP请求的Path中提取

      • 请求体:从HTTP请求的Body中提取

    • 入参位提取Key:配置当前参数对应的Key。

    • 后端参数类型:配置当前参数的完整类型名。按照规范,目前支持以下几种Java类型。

      • java.lang.String

      • java.lang.Long

      • java.lang.Double

      • java.lang.Boolean

      • java.util.List

      • java.util.Map

      • 自定义类型,例如,org.apache.dubbo.samples.basic.api.DubboTest

    重要

    java.util.List、java.util.Map以及自定义类型只支持从Body中提取参数。

使用示例

通过几组配置样例介绍如何通过配置协议转换功能,实现使用HTTP请求访问Dubbo服务。

Dubbo服务接口

以下示例代码为后端Dubbo服务的接口。

package com.alibaba.nacos.example.dubbo.service;
import java.util.List;
import java.util.Map;
public interface DemoService {
    String sayHello(String name);
    String echoList(List<String> input);
    String echoMap(Map<String, String> map);
    String echoPerson(Person p);
}

其中Person为自定义类型,定义如下所示。

package com.alibaba.nacos.example.dubbo.service;
import java.io.Serializable;
public class Person implements Serializable {
    public String name;
    public String second_name;
    public int age;
}

示例一:后端参数值从请求参数中提取,参数类型为java.lang.String

配置项

描述

Dubbo服务名

com.alibaba.nacos.example.dubbo.service.DemoService

服务版本

1.0.0

方法映射

Dubbo方法名

sayHello

HTTP方法

GET

方法匹配路径

/dubboDemo/hello

Header透传选型

透传所有Header

参数映射

入参位置:请求参数

入参位提取Key:param1

后端参数类型:java.lang.String

在终端使用Curl命令发起一个HTTP请求验证结果。

curl "http://xxx.xxx.xxx/dubboDemo/hello?param1=abcd"

示例二:后端参数值从请求头中提取,参数类型为java.lang.String

配置项

描述

Dubbo服务名

com.alibaba.nacos.example.dubbo.service.DemoService

服务版本

1.0.0

方法映射

Dubbo方法名

sayHello

HTTP方法

GET

方法匹配路径

/dubboDemo/hello

Header透传选型

透传所有Header

参数映射

入参位置:请求头

入参位提取Key:param1

后端参数类型:java.lang.String

在终端使用Curl命令发起一个HTTP请求验证结果。

curl "http://xxx.xxx.xxx/dubboDemo/hello" -H "param1: abcd"

示例三:后端参数值从请求路径中提取,参数类型为java.lang.String

说明

入参位置为请求路径时,需要在方法匹配路径里配置对应的模板。

配置项

描述

Dubbo服务名

com.alibaba.nacos.example.dubbo.service.DemoService

服务版本

1.0.0

方法映射

Dubbo方法名

sayHello

HTTP方法

GET

方法匹配路径

/dubboDemo/hello/{param1=*}

Header透传选型

透传所有Header

参数映射

入参位置:请求路径

入参位提取Key:param1

后端参数类型:java.lang.String

在终端使用Curl命令发起一个HTTP请求验证结果。

curl "http://xxx.xxx.xxx/dubboDemo/hello/abcd"

示例四:后端参数值从请求体中提取,参数类型为java.lang.String

配置项

描述

Dubbo服务名

com.alibaba.nacos.example.dubbo.service.DemoService

服务版本

1.0.0

方法映射

Dubbo方法名

sayHello

HTTP方法

POST

方法匹配路径

/dubboDemo/hello

Header透传选型

透传所有Header

参数映射

入参位置:请求体

入参位提取Key:param1

后端参数类型:java.lang.String

在终端使用Curl命令发起一个HTTP请求验证结果。

curl "http://xxx.xxx.xxx/dubboDemo/hello/" -X POST -d '{"param1": "abcd"}'

示例五:后端参数值从请求体中提取,参数类型为java.util.List

重要

java.util.List类型的参数仅支持从请求体中提取。

配置项

描述

Dubbo服务名

com.alibaba.nacos.example.dubbo.service.DemoService

服务版本

1.0.0

方法映射

Dubbo方法名

echoList

HTTP方法

POST

方法匹配路径

/dubboDemo/echolist

Header透传选型

透传所有Header

参数映射

入参位置:请求体

入参位提取Key:param1

后端参数类型:java.util.List

在终端使用Curl命令发起一个HTTP请求验证结果。

curl "http://xxx.xxx.xxx/dubboDemo/echolist/" -X POST -d '{"param1": ["abc", "def", "ghi"]}'

示例六:后端参数值从请求体中提取,参数类型为java.util.Map

重要

java.util.Map类型的参数仅支持从请求体中提取。

配置项

描述

Dubbo服务名

com.alibaba.nacos.example.dubbo.service.DemoService

服务版本

1.0.0

方法映射

Dubbo方法名

echoMap

HTTP方法

POST

方法匹配路径

/dubboDemo/echomap

Header透传选型

透传所有Header

参数映射

入参位置:请求体

入参位提取Key:param1

后端参数类型:java.util.Map

在终端使用Curl命令发起一个HTTP请求验证结果。

curl "http://xxx.xxx.xxx/dubboDemo/echomap/" -X POST -d '{"param1": {"key1": "value1", "key2": "value2", "key3": "value3"}}'

示例七:后端参数值从请求体中提取,参数类型为自定义类型

重要

自定义类型的参数仅支持从请求体中提取。

配置项

描述

Dubbo服务名

com.alibaba.nacos.example.dubbo.service.DemoService

服务版本

1.0.0

方法映射

Dubbo方法名

echoPerson

HTTP方法

POST

方法匹配路径

/dubboDemo/echoperson

Header透传选型

透传所有Header

参数映射

入参位置:请求体

入参位提取Key:param1

后端参数类型:com.alibaba.nacos.example.dubbo.service.Person

在终端使用Curl命令发起一个HTTP请求验证结果。

curl "http://xxx.xxx.xxx/dubboDemo/echoperson/" -X POST -d '{"param1": {"name": "Tom", "second_name": "John", "age": 21}}'