大多數的移動端app,和後端都採用基於HTTP的JSON數據通訊。相對於PC端,移動端的API服務最大的差別是網絡環境。爲了保證移動端的體驗,一般後端API服務會爲移動端的每一個場景,定製API合併數據返回,減小移動端的請求,提升移動端的體驗。git
對於後端開發人員而言,提供高度可複用的原子的API接口是最理想的狀態,可是對於移動端,就存在矛盾。github
爲了適應移動端的場景,後端API服務針對移動端的場景,定製API,在定製的API中合併數據結果。這樣作雖然解決了移動端的問題,可是對於後端而言,會作不少枯燥,無聊的工做,毫無成就感,而且隨着版本的迭代,會不停地去修改這些定製的門面API。正則表達式
對於這類狀況,API 網關成爲一個很好的解決方案。把服務聚合和定製的工做交給網關,後端提供原子類的API接口。筆者實現的Gateway的API網關正是這樣的解決方案。json
Gateway是使用Go實現的API網關,支持API服務聚合的功能。咱們使用一個例子來看看Gateway如何幫助咱們更好地構建移動端友好的API服務。後端
首先咱們有一個會員的後端API服務提供了2個API服務:api
/api/user/base?userId=xxx網絡
會員基本信息接口app
/api/users/{userId}/account設計
會員帳戶信息接口server
在APP的我的信息頁面上要同時顯示這2類信息
備註:這裏我爲了演示Gateway的rewrite功能,上面的API接口URL設計並很差,有點亂。然而在現實狀況下,這個2個接口有多是兩個系統提供,徹底可能出現這種狀況。
首先,咱們須要定義一個符合Restful規範的API,而後這個URL在網關上須要給轉換成後端服務的2個API調用,而且合併結果返回。
在gateway的admin管理系統上,建立2個Cluster,分別對應基本信息查詢接口和帳戶信息查詢接口後端server的集羣。
在gateway的admin管理系統上分別建立對應2個接口實現的真實後端Server的信息,其中最主要的信息就是ip和port
把真實server綁定到對應的Cluster上。
在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項目