BFF實踐(通過Goku網關發服務編排)

什麼是服務編排/數據聚合?

服務編排/數據聚合 指的是可以通過一個請求來依次調用多個微服務,並對每個服務的返回結果做數據處理,最終整合成一個大的結果返回給前端。

例如一個服務是“查詢用戶預定的酒店”,前端僅需要傳一個訂單ID,後端會返回整個訂單的信息,包括用戶信息、酒店信息和房間信息等。

這個服務背後可能對應着以下幾個操作:

  • 請求訂單詳情,返回訂單對應的用戶ID、酒店ID、房間ID;
  • 根據各類ID查詢對應的信息;
  • 將數據做過濾、移動等操作,最後整合起來;
  • 將整合好的數據返回給前端;

下面的圖可以幫你更好理解:
在這裏插入圖片描述

編排的優勢

微服務架構上對功能做了解耦,使用服務編排可以快速從各類服務上獲取需要的數據,對業務實現快速響應。總的來說,編排有以下幾點優勢:

  • 功能解耦,服務能夠被複用;
  • 對前端友好,無需多次請求;
  • 業務響應速度快,服務能夠被快速生成;
  • 返回數據有改動的話,請求接口無影響;
  • 老系統改動的情況下,不需要改動前端,可以通過網關對數據做兼容。

使用編排工具:Goku API Gateway

先簡單介紹一下,Goku API Gateway (中文名:悟空 API 網關)是一個基於 Golang 開發的微服務網關,能夠實現高性能 HTTP API 轉發、服務編排、多租戶管理、API 訪問權限控制等目的,擁有強大的自定義插件系統可以自行擴展,並且提供友好的圖形化配置界面,能夠快速幫助企業進行 API 服務治理、提高 API 服務的穩定性和安全性。

Goku API Gateway支持一個編排API對應多個後端服務,每個後端服務的請求參數可以使用前端傳入的參數,也可以在編排裏自定義(寫靜態參數或從返回數據裏獲得)。每個後端服務的返回數據支持過濾、刪除、移動、重命名、拆包和封包等操作;編排API能夠設定編排失敗時的異常返回。

Goku API Gateway 的社區版本(CE)同時擁有完善的使用指南和二次開發指南,內置的插件系統也能夠讓企業針對自身業務進行定製開發。

項目地址:https://github.com/eolinker/goku-api-gateway

官網地址:https://www.eolinker.com

如何在Goku上做服務編排?

我們將編排的整個操作放到網關進行,由網關對數據做處理與轉換,這樣無需對後端服務做改動。一個請求到達網關,網關調用多個後端服務,並且在網關上對各個服務的返回數據做處理(操作有過濾、移動、重命名、封包、拆包,後面會對各操作做詳細解釋),最後由網關將數據整合好返回給前端。
在這裏插入圖片描述

操作步驟

1.在網關上,新建API的類型選擇服務編排:
在這裏插入圖片描述

2.配置 查詢預定酒店 API的請求信息:
在這裏插入圖片描述
3.添加並配置Step:

網關將編排過程中對 API的轉發處理過程(轉發->獲取返回數據->數據處理)稱爲一個 Step

添加一個轉發服務,該服務爲 查詢訂單詳情API,配置相應的轉發地址、傳入的參數、對返回數據做何種處理等。
在這裏插入圖片描述
由於篇幅原因,後續的Step(查詢用戶詳情、查詢酒店詳情、查詢房間詳情)就不一一展示了。

編排的傳遞參數方式和數據處理

(一)編排的兩種傳遞參數方式

網關將編排過程中對 API的轉發處理過程(轉發->獲取返回數據->數據處理)稱爲一個 Step

我們將處理查詢訂單詳情API稱爲 Step1,其中Step1的返回數據有:用戶ID、酒店ID、房間ID。同理,將查詢用戶信息這步稱爲 Step2,將查詢酒店信息稱爲 Step3,將查詢房間信息稱爲 Step4

傳參規則:

  • 使用前端傳入的參數可以寫成:body.參數名header.參數名
  • 使用Step1裏的返回數據作爲參數可以寫成:body1.參數名header1.參數名
  • 以此類推

1.在轉發路徑傳參

