如何理解和運用服務編排?(使用 Goku API Gateway 實現)

2021-01-11 eoLinker

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

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

例如一個服務是「查詢用戶預定的酒店」,前端僅需要傳一個訂單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),也就是開源版本,我對內置的插件系統進行部分改動也算是定製開發了。在github中搜eolinker即可看到項目地址。

下面進入實際操作環節。

如何在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":"zzz@163.com"

,"hotal":"0001"

,"room":"biger1"

,"time_start":"20191019"

,"time_end":"20191020"

}

}

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

{

"status":"000000",

"data":{

"account":"goku@eolinker.com",

"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":"goku@eolinker.com",

"full_name":"",

"phone":""

}

,"hotelinfo":{

"type":"星級酒店",

"name":"",

"address":"",

"location":{},

}

, "roominfo":{

"name":"豪華大床房"

,"window":1

,"floor":"10-12"

,"nosmoke":1

}

}

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

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

{

"status":"000000",

"data":{

"id":"001",

"type":"星級酒店",

"name":"",

"address":"",

"location":{},

}

}

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

"hotelinfo":{

"type":"星級酒店",

"name":"",

"address":"",

"location":{},

}

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

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

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

{

"status":"000000",

"data":{

"type":"星級酒店",

"name":"",

"address":"",

"location":{},

}

}

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

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

{

"type":"星級酒店",

"name":"",

"address":"",

"location":{},

}

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

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

{

"hotelinfo":{

"type":"星級酒店",

"name":"",

"address":"",

"location":{},

}

}

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

本文僅列舉了編排過程中部分數據處理的操作,如需了解更多編排細則,可以在評論區留言。歡迎提出任何建議和想法。最後給出相關的連結,有條件實踐的可以去github下載試試,在github中搜eolinker即可看到項目地址。

