配置從HTTP到Dubbo協(xié)議轉(zhuǎn)換
在分布式微服務(wù)場(chǎng)景下,后端的各個(gè)服務(wù)之間一般基于RPC框架相互調(diào)用,Dubbo就是一種常見(jiàn)的RPC框架。針對(duì)將一個(gè)Dubbo服務(wù)以RESTful風(fēng)格向外暴露的場(chǎng)景,云原生網(wǎng)關(guān)提供從HTTP到Dubbo的協(xié)議轉(zhuǎn)換功能。本文介紹通過(guò)配置協(xié)議轉(zhuǎn)換使用HTTP請(qǐng)求訪問(wèn)Dubbo服務(wù)。
目前僅支持Java語(yǔ)言的Dubbo框架。
操作步驟
登錄MSE網(wǎng)關(guān)管理控制臺(tái),并在頂部菜單欄選擇地域。
在左側(cè)導(dǎo)航欄,選擇云原生網(wǎng)關(guān) > 網(wǎng)關(guān)列表,單擊目標(biāo)網(wǎng)關(guān)名稱(chēng)。
在左側(cè)導(dǎo)航欄,單擊路由管理,然后選擇路由頁(yè)簽。
在當(dāng)前頁(yè)面單擊創(chuàng)建路由,配置相關(guān)參數(shù),下表僅說(shuō)明協(xié)議轉(zhuǎn)換配置項(xiàng)。創(chuàng)建路由的具體操作,請(qǐng)參見(jiàn)創(chuàng)建路由。
配置項(xiàng)
描述
Dubbo服務(wù)名
Dubbo服務(wù)的完整服務(wù)名。
服務(wù)版本
Dubbo服務(wù)的版本,當(dāng)后端服務(wù)沒(méi)有設(shè)置版本時(shí)此項(xiàng)默認(rèn)為0.0.0。
服務(wù)分組
Dubbo服務(wù)的分組,當(dāng)后端服務(wù)沒(méi)有設(shè)置分組時(shí)此項(xiàng)可以不填。
方法映射
說(shuō)明方法映射指一個(gè)Dubbo方法的映射規(guī)則,通過(guò)單擊+方法映射您可以配置多條方法映射,方法映射包含以下配置項(xiàng)。
Dubbo方法名
Dubbo方法的完整名稱(chēng)。
HTTP方法
設(shè)置HTTP請(qǐng)求中的Method參數(shù)。
方法匹配路徑
匹配Path參數(shù),需要在前綴是的Path基礎(chǔ)上進(jìn)行填寫(xiě)。例如,Path為
/dubboDemo
,則此處需要在/dubboDemo
的基礎(chǔ)上填寫(xiě)方法的匹配路徑,例如/dubboDemo/hello
。Header透?jìng)鬟x型
是否需要把HTTP請(qǐng)求的Header作為隱式參數(shù)(Attachment)透?jìng)鹘o后端的Dubbo服務(wù)。可選項(xiàng):
透?jìng)魉蠬eader
不透?jìng)鱄eader
透?jìng)髦付℉eader
多個(gè)Key用英文逗號(hào)(,)分隔,例如content-length,content-type
參數(shù)映射
配置Dubbo方法的參數(shù)映射規(guī)則,Dubbo方法的參數(shù)以
key-value
的形式從HTTP請(qǐng)求中提取。可以配置多條參數(shù)映射規(guī)則,單擊+參數(shù)映射進(jìn)行添加。入?yún)⑽恢?/b>:配置當(dāng)前參數(shù)從HTTP請(qǐng)求中的什么位置來(lái)提取。
請(qǐng)求參數(shù):從HTTP請(qǐng)求的Query參數(shù)中提取
請(qǐng)求頭:從HTTP請(qǐng)求的Header中提取
請(qǐng)求路徑:從HTTP請(qǐng)求的Path中提取
請(qǐng)求體:從HTTP請(qǐng)求的Body中提取
入?yún)⑽惶崛ey:配置當(dāng)前參數(shù)對(duì)應(yīng)的Key。
后端參數(shù)類(lèi)型:配置當(dāng)前參數(shù)的完整類(lèi)型名。按照規(guī)范,目前支持以下幾種Java類(lèi)型。
java.lang.String
java.lang.Long
java.lang.Double
java.lang.Boolean
java.util.List
java.util.Map
自定義類(lèi)型,例如,org.apache.dubbo.samples.basic.api.DubboTest
重要java.util.List、java.util.Map以及自定義類(lèi)型只支持從Body中提取參數(shù)。
使用示例
通過(guò)幾組配置樣例介紹如何通過(guò)配置協(xié)議轉(zhuǎn)換功能,實(shí)現(xiàn)使用HTTP請(qǐng)求訪問(wèn)Dubbo服務(wù)。
Dubbo服務(wù)接口
以下示例代碼為后端Dubbo服務(wù)的接口。
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為自定義類(lèi)型,定義如下所示。
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;
}
示例一:后端參數(shù)值從請(qǐng)求參數(shù)中提取,參數(shù)類(lèi)型為java.lang.String
配置項(xiàng) | 描述 |
Dubbo服務(wù)名 | com.alibaba.nacos.example.dubbo.service.DemoService |
服務(wù)版本 | 1.0.0 |
方法映射 | |
Dubbo方法名 | sayHello |
HTTP方法 | GET |
方法匹配路徑 | /dubboDemo/hello |
Header透?jìng)鬟x型 | 透?jìng)魉蠬eader |
參數(shù)映射 | 入?yún)⑽恢?/b>:請(qǐng)求參數(shù) |
入?yún)⑽惶崛ey:param1 | |
后端參數(shù)類(lèi)型:java.lang.String |
在終端使用Curl命令發(fā)起一個(gè)HTTP請(qǐng)求驗(yàn)證結(jié)果。
curl "http://xxx.xxx.xxx/dubboDemo/hello?param1=abcd"
示例二:后端參數(shù)值從請(qǐng)求頭中提取,參數(shù)類(lèi)型為java.lang.String
配置項(xiàng) | 描述 |
Dubbo服務(wù)名 | com.alibaba.nacos.example.dubbo.service.DemoService |
服務(wù)版本 | 1.0.0 |
方法映射 | |
Dubbo方法名 | sayHello |
HTTP方法 | GET |
方法匹配路徑 | /dubboDemo/hello |
Header透?jìng)鬟x型 | 透?jìng)魉蠬eader |
參數(shù)映射 | 入?yún)⑽恢?/b>:請(qǐng)求頭 |
入?yún)⑽惶崛ey:param1 | |
后端參數(shù)類(lèi)型:java.lang.String |
在終端使用Curl命令發(fā)起一個(gè)HTTP請(qǐng)求驗(yàn)證結(jié)果。
curl "http://xxx.xxx.xxx/dubboDemo/hello" -H "param1: abcd"
示例三:后端參數(shù)值從請(qǐng)求路徑中提取,參數(shù)類(lèi)型為java.lang.String
入?yún)⑽恢脼檎?qǐng)求路徑時(shí),需要在方法匹配路徑里配置對(duì)應(yīng)的模板。
配置項(xiàng) | 描述 |
Dubbo服務(wù)名 | com.alibaba.nacos.example.dubbo.service.DemoService |
服務(wù)版本 | 1.0.0 |
方法映射 | |
Dubbo方法名 | sayHello |
HTTP方法 | GET |
方法匹配路徑 | /dubboDemo/hello/{param1=*} |
Header透?jìng)鬟x型 | 透?jìng)魉蠬eader |
參數(shù)映射 | 入?yún)⑽恢?/b>:請(qǐng)求路徑 |
入?yún)⑽惶崛ey:param1 | |
后端參數(shù)類(lèi)型:java.lang.String |
在終端使用Curl命令發(fā)起一個(gè)HTTP請(qǐng)求驗(yàn)證結(jié)果。
curl "http://xxx.xxx.xxx/dubboDemo/hello/abcd"
示例四:后端參數(shù)值從請(qǐng)求體中提取,參數(shù)類(lèi)型為java.lang.String
配置項(xiàng) | 描述 |
Dubbo服務(wù)名 | com.alibaba.nacos.example.dubbo.service.DemoService |
服務(wù)版本 | 1.0.0 |
方法映射 | |
Dubbo方法名 | sayHello |
HTTP方法 | POST |
方法匹配路徑 | /dubboDemo/hello |
Header透?jìng)鬟x型 | 透?jìng)魉蠬eader |
參數(shù)映射 | 入?yún)⑽恢?/b>:請(qǐng)求體 |
入?yún)⑽惶崛ey:param1 | |
后端參數(shù)類(lèi)型:java.lang.String |
在終端使用Curl命令發(fā)起一個(gè)HTTP請(qǐng)求驗(yàn)證結(jié)果。
curl "http://xxx.xxx.xxx/dubboDemo/hello/" -X POST -d '{"param1": "abcd"}'
示例五:后端參數(shù)值從請(qǐng)求體中提取,參數(shù)類(lèi)型為java.util.List
java.util.List類(lèi)型的參數(shù)僅支持從請(qǐng)求體中提取。
配置項(xiàng) | 描述 |
Dubbo服務(wù)名 | com.alibaba.nacos.example.dubbo.service.DemoService |
服務(wù)版本 | 1.0.0 |
方法映射 | |
Dubbo方法名 | echoList |
HTTP方法 | POST |
方法匹配路徑 | /dubboDemo/echolist |
Header透?jìng)鬟x型 | 透?jìng)魉蠬eader |
參數(shù)映射 | 入?yún)⑽恢?/b>:請(qǐng)求體 |
入?yún)⑽惶崛ey:param1 | |
后端參數(shù)類(lèi)型:java.util.List |
在終端使用Curl命令發(fā)起一個(gè)HTTP請(qǐng)求驗(yàn)證結(jié)果。
curl "http://xxx.xxx.xxx/dubboDemo/echolist/" -X POST -d '{"param1": ["abc", "def", "ghi"]}'
示例六:后端參數(shù)值從請(qǐng)求體中提取,參數(shù)類(lèi)型為java.util.Map
java.util.Map類(lèi)型的參數(shù)僅支持從請(qǐng)求體中提取。
配置項(xiàng) | 描述 |
Dubbo服務(wù)名 | com.alibaba.nacos.example.dubbo.service.DemoService |
服務(wù)版本 | 1.0.0 |
方法映射 | |
Dubbo方法名 | echoMap |
HTTP方法 | POST |
方法匹配路徑 | /dubboDemo/echomap |
Header透?jìng)鬟x型 | 透?jìng)魉蠬eader |
參數(shù)映射 | 入?yún)⑽恢?/b>:請(qǐng)求體 |
入?yún)⑽惶崛ey:param1 | |
后端參數(shù)類(lèi)型:java.util.Map |
在終端使用Curl命令發(fā)起一個(gè)HTTP請(qǐng)求驗(yàn)證結(jié)果。
curl "http://xxx.xxx.xxx/dubboDemo/echomap/" -X POST -d '{"param1": {"key1": "value1", "key2": "value2", "key3": "value3"}}'
示例七:后端參數(shù)值從請(qǐng)求體中提取,參數(shù)類(lèi)型為自定義類(lèi)型
自定義類(lèi)型的參數(shù)僅支持從請(qǐng)求體中提取。
配置項(xiàng) | 描述 |
Dubbo服務(wù)名 | com.alibaba.nacos.example.dubbo.service.DemoService |
服務(wù)版本 | 1.0.0 |
方法映射 | |
Dubbo方法名 | echoPerson |
HTTP方法 | POST |
方法匹配路徑 | /dubboDemo/echoperson |
Header透?jìng)鬟x型 | 透?jìng)魉蠬eader |
參數(shù)映射 | 入?yún)⑽恢?/b>:請(qǐng)求體 |
入?yún)⑽惶崛ey:param1 | |
后端參數(shù)類(lèi)型:com.alibaba.nacos.example.dubbo.service.Person |
在終端使用Curl命令發(fā)起一個(gè)HTTP請(qǐng)求驗(yàn)證結(jié)果。
curl "http://xxx.xxx.xxx/dubboDemo/echoperson/" -X POST -d '{"param1": {"name": "Tom", "second_name": "John", "age": 21}}'