全部产品
Search
文档中心

微服务引擎MSE:配置从HTTP到Dubbo协议转换

更新时间:May 21, 2024

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

说明

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

操作步骤

  1. 登录MSE网关管理控制台

  2. 在左侧导航栏,选择云原生网关 > 网关列表,并在顶部菜单栏选择地域。

  3. 在网关列表中选择对应的网关名称,并在操作列下单击路由配置。然后在控制台页面右上角,单击返回旧版

  4. 在左侧导航栏,单击路由管理 > 路由配置,然后在页面的左上角,单击创建路由,配置相关参数。

    1. 请求信息页面,配置路由名称关联域名并选择前缀匹配作为路径匹配规则,然后单击下一步

    2. 目标服务页面,选中单服务,然后在服务下拉列表中选择目标服务,会出现协议转换的配置界面,设置协议转换的相关配置项,单击保存并上线

      协议转换配置项说明

      配置项

      描述

      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}}'