相關焦點

  • Fizz Gateway 1.3.0 發布,全新的服務發現、服務編排、反向代理...
    優化路由管理模塊,支持服務發現、服務編排、反向代理三種模式,支持正則表達式匹配 支持服務編排的步驟非必填 支持在啟動時初始化服務編排配置文件 支持在管理後臺查看網關節點日誌 支持管理後臺前後端代碼合併一起打包
  • 詳解API網關核心功能和API管理擴展
    如果一個單體拆分為微服務後,完全不需要和外部應用打交道,也不需要共享自己的接口能力,那麼這個微服務體系裡面就不需要用API網關,僅僅使用服務註冊中心即可。通過服務註冊中心實現完全的去中心化和接口調用更高的性能。什麼時候需要使用API網關?
  • 理解RESTful API 架構設計規範與實踐
    在設計的理想狀態中,使用 HATEOAS 的 REST 服務中,客戶端可以通過伺服器提供的資源的表達來智能地發現可以執行的操作。當伺服器發生了變化時,客戶端並不需要做出修改,因為資源的 URI 和其他信息都是動態發現的。這樣的設計,保證了客戶端和伺服器的實現之間是鬆耦合的。客戶端需要根據伺服器提供的返回信息來了解所暴露的資源和對應的操作。
  • 如何使用SpringCloud進行灰度發布
    在開發或者測試的時候,或者線上發布,線上服務多版本控制的時候,需要對服務提供權重路由,最常見的使用就是,一個服務有兩個版本,舊版本V1,新版本v2。在線上灰度的時候,需要通過網關動態實時推送,路由權重信息。比如95%的流量走服務v1版本,5%的流量走服務v2版本。如何使用SpringCloud進行灰度發布呢?
  • 基於Django和翻譯API實現web版的中英文對照翻譯(一)
    說句題外話,有時候你會發現調用有道翻譯api的翻譯結果,和你自己在其官方web頁面上得到結果有所不同,那是因為有道翻譯內部實際上有多個翻譯版本。在wei頁面上你可以看到所有的版本,但好像有道翻譯api卻只能得到一個固定的翻譯版本。
  • 資源 從人臉識別到機器翻譯:52個有用的機器學習和預測API
    連結:https://www.betaface.com/wpa3.Eyedea Recognition:專注於高端計算機視覺解決方案,主要關注目標檢測和目標識別軟體。一個提供眼睛、面部、載具、版權和車牌檢測的識別服務。該 API 的最大價值在於其能夠即時理解物體、用戶和行為。
  • 使用C#的後端Web API:循序漸進教程
    如何在VS中創建基於.NET的後端應用程式,該應用程式使用C#語言從Web API中提取。讓我們開始吧!為伺服器後端邏輯選擇語言的問題是幾乎每個開發人員最重要的問題之一,特別是對於初學者。除了這些語言的語法特徵外,還有許多其他問題/問題,例如擴展的可能性,不同類型資料庫的使用,高學習曲線,容錯要求,大量數據等等。上。哪種語言最受歡迎?你應該使用哪一個?也許有人會推薦PHP,它具有豐富的功能和較低的學習曲線。然而,事實仍然是現在最常用的語言是Java和.NET。
  • 智能家居巨頭 Aqara 基於 KubeSphere 打造物聯網微服務
    KubeSphere 跨多雲平臺的兼容、以及支持多插件的選擇,在使用過程中加深了我們對 Kubernetes 各個模塊的理解、推進了我們對生產環境落地 Kubernetes 容器編排的步伐。同時,我們使用 Hystrix 線程池實現隔離、熔斷以及降級、sentinel 限流,而 springcloud-gateway 網關路由則用來實現路由調度,日誌使用的是經典的 ELK 組合,APM 使用 SkyWalking 作為 Java 微服務分布式系統的應用程式性能監視工具。
  • RESTful-API還沒理解麼?只是因為你沒看這篇文章,其實它很簡單
    通過下面的設計,大家來理解一下這三句話。當然也不是所有的接口,都能用REST的形式來表述。在實際工作中,靈活運用,我們用RESTful風格的目的是為大家提供統一標準,避免不必要的溝通成本的浪費,形成一種通用的風格。就好比大家都知道:伸出大拇指表示「你很棒「的意思,絕大部分人都明白,因為你了解了這種風格習慣。但是不排除有些地區伸出大拇指表示其他意思,就不適合使用!
  • 從人臉識別到文本分析,50+超實用的 API 推薦清單
    Kairoshttps://www.kairos.com/docs/api/它可快速將情緒分析和人臉識別功能添加到應用和服務平臺。11.屬於同一類(面向語言的認知服務)的其他 API 包括 Bing 拼寫檢查、語言理解、語言分析以及 Web 語言模型。
  • Azure 靜態 web 應用集成 Azure 函數 API
    前幾次我們演示了如何通過Azure靜態web應用功能發布vue跟blazor的項目(使用 Azure靜態web應用+Github全自動部署VUE站點、使用Azure靜態Web應用部署Blazor Webassembly應用)。
  • 手把手教你學Numpy——常用API合集
    前面幾個都比較好理解,簡單介紹一下這個百分位數,它是指將元素從小到大排列之後,排在第x%位上的值。我們一般常用的是25%,50%和75%這三個值,通過這幾個值,我們很容易對於整個特徵的分布有一個大概的了解。前面三個指標:均值、方差、標準差都很好理解,我們直接看代碼就行。
  • gateway筆記本多少錢 gateway筆記本價格大全(熱門款式)
    今天小編就為您帶來gateway筆記本電腦的熱 門 款式的報價以及簡單介紹。  在存儲方面,這款gateway筆記本電腦配備了2GB的運行內存與320GB的硬碟空間,這兩者的配置實際上是十分低的。顯卡方面,作為一款定位於全能學生本的gateway筆記本電腦,它並沒有配置獨立顯卡,配置的是一款Intel GMA X4500集成顯卡,這款集成顯卡的性能也是十分落後的。
  • Rocket-API 2.3.2 發布,基於 spring boot 的 API 敏捷開發框架
    通過約定的方式 實現統一的標準。告別加班,拒絕重複勞動,遠離搬磚概述"Rocket-API" 基於spring boot 的API敏捷開發框架,服務端50%以上的功能只需要寫SQL或者 mongodb原始執行腳本就能完成開發,另外30%也在不停的完善公共組件,比如文件上傳,下載,導出,預覽,分頁等等通過一二行代碼也能完成開發,剩下的20%也能依賴於動態編譯技術生成class的形式,不需要發布部署,不需要重啟來實現研發團隊的快速編碼
  • api 微博數據專題及常見問題 - CSDN
    如果只是為了收集數據可以諮詢我的郵箱,如果是為了學習爬蟲,建議改學phantomjs從網頁中爬取微博的)利用新浪API實現數據的抓取(由於api接口限制增大,本文已基本廢棄) 2018.5.16 提示 微博的api接口現在已經不好用了,普通權限的token已經爬不到什麼數據了,想要用這個代碼爬大量數據的已經不太可能,只能作為熟悉微博api
  • dedecms添加百度地圖api可動態放縮,支持http和https的方法
    做了一個和本地信息有關的網站,需要用到百度地圖,網上相關的教程比較少,而且都是使用iframe的方式來加載,雖然實現了可動態放縮功能,但是對於https的網站卻不顯示,分享一下dedecms添加百度地圖api3.0的經驗。
  • 「集成架構」理解企業應用集成
    物聯網(IoT)也代表了一個通過日常設備連接客戶和分析有用數據的新機會,但你必須過濾掉進入數據中心的關鍵數據。Web應用程式進一步增加了企業集成的複雜性,特別是當遺留應用程式必須與基於服務的體系結構(如微服務)集成時。 例如,「您如何集成您的應用程式、設備和數據?」
  • 服務網格和API網關在微服務架構中的作用
    服務網格和API網關在微服務架構中的作用 如果您從事微服務,那麼您可能已經多次聽說過這兩個術語。 人們常常在兩者之間感到困惑。 在本文中,我將詳細討論服務網格和API網關,並討論何時使用。