使用 GraphQL 作為 API 網關來監控微服務
微服務和 GraphQL 就像麵包和黃油一樣,是一個很好的組合。它們本身都很棒,結合起來就更棒了。了解你的微服務的健康狀況是很重要的,因為它們運行著重要的服務。如果等到某個關鍵的服務崩潰了才診斷問題,那是很愚蠢的。讓 GraphQL 幫助你及早發現問題並不需要花費太多精力。
![GraphQL in Microservices](/data/attachment/album/202009/06/205139mi1icisfjshcgspm.png "GraphQL in Microservices")
常規的健康檢查可以讓你觀察和測試你的服務,在問題影響到你的業務、客戶或項目之前,儘早得到通知。說起來很簡單,但健康檢查到底要做什麼呢?
以下是我在設計服務檢查時考慮的因素:
伺服器健康檢查的要求:
- 我需要了解我的微服務的可用性狀態。
- 我希望能夠管理伺服器的負載。
- 我希望對我的微服務進行端到端(e2e)測試。
- 我應該能夠預測中斷。
![Service health in microservices](/data/attachment/album/202009/06/205142p8u5addu33gzu4gu.png "Service health in microservices")
做伺服器健康檢查的方法
進行健康檢查可能比較棘手,因為理論上,你可以檢查的東西幾乎是無窮無盡的。我喜歡從小處著手,運行最基本的測試:ping 測試。這只是測試運行應用的伺服器是否可用。然後,我加強測試以評估特定問題,思考伺服器中最重要的元素。我想到那些如果突然消失的話將是災難性的事情。
- Ping 檢查:Ping 是最簡單的監控類型。它只是檢查你的應用是否在線。
- 腳本化瀏覽器:腳本化瀏覽器比較高級。像 Selenium 這樣的瀏覽器自動化工具可以讓你實現自定義的監控規則集。
- API 測試:API 測試用於監控 API 端點。這是 ping 檢查模型的高級版本,你可以根據 API 響應來定義監控計劃。
使用 GraphQL 進行健康檢查
在一個典型的基於 REST 的微服務中,你需要從頭開始構建健康檢查功能。這是一個時間密集型的過程,但使用 GraphQL 就不用擔心了。
根據它的網站稱:
「GraphQL 是一種用於 API 的查詢語言,也是一種用現有數據完成這些查詢的運行時環境。GraphQL 為你的 API 中的數據提供了一個完整的、可理解的描述,讓客戶有能力精確地僅查詢他們所需要的東西,讓 API 更容易隨著時間的推移而進化,並實現強大的開發者工具。」
當你啟動一個 GraphQL 微服務時,你還可以獲得監控微服務的運行狀況的供給。這是一個隱藏的寶貝。
正如我上面提到的,你可以用 GraphQL 端點執行 API 測試以及 ping 檢查。
Apollo GraphQL 伺服器提供了一個默認的端點,它可以返回有關你的微服務和伺服器健康的信息。它不是很複雜:如果伺服器正在運行,它就會返回狀態碼 200。
默認端點是 <server-host>/.well-known/apollo/server-health
。
![Health Check with GraphQL](/data/attachment/album/202009/06/205144cpb2h7udbv73bavd.png "Health Check with GraphQL")
高級健康檢查
在某些情況下,基本的健康檢查可能不足以確保系統的完整性。例如,緊密耦合的系統需要更多的業務邏輯來確保系統的健康。
Apollo GraphQL 在定義伺服器的同時,通過聲明一個 onHealthCheck
函數來有效地管理這種情況。
* Defining the Apollo Server */
const apollo = new ApolloServer({
playground: process.env.NODE_ENV !== 'production',
typeDefs: gqlSchema,
resolvers: resolver,
onHealthCheck: () => {
return new Promise((resolve, reject) => {
// Replace the `true` in this conditional with more specific checks!
if (true) {
resolve();
} else {
reject();
}
});
}
});
當你定義一個 onHealthCheck
方法時,它返回一個 promise,如果伺服器準備好了,它就會返回 resolve
,如果有錯誤,它就會返回 reject
。
GraphQL 讓監控 API 變得更容易。此外,在你的伺服器基礎架構中使用它可以使代碼變得可擴展。如果你想嘗試採用 GraphQL 作為你的新基礎設施定義,請參見我的 GitHub 倉庫中的示例代碼和配置。
via: https://opensource.com/article/20/8/microservices-graphql
作者:Rigin Oommen 選題:lujun9972 譯者:geekpi 校對:wxy
本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive