软件构建、打包与部署:从单体应用到微服务架构
1. 应用错误处理与服务管理
在Go应用中,当某个服务出现错误时,goroutine会为错误添加服务名称注解,并将其写入缓冲错误通道,然后调用包装上下文的取消函数。这样一来,若任何一个服务失败,其他所有服务都会自动收到关闭指令。
使用 sync.WaitGroup 可以跟踪当前运行的goroutine。由于我们处理的是长时间运行的服务,其 Run 方法只有在上下文被取消或出现错误时才会返回。在这两种情况下,包装上下文都会过期,我们可以让服务运行器等待该事件发生,然后调用 WaitGroup 的 Wait 方法,确保所有派生的goroutine都已终止后再继续执行。示例代码如下:
<-runCtx.Done()
wg.Wait()
在返回之前,需要检查是否存在错误。为此,我们关闭错误通道,以便使用 range 语句对其进行迭代。关闭通道是安全的,因为所有可能向其写入数据的goroutine都已经终止。示例代码如下:
var err error
close(errCh)
for srvErr := range errCh {
err = multierror.Append(err, srvErr)
}
return err
上述代码在关闭通道后,会将所有报告的错误出队并聚合,然
超级会员免费看
订阅专栏 解锁全文
1409

被折叠的 条评论
为什么被折叠?