以下爲轉發路徑的傳參寫法:

  • 例如Step1要接收前端傳入的orderID參數,還有Authorization參數。
    Step1的轉發路徑可以寫成:/getOrderInfo/{{body.orderID}}/{{header.Authorization}}
  • 例如Step2 接收 Step1 裏的返回用戶ID參數(userID),同時接收前端傳入的Authorization參數。
    Step2的轉發路徑可以寫成:/getUserInfo/{{body1.userID}}/{{header.Authorization}}

2.在Step裏配置請求參數

Step2中需要接收Step1裏返回的userID作爲參數,同時需要接收前端傳入的Authorization參數

在網關裏Step2的請求參數配置如下所示,請求參數存在多個的話用換行表示:
在這裏插入圖片描述

(二)返回數據處理

1.查詢訂單詳情的API,返回數據稱爲 json1,內容如下:

{
"status":"000000",
"data":{
"id":"201910180009x"
        ,"user_account":"[email protected]"
        ,"hotal":"0001"
        ,"room":"biger1"
        ,"time_start":"20191019"
        ,"time_end":"20191020"
  }
}

2.查詢用戶詳情的API,返回數據稱爲 json2,內容如下:

{
"status":"000000",
"data":{
"account":"[email protected]",
"full_name":"",
"phone":""
  }
}

3.查詢酒店詳情的返回數據,稱爲 json3,內容如下:

{
"status":"000000",
"data":{
"id":"001",
        "type":"星級酒店",
        "name":"",
        "address":"",
        "location":{},
  }
}

4.查詢房間詳情的返回數據,稱爲 json4,內容如下:

{
"status":"000000",
"data":{
"name":"豪華大牀房"
        ,"window":1
        ,"floor":"10-12"
        ,"nosmoke":1
  }
}

5.可以在每一個Step裏對返回Json做處理,網關會將處理過的數據最後整合起來,再返回前端,例如這是通過網關返回的 最終數據

{
    "id":"201910180009x"
    ,"userInfo":{
    "account":"[email protected]",
    "full_name":"",
    "phone":""
    }
    ,"hotelinfo":{
    "type":"星級酒店",
    "name":"",
    "address":"",
    "location":{},
    }
    , "roominfo":{
        "name":"豪華大牀房"
       ,"window":1
       ,"floor":"10-12"
       ,"nosmoke":1
    }
}

這裏以查詢酒店詳情API的返回數據json3爲例,講解網關如何在編排過程中對返回數據做處理。

查詢酒店詳情API返回的原始數據如下:

{
"status":"000000",
"data":{
        "id":"001",
        "type":"星級酒店",
        "name":"",
        "address":"",
        "location":{},
  }
}

從網關返回給前端的數據中截取酒店信息的數據如下:

"hotelinfo":{
"type":"星級酒店",
"name":"",
"address":"",
"location":{},
}

那麼從原始數據到處理後的數據需要經過以下操作:

1.字段黑名單

字段黑名單的作用是排除某些字段,支持數組形式。

在網關的Step3裏配置如下:
在這裏插入圖片描述

經過網關處理後,實際的返回數據如下,可以看到data對象裏的id字段已經被過濾掉:

{
"status":"000000",
"data":{
        "type":"星級酒店",
        "name":"",
        "address":"",
        "location":{},
  }
}

2.字段拆包

拆包是指將指定對象的內容提取出來作爲該步驟(step)的返回結果。其中匹配目標只能爲object,匹配目標爲空時,結果爲 {},可用於清除數據。

在網關的Step裏配置如下:
在這裏插入圖片描述

經過網關處理後,實際的返回數據如下,可以看到data對象被拆開,最終數據僅保留了data對象裏面的字段:

{
        "type":"星級酒店",
        "name":"",
        "address":"",
        "location":{},
}

3.封包

字段封包會將當前的數據整體打包爲最終返回數據中的一個對象,不支持*,不支持數組。

在網關的Step裏配置如下:
在這裏插入圖片描述

經過網關處理後,實際的返回數據如下,數據被整體打包爲hotelinfo對象:

{
"hotelinfo":{
        "type":"星級酒店",
        "name":"",
        "address":"",
        "location":{},
  }
}

經過三個步驟,就可以將原始數據變成最終的數據。

本文僅列舉了編排過程中部分數據處理的操作,如需瞭解更多編排細則,可通過文末給出的教程鏈接。

相關鏈接

項目地址:https://github.com/eolinker/goku-api-gateway

官網地址:https://www.eolinker.com

