在分布式微服務場景下,后端的各個服務之間一般基于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}}'