HTTP 轉(zhuǎn) SOFARPC 入門
本文介紹如何快速創(chuàng)建并發(fā)布一個 HTTP API 類型的 API 服務(wù),通過 API 網(wǎng)關(guān)進行協(xié)議轉(zhuǎn)換,使用 SOFARPC 協(xié)議將請求轉(zhuǎn)發(fā)到后端業(yè)務(wù)系統(tǒng)集群。
操作步驟
建議您先閱讀 快速入門概述,了解 API 網(wǎng)關(guān)的角色及完整使用流程。
示例工程
為方便快速體驗 API 網(wǎng)關(guān) HTTP 轉(zhuǎn)換 SOFARPC 的 API 服務(wù),您可以單擊此處下載本文涉及的 示例工程。
步驟一:編寫 SOFARPC Server
SOFARPC Server 的編寫沒有特殊的要求,按照 SOFARPC 的標準教程即可,此處簡單編寫一個 UserService。
關(guān)于如何創(chuàng)建 SOFABoot 工程,參見 新建工程。
public interface SampleService {
User message();
}
public class SampleServiceImpl implements SampleService {
@Override
public User message() {
User user = new User();
user.setAge(18);
user.setName("tom");
return user;
}
}
public class User {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
將該 service 發(fā)布為 SOFARPC 服務(wù):
<bean id="sampleService" class="com.alipay.gateway.endpoint.impl.SampleServiceImpl"/>
<!-- 發(fā)布 RPC 服務(wù) -->
<sofa:service ref="sampleService" interface="com.alipay.xxxxxxxx.SampleService">
<sofa:binding.bolt/>
</sofa:service>
網(wǎng)關(guān)現(xiàn)已支持 HTTP Header 轉(zhuǎn) SOFARPC Baggage 透傳功能,在 HTTP-SOFARPC 的轉(zhuǎn)換中,把約定好的 HTTP Header 中的傳參形式加入到 Baggage 參數(shù)中:
request.getHeaderParams().put("baggage_context.透傳參數(shù)名稱","透傳數(shù)據(jù)")
然后在 SOFARPC 服務(wù)中,可以通過 Baggage 函數(shù)獲取對應(yīng)的參數(shù)值。
RpcInvokeContext context = RpcInvokeContext.getContext();
context.getRequestBaggage("透傳參數(shù)名稱")
步驟二:創(chuàng)建系統(tǒng)集群
進入金融分布式架構(gòu)控制臺。
左側(cè)導(dǎo)航欄單擊 API統(tǒng)一網(wǎng)關(guān) > API 發(fā)布 > 系統(tǒng)集群。
在系統(tǒng)集群列表頁面,單擊右上方的 創(chuàng)建系統(tǒng)集群 按鈕。
在新彈出窗口中,您需要配置以下信息:
系統(tǒng)集群名稱:必填,用于識別系統(tǒng)集群。根據(jù)本示例,此處可使用
sofarpc
。協(xié)議類型:支持 HTTP、SOFARPC。根據(jù)本示例,此處需選擇
SOFARPC
。地址配置方式:選擇 手動配置,即手動配置系統(tǒng)集群的 IP 地址或域名。
IP地址/域名:格式為
地址:端口
。本示例中,IP 地址使用127.0.0.1
,端口號使用12200
。IP 地址或域名:
IP 地址格式為
(1~255).(0~255).(0~255).(0~255)
。域名可以包含字母、數(shù)字或者半角的連接符(-),總共不超過 200 個字符。
端口:HTTP 默認端口為 80,SOFARPC 默認端口為 12200。端口號范圍為 1-65535。
描述:選填,用于描述系統(tǒng)集群的作用等,64 個字符以內(nèi),可為空。
單擊 確定。
步驟三:創(chuàng)建 API 分組
在左側(cè)導(dǎo)航欄單擊 API 發(fā)布 > API 分組,進入分組列表。
單擊 API 分組列表右上方的 創(chuàng)建分組 按鈕。
在新彈出窗口中,輸入 API 分組信息:
分組名稱:必填,用于識別 API 分組。支持英文字母、中文、數(shù)字、下劃線(_)、連接符(-),32 個字符以內(nèi)。本示例使用
sofarpc
。描述:選填,用于描述 API 分組的作用等,64 個字符以內(nèi),可為空。
單擊 確定。
步驟四:創(chuàng)建并發(fā)布 API
在左側(cè)導(dǎo)航欄單擊 API 發(fā)布 > API 管理 頁,單擊列表右上方的 創(chuàng)建 API。
在新頁面中,選擇 HTTP API 類型,單擊 創(chuàng)建。
在 定義 API 步驟中,您需要配置以下信息:
API 分組:必選,選擇上一步創(chuàng)建的 API 分組。
API 名稱:必填,用于識別 API,支持英文字母、中文、數(shù)字、下劃線(_)、連接符(-),32 個字符以內(nèi)。本示例使用
sofarpc
。說明同一個 API 分組下,API 名稱不能相同。
描述:選填,用于描述 API 的作用等,64 個字符以內(nèi)。
API 授權(quán)應(yīng)用類型:必選,指定可以訂閱并調(diào)用該 API 的應(yīng)用類型。根據(jù)本示例,選擇 應(yīng)用。
請求路徑:必填,針對應(yīng)用設(shè)置的請求資源的 URL,通過請求路徑可以定位到要請求的資源。根據(jù)本示例,輸入
/sofarpc
。路徑匹配規(guī)則:選擇 絕對匹配,即調(diào)用時完全匹配以上填寫的路徑。詳見 路徑匹配規(guī)則。
方法:必填。后端調(diào)用 SOFARPC 的接口必須傳遞參數(shù),所以這里需要選擇
POST
。請勿選擇GET
方法。說明由于 SOFARPC 需要通過 payload 信息進行反序列化操作,而 GET 請求無法攜帶有效 payload,故當(dāng)前不支持 HTTP GET 轉(zhuǎn) SOFARPC 請求。
報文類型:表示請求和響應(yīng)中的媒體類型信息。此處選擇
application/json
。報文編碼:表示客戶端接受什么字符集的文本內(nèi)容。此處選擇
UTF-8
。安全認證:選擇 密鑰認證,表示訂閱應(yīng)用訪問授權(quán)的 API 時需要使用密鑰進行身份認證。
請求參數(shù):可選,詳見 API 屬性說明 > 請求參數(shù)。
響應(yīng)參數(shù):可選,詳見 API 屬性說明 > 響應(yīng)參數(shù)。
單擊 下一步,進入后端配置頁面,您需要選擇 后端配置類型 并輸入后端配置信息。根據(jù)本示例,需選擇 系統(tǒng)集群 并配置具體集群信息。
協(xié)議類型:必選,表示網(wǎng)關(guān)接收到請求后轉(zhuǎn)發(fā)給的后端服務(wù)使用的通信協(xié)議類型。根據(jù)本示例,此處選擇
SOFARPC
。接口名稱:即 API 接口名稱,支持英文字母、數(shù)字、小數(shù)點(.)、冒號(:)、@,以小寫字母作為開頭。根據(jù)本示例,此處輸入
com.alipay.xxxxxxxx.SampleService
。方法名:即 API 服務(wù)方法名,支持英文字母、數(shù)字組成,以字母作為開頭。根據(jù)本示例,此處輸入
message
。超時時間:必填,API 請求超時時間,單位為毫秒(ms),保持默認即可。
路由策略:必選,表示當(dāng)網(wǎng)關(guān)接收到語法后使用的路由策略。本例中選擇 根據(jù)請求路徑路由,即直接轉(zhuǎn)發(fā)。
系統(tǒng)集群:必選,選擇步驟二創(chuàng)建的系統(tǒng)集群,即
sofarpc
。
單擊 創(chuàng)建。
創(chuàng)建完成后,單擊 立即發(fā)布 發(fā)布該 API。
步驟五:創(chuàng)建應(yīng)用
在左側(cè)導(dǎo)航欄單擊 API 訂閱 > 應(yīng)用管理 頁,單擊列表右上方的 創(chuàng)建應(yīng)用。
在 創(chuàng)建應(yīng)用 窗口,選擇 應(yīng)用類型 為 應(yīng)用。
輸入 應(yīng)用名稱,用于識別應(yīng)用。本例使用
hello
。單擊 確定。
應(yīng)用添加完成后,訂閱者需在應(yīng)用詳情頁,獲取該應(yīng)用 APPID。獲取 APPID 后,需將 APPID 提供給想要訂閱的 API 的發(fā)布者,獲得該 API 的訪問授權(quán)。
步驟六:創(chuàng)建授權(quán)對象
在左側(cè)導(dǎo)航欄單擊 API 發(fā)布 > 授權(quán)管理 頁,單擊列表右上方的 創(chuàng)建授權(quán)對象。
在 創(chuàng)建授權(quán)對象 窗口中,配置訂閱方應(yīng)用的授權(quán)信息。
應(yīng)用來源:必選。此處選 內(nèi)部系統(tǒng) 即可,表示授權(quán)給當(dāng)前租戶的當(dāng)前環(huán)境下的應(yīng)用訂閱。
應(yīng)用名稱:輸入其上一步創(chuàng)建的應(yīng)用名稱,如
hello
,系統(tǒng)會自動獲取其 APPID 與類型。所屬公司/部門:用于識別應(yīng)用所屬的公司或部門,可為空。
描述:輸入對該授權(quán)對象的備注信息,可為空。
單擊 確定。
步驟七:綁定授權(quán)對象
在 API 管理 頁面,找到待訂閱 API,進入其詳情頁。
在 授權(quán)對象 標簽頁下,單擊 綁定授權(quán)對象。
在 綁定授權(quán)對象 窗口中,找到剛剛創(chuàng)建的授權(quán)應(yīng)用。
勾選該應(yīng)用,單擊 確定,完成 API 授權(quán)。
步驟八:編寫 API 調(diào)用代碼
獲取如下服務(wù)配置信息:
在訂閱方應(yīng)用詳情頁獲取該應(yīng)用的密鑰(Access Key/Secret Key)。
在 API 詳情頁獲取該 API 的域名(host)、請求路徑(path)與方法(method)。
編寫調(diào)用代碼,示例如下:
說明如果 API 開啟了密鑰認證,您還需要在工程中配置相應(yīng)的 Access Key 和 Secret Key,推薦使用啟動參數(shù)和環(huán)境變量的形式。
# 客戶端請求的ak、sk,就是應(yīng)用的密鑰信息 gateway.accessKey=<SOFA_ACCESS_KEY_ID> gateway.secretKey=<SOFA_ACCESS_KEY_SECRET> apigateway.url=<yourGatewayURL>
public class GatewayTest { private String subAppAccessKey = "${gateway.accessKey}"; private String subAppSecretKey = "${gateway.secretKey}"; private String gatewayUrl = "http://mvwmni87dqwc****.apigateway.inc.alipay.net"; private ApiClient apiClient; @Before public void initClient() { // 初始化請求客戶端 ApiSecretKey apiSecretKey = new ApiSecretKey(subAppAccessKey, subAppSecretKey); List<ApiSecretKey> secretKeys = new ArrayList<>(); secretKeys.add(apiSecretKey); apiClient = new DefaultApiClient(gatewayUrl, secretKeys); } @Test public void testNoSignHttp() { ParamPostRequest request = new ParamPostRequest(); request.setPath("sofarpc"); // 是否對響應(yīng)進行簽名校驗 request.setClientCheckSign(false); ApiResponse response = apiClient.execute(request); System.out.println(JSON.toJSONString(response)); } }
發(fā)起調(diào)用后,可得出以下結(jié)果:
{"body":"{\"name\":\"tom\",\"age\":18}"}