相關教程: 服務編排## 什麼是服務編排/數據聚合?
服務編排/數據聚合 指的是可以通過一個請求來依次調用多個微服務,並對每個服務的返回結果做數據處理,最終整合成一個大的結果返回給前端。

例如一個服務是“查詢用戶預定的酒店”,前端僅需要傳一個訂單ID,後端會返回整個訂單的信息,包括用戶信息、酒店信息和房間信息等。

這個服務背後可能對應着以下幾個操作:

  • 請求訂單詳情,返回訂單對應的用戶ID、酒店ID、房間ID;
  • 根據各類ID查詢對應的信息;
  • 將數據做過濾、移動等操作,最後整合起來;
  • 將整合好的數據返回給前端;

下面的圖可以幫你更好理解:
在這裏插入圖片描述

編排的優勢

微服務架構上對功能做了解耦,使用服務編排可以快速從各類服務上獲取需要的數據,對業務實現快速響應。總的來說,編排有以下幾點優勢:

  • 功能解耦,服務能夠被複用;
  • 對前端友好,無需多次請求;
  • 業務響應速度快,服務能夠被快速生成;
  • 返回數據有改動的話,請求接口無影響;
  • 老系統改動的情況下,不需要改動前端,可以通過網關對數據做兼容。

使用編排工具:Goku API Gateway

先簡單介紹一下,Goku API Gateway (中文名:悟空 API 網關)是一個基於 Golang 開發的微服務網關,能夠實現高性能 HTTP API 轉發、服務編排、多租戶管理、API 訪問權限控制等目的,擁有強大的自定義插件系統可以自行擴展,並且提供友好的圖形化配置界面,能夠快速幫助企業進行 API 服務治理、提高 API 服務的穩定性和安全性。

Goku API Gateway支持一個編排API對應多個後端服務,每個後端服務的請求參數可以使用前端傳入的參數,也可以在編排裏自定義(寫靜態參數或從返回數據裏獲得)。每個後端服務的返回數據支持過濾、刪除、移動、重命名、拆包和封包等操作;編排API能夠設定編排失敗時的異常返回。

Goku API Gateway 的社區版本(CE)同時擁有完善的使用指南和二次開發指南,內置的插件系統也能夠讓企業針對自身業務進行定製開發。

項目地址:https://github.com/eolinker/goku-api-gateway

官網地址:https://www.eolinker.com

如何在Goku上做服務編排?

我們將編排的整個操作放到網關進行,由網關對數據做處理與轉換,這樣無需對後端服務做改動。一個請求到達網關,網關調用多個後端服務,並且在網關上對各個服務的返回數據做處理(操作有過濾、移動、重命名、封包、拆包,後面會對各操作做詳細解釋),最後由網關將數據整合好返回給前端。
在這裏插入圖片描述

操作步驟

1.在網關上,新建API的類型選擇服務編排:
在這裏插入圖片描述

2.配置 查詢預定酒店 API的請求信息:
在這裏插入圖片描述
3.添加並配置Step:

網關將編排過程中對 API的轉發處理過程(轉發->獲取返回數據->數據處理)稱爲一個 Step

添加一個轉發服務,該服務爲 查詢訂單詳情API,配置相應的轉發地址、傳入的參數、對返回數據做何種處理等。
在這裏插入圖片描述
由於篇幅原因,後續的Step(查詢用戶詳情、查詢酒店詳情、查詢房間詳情)就不一一展示了。

編排的傳遞參數方式和數據處理

(一)編排的兩種傳遞參數方式

網關將編排過程中對 API的轉發處理過程(轉發->獲取返回數據->數據處理)稱爲一個 Step

我們將處理查詢訂單詳情API稱爲 Step1,其中Step1的返回數據有:用戶ID、酒店ID、房間ID。同理,將查詢用戶信息這步稱爲 Step2,將查詢酒店信息稱爲 Step3,將查詢房間信息稱爲 Step4

傳參規則:

  • 使用前端傳入的參數可以寫成:body.參數名header.參數名
  • 使用Step1裏的返回數據作爲參數可以寫成:body1.參數名header1.參數名
  • 以此類推

1.在轉發路徑傳參

