API路由系統的設計方案

ForestXie發表於2017-07-12

今天介紹一下API路由系統的設計思路,包括我們當時做這個系統的初衷,路由系統在架構中的發揮的作用,以及能給我們帶來的便利。


API路由系統的初心


做API路由系統的起因是搖旺的業務系統需要與集團的金融後臺(天黿系統)進行打通,涉及到天黿系統多個API的呼叫。所以我們需要一個系統,來統一呼叫搖旺外部的API做統一的認證、授權、以及訪問控制。


路由系統的設計目標


1. 內外隔離,作為業務系統的邊界,讓內外系統隔離開,除了通過路由系統,系統間無法直接通訊。

2. 系統解耦,通過解耦,使得內部微服務系統能夠獨立和靈活的調整,不用擔心影響功能本身。業務各個微服務可以隨時做伸縮性調整,更換IP等操作等等。

3. 腳手架,統一對Request和Response進行資料格式的轉換和處理。


路由系統的設計方案


搖旺內部的各個子服務基於Dubbo構建,所以路由系統與子服務的通訊沿用Dubbo協議。路由系統作為服務Provider處理搖旺系統對外的請求服務。具體的情況如下圖:


API路由系統的設計方案


路由系統會統一對外呼叫的請求進行校驗和引數組裝,並記錄訪問日誌。對於返回結果同樣會進行統一處理和組裝,異常情況會定義統一的Error Code。


以計算收益為例,API呼叫的流程如下圖:


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

歡迎轉載,帶上以下二維碼即可

API路由系統的設計方案

相關文章