今天介紹一下API路由系統的設計思路,包括我們當時做這個系統的初衷,路由系統在架構中的發揮的作用,以及能給我們帶來的便利。
API路由系統的初心
做API路由系統的起因是搖旺的業務系統需要與集團的金融後臺(天黿系統)進行打通,涉及到天黿系統多個API的呼叫。所以我們需要一個系統,來統一呼叫搖旺外部的API做統一的認證、授權、以及訪問控制。
路由系統的設計目標
1. 內外隔離,作為業務系統的邊界,讓內外系統隔離開,除了通過路由系統,系統間無法直接通訊。
2. 系統解耦,通過解耦,使得內部微服務系統能夠獨立和靈活的調整,不用擔心影響功能本身。業務各個微服務可以隨時做伸縮性調整,更換IP等操作等等。
3. 腳手架,統一對Request和Response進行資料格式的轉換和處理。
路由系統的設計方案
搖旺內部的各個子服務基於Dubbo構建,所以路由系統與子服務的通訊沿用Dubbo協議。路由系統作為服務Provider處理搖旺系統對外的請求服務。具體的情況如下圖:
路由系統會統一對外呼叫的請求進行校驗和引數組裝,並記錄訪問日誌。對於返回結果同樣會進行統一處理和組裝,異常情況會定義統一的Error Code。
以計算收益為例,API呼叫的流程如下圖:
呼叫路由的程式碼示例
@Test
public
void
testRouterService() {
// String[] 為請求路由目標介面入參泛型,可不傳
RouterRequest<String[]> routerRequest =
new
RouterRequest();
// 路由目標介面類全路徑 + 介面方法名(#分隔類名和方法名)
routerRequest.setRequestInterface(RedeemFacade.
class
.getName() +
"#redeemRequest"
);
// 路由介面請求引數
routerRequest.setParams(
new
String[]{
"test param1"
,
"test param2"
});
// CommonResponse<RedeemApplyResultDTO> 為目標介面返回值泛型
RouterResult<CommonResponse<RedeemApplyResultDTO>> objectRouterResult = routerService.requestRouter(routerRequest);
Assert.assertFalse(
"router success"
, routerRequest ==
null
);
}
啟用路由系統後,會給我們帶來以下便利:
1. 路由系統對內部和外部系統進行了隔離,保障了後臺服務的安全性。
2. 降低內部服務與天黿服務的耦合,彼此服務可以獨立運維,通過路由來做對映。
3. 為服務熔斷,灰度釋出提供了一套可行方案。
4. 內部微服務便於橫向擴充套件,實現系統伸縮性。
5. 便於監控,通過路由系統的日誌集中監控服務呼叫的狀態。
總結
通過路由系統,讓內外服務解耦,便於不同的開發團隊保持工作的獨立性,減低運維的難度和成本。目前路由的功能還比較簡單,會持續進行優化,提供更多的基礎功能,並進一步提升路由系統本身的高可用性。
掃描二維碼或手動搜尋微信公眾號【架構棧】: ForestNotes
歡迎轉載,帶上以下二維碼即可