在分布式微服务场景下,后端的各个服务之间一般基于RPC框架相互调用,Dubbo就是一种常见的RPC框架。针对将一个Dubbo服务以RESTful风格向外暴露的场景,云原生网关提供从HTTP到Dubbo的协议转换功能。本文介绍通过配置协议转换使用HTTP请求访问Dubbo服务。
目前仅支持Java语言的Dubbo框架。
操作步骤
登录MSE网关管理控制台,并在顶部菜单栏选择地域。
在左侧导航栏,选择云原生网关 > 网关列表,单击目标网关名称。
在左侧导航栏,单击路由管理,然后选择路由页签。
在当前页面单击创建路由,配置相关参数,下表仅说明协议转换配置项。创建路由的具体操作,请参见创建路由。
配置项
描述
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}}'