以下爲轉發路徑的傳參寫法:

  • 例如Step1要接收前端傳入的orderID參數,還有Authorization參數。
    Step1的轉發路徑可以寫成:/getOrderInfo/{{body.orderID}}/{{header.Authorization}}
  • 例如Step2 接收 Step1 裏的返回用戶ID參數(userID),同時接收前端傳入的Authorization參數。
    Step2的轉發路徑可以寫成:/getUserInfo/{{body1.userID}}/{{header.Authorization}}

2.在Step裏配置請求參數

Step2中需要接收Step1裏返回的userID作爲參數,同時需要接收前端傳入的Authorization參數

在網關裏Step2的請求參數配置如下所示,請求參數存在多個的話用換行表示:
在這裏插入圖片描述

(二)返回數據處理

1.查詢訂單詳情的API,返回數據稱爲 json1,內容如下:

{
"status":"000000",
"data":{
"id":"201910180009x"
        ,"user_account":"[email protected]"
        ,"hotal":"0001"
        ,"room":"biger1"
        ,"time_start":"20191019"
        ,"time_end":"20191020"
  }
}

2.查詢用戶詳情的API,返回數據稱爲 json2,內容如下:

{
"status":"000000",
"data":{
"account":"[email protected]",
"full_name":"",
"phone":""
  }
}

3.查詢酒店詳情的返回數據,稱爲 json3,內容如下:

{
"status":"000000",
"data":{
"id":"001",
        "type":"星級酒店",
        "name":"",
        "address":"",
        "location":{},
  }
}

4.查詢房間詳情的返回數據,稱爲 json4,內容如下:

{
"status":"000000",
"data":{
"name":"豪華大牀房"
        ,"window":1
        ,"floor":"10-12"
        ,"nosmoke":1
  }
}

5.可以在每一個Step裏對返回Json做處理,網關會將處理過的數據最後整合起來,再返回前端,例如這是通過網關返回的 最終數據

{
    "id":"201910180009x"
    ,"userInfo":{
    "account":"[email protected]",
    "full_name":"",
    "phone":""
    }
    ,"hotelinfo":{
    "type":"星級酒店",
    "name":"",
    "address":"",
    "location":{},
    }
    , "roominfo":{
        "name":"豪華大牀房"
       ,"window":1
       ,"floor":"10-12"
       ,"nosmoke":1
    }
}

這裏以查詢酒店詳情API的返回數據json3爲例,講解網關如何在編排過程中對返回數據做處理。

查詢酒店詳情API返回的原始數據如下:

{
"status":"000000",
"data":{
        "id":"001",
        "type":"星級酒店",
        "name":"",
        "address":"",
        "location":{},
  }
}

從網關返回給前端的數據中截取酒店信息的數據如下:

"hotelinfo":{
"type":"星級酒店",
"name":"",
"address":"",
"location":{},
}

那麼從原始數據到處理後的數據需要經過以下操作:

1.字段黑名單

字段黑名單的作用是排除某些字段,支持數組形式。

在網關的Step3裏配置如下:
在這裏插入圖片描述

經過網關處理後,實際的返回數據如下,可以看到data對象裏的id字段已經被過濾掉:

{
"status":"000000",
"data":{
        "type":"星級酒店",
        "name":"",
        "address":"",
        "location":{},
  }
}

2.字段拆包

拆包是指將指定對象的內容提取出來作爲該步驟(step)的返回結果。其中匹配目標只能爲object,匹配目標爲空時,結果爲 {},可用於清除數據。

在網關的Step裏配置如下:
在這裏插入圖片描述

經過網關處理後,實際的返回數據如下,可以看到data對象被拆開,最終數據僅保留了data對象裏面的字段:

{
        "type":"星級酒店",
        "name":"",
        "address":"",
        "location":{},
}

3.封包

字段封包會將當前的數據整體打包爲最終返回數據中的一個對象,不支持*,不支持數組。

在網關的Step裏配置如下:
在這裏插入圖片描述

經過網關處理後,實際的返回數據如下,數據被整體打包爲hotelinfo對象:

{
"hotelinfo":{
        "type":"星級酒店",
        "name":"",
        "address":"",
        "location":{},
  }
}

經過三個步驟,就可以將原始數據變成最終的數據。

本文僅列舉了編排過程中部分數據處理的操作,如需瞭解更多編排細則,可通過文末給出的教程鏈接。

相關鏈接

項目地址:https://github.com/eolinker/goku-api-gateway

官網地址:https://www.eolinker.com

相關教程: 服務編排

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章