使用API閘道器構建移動端友好的API服務

zhangxu發表於2016-10-24

移動端API服務的特點

大多數的移動端app,和後端都採用基於HTTP的JSON資料通訊。相對於PC端,移動端的API服務最大的差異是網路環境。為了保證移動端的體驗,通常後端API服務會為移動端的每個場景,定製API合併資料返回,減少移動端的請求,提高移動端的體驗。

帶來的問題

對於後端開發人員而言,提供高度可複用的原子的API介面是最理想的狀態,但是對於移動端,就存在矛盾。

為了適應移動端的場景,後端API服務針對移動端的場景,定製API,在定製的API中合併資料結果。這樣做雖然解決了移動端的問題,但是對於後端而言,會做很多枯燥,無聊的工作,毫無成就感,並且隨著版本的迭代,會不停地去修改這些定製的門面API。

解決方案

對於這類情況,API 閘道器成為一個很好的解決方案。把服務聚合和定製的工作交給閘道器,後端提供原子類的API介面。筆者實現的Gateway的API閘道器正是這樣的解決方案。

使用Gateway

Gateway是使用Go實現的API閘道器,支援API服務聚合的功能。我們使用一個例子來看看Gateway如何幫助我們更好地構建移動端友好的API服務。

背景

首先我們有一個會員的後端API服務提供了2個API服務:

  • /api/user/base?userId=xxx

    會員基本資訊介面

  • /api/users/{userId}/account

    會員賬戶資訊介面

在APP的個人資訊頁面上要同時顯示這2類資訊

備註:這裡我為了演示Gateway的rewrite功能,上面的API介面URL設計並不好,有點亂。然而在現實情況下,這個2個介面有可能是兩個系統提供,完全可能出現這種情況。

方案

首先,我們需要定義一個符合Restful規範的API,然後這個URL在閘道器上需要給轉換成後端服務的2個API呼叫,並且合併結果返回。

建立2個Cluste

在gateway的admin管理系統上,建立2個Cluster,分別對應基本資訊查詢介面和賬戶資訊查詢介面後端server的叢集。

建立真實後端Server

在gateway的admin管理系統上分別建立對應2個介面實現的真實後端Server的資訊,其中最主要的資訊就是ip和port

繫結操作

把真實server繫結到對應的Cluster上。

建立聚合URL

在Admin系統上建立一個聚合URL為:^/api/users/(\d+)/info$,這個是一個正規表示式。然後在這個聚合URL上建立2個聚合呼叫:分別對應2個真實API的提供Cluster

  • /api/user/base?userId=$1

    對應使用者基本資訊介面的後端叢集:cluster1,同時設定返回的資料在聚合json的attr屬性為:base

  • /api/users/$1/account

    對應使用者賬戶資訊介面的後端叢集:cluster2,同時設定返回的資料在聚合json的attr屬性為:account

效果

這個時候,APP 向gateway 請求 /api/users/10000/info,gateway的會拆分應用請求,同時呼叫設定好的2個呼叫,並且聚合資料返回:{"base": {基本資訊返回的json}, "account": {賬戶資訊返回的json}},然後返回給APP

以上簡單介紹了API Gateway的作用,詳細的介紹可以在github上檢視Gateway專案

相關文章