Golang,或簡稱 Go,已稱為 Go gopher 語言。如果你仍然不明白為什麼是地鼠,你可以在這篇文章中找到令人驚訝的吉祥物歷史。好吧,讓我們從頭開始吧,Golang 已成為眾所周知的最高效的程式語言之一。 與 Java 或 Python 等傳統語言不同,Go 在易於編寫的程式碼和快速執行之間取得了獨特的平衡,從而加快了開發速度並減少了偵錯和測試時間。本文將介紹在與緩慢且不穩定的 REST API 微服務互動的專案中使用 goroutine 和上下文的真實範例。
任務
假設您剛加入團隊,您的團隊負責人要求您將用 Golang 編寫的新微服務(例如風險管理器)綁定到透過 REST API 公開的使用者微服務。
問題
風險管理者需要與可能緩慢且不穩定的 REST API 進行交互,這要求我們謹慎處理此類請求。我將使用 goroutine 進行非同步 HTTP 請求,並使用上下文來管理請求逾時和錯誤處理。
解決方案
在 Golang 中使用 goroutine 和上下文可以有效管理並發任務並處理緩慢或不穩定的外部 API。
用程式碼解釋它的第一步是創建API,我使用了共享軟體服務https://mockapi.io/生成REST很方便具有一組基本實體的API,例如users.
假設有人盡力而為,而您的公司有一項列出用戶的內部服務。我們的任務是在新的風險管理器中重複使用使用者清單(使用者資料結構滿足mockapi.io所描述的契約)。下面的程式碼發出請求,處理正文,並產生使用者清單或對應的錯誤。
type User struct { CreatedAt string Name string Avatar string Id string } // Original slow request func fetchUsers(ctx context.Context) (*[]User, error) { resp, err := http.Get("https://
為了控制操作,我將為所有其他上下文使用最頂層的父上下文 - context.Background。我將用新資料補充此上下文,在本例中是超時 - context.WithTimeout,我將其定義為 2 秒。您可以在本文中閱讀有關在 Go 中使用上下文的更多資訊。
ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second) defer cancel() usersChan := make(chan *[]User) errChan := make(chan error) go func() { users, err := fetchUsers(ctx) if err != nil { errChan在範例中,我使用兩個通道 - usersChan 記錄從內部服務收到的結果,第二個通道 errChan - 記錄錯誤。
如果來自慢速 API 的回應沒有在 2 秒內到達,我們會偵測到錯誤並提供在外部層正確處理它的機會。在風險管理器的這個實際範例中,goroutines 啟用了非同步 HTTP 請求,而上下文確保了超時處理,這對於建立可靠且有彈性的微服務至關重要。
附註
本文面向具有基礎知識但不知道可以在哪裡應用知識的初學者開發人員。我很高興收到您的回饋,並很樂意回答您的問題。
Go 語言中最基本的東西的工作範例和其他幾個實作可以在我的 GitHub 上找到,連結為
免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。
Copyright© 2022 湘ICP备2022001581号-3