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://<use your id after sign up>.mockapi.io/api/v1/users") if err != nil { return nil, err } defer resp.Body.Close() if resp.StatusCode != http.StatusOK { return nil, fmt.Errorf("failed to fetch users: %s", resp.Status) } var users []User if err := json.NewDecoder(resp.Body).Decode(&users); err != nil { return nil, err } return &users, nil }
为了控制操作,我将为所有其他上下文使用最顶层的父上下文 - 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 <- err return } usersChan <- user }() select { case users := <-usersChan: fmt.Printf("Fetched users: %+v\n", users) case err := <-errChan: fmt.Printf("Error fetching users: %v\n", err) case <-ctx.Done(): fmt.Println("Request timed out") }
在示例中,我使用两个通道 - usersChan 记录从内部服务收到的结果,第二个通道 errChan - 记录错误。
如果慢速 API 的响应没有在 2 秒内到达,我们会检测到错误并提供在外部层正确处理它的机会。
在风险管理器的这个实际示例中,goroutines 启用了异步 HTTP 请求,而上下文确保了超时处理,这对于构建可靠且有弹性的微服务至关重要。
附注
本文面向具有基础知识但不知道可以在哪里应用知识的初学者开发人员。我很高兴收到您的反馈,并很乐意回答您的问题。
Go 语言中最基本的东西的工作示例和其他几个实现可以在我的 GitHub 上找到,链接
以上是Golang 将如何解决你的第一个工作任务的详细内容。更多信息请关注PHP中文网其他相关文章!