文本描述
2020/11/15 11 | Context:信息穿透上下文 下载APP 11 | Context:信息穿透上下文 2020-11-04 晁岳攀 Go 并发编程实战课 进入课程 讲述:安晓辉 时长 19:55 大小 18.25M 你好,我是鸟窝。 在这节课正式开始之前,我想先带你看一个工作中的场景。 假设有一天你进入办公室,突然同事们都围住你,然后大喊“小王小王你最帅”,此时你 可能一头雾水,只能尴尬地笑笑。为啥呢?因为你缺少上下文的信息,不知道之前发生了 什么。 但是,如果同事告诉你,由于你业绩突出,一天之内就把云服务化的主要架构写好了,因 此被评为 9 月份的工作之星,总经理还特意给你发 1 万元的奖金,那么,你心里就很清楚 了,原来同事恭喜你,是因为你的工作被表扬了,还获得了奖金。同事告诉你的这些前因 time.geekbang/column/article/304086 1/15 2020/11/15 11 | Context:信息穿透上下文 后果,就是上下文信息,他把上下文传递给你,你接收后,就可以获取之前不了解的信 息。 你看,上下文(Context)就是这么重要。在我们的开发场景中,上下文也是不可或缺的, 缺少了它,我们就不能获取完整的程序信息。那到底啥是上下文呢?其实,这就是指,在 API 之间或者方法调用之间,所传递的除了业务参数之外的额外信息。 比如,服务端接收到客户端的 HTTP 请求之后,可以把客户端的 IP 地址和端口、客户端的 身份信息、请求接收的时间、Trace ID 等信息放入到上下文中,这个上下文可以在后端的 方法调用中传递,后端的业务方法除了利用正常的参数做一些业务处理(如订单处理)之 外,还可以从上下文读取到消息请求的时间、Trace ID 等信息,把服务处理的时间推送到 Trace 服务中。Trace 服务可以把同一 Trace ID 的不同方法的调用顺序和调用时间展示成 流程图,方便跟踪。 不过,Go 标准库中的 Context 功能还不止于此,它还提供了超时(Timeout)和取消 (Cancel)的机制,下面就让我一一道来。 Context 的来历 在学习 Context 的功能之前呢,我先带你了解下它的来历。毕竟,知道了它的来龙去脉, 我们才能应用得更加得心应手一些。 Go 在 1.7 的版本中才正式把 Context 加入到标准库中。在这之前,很多 Web 框架在定 义自己的 handler 时,都会传递一个自定义的 Context,把客户端的信息和客户端的请求 信息放入到 Context 中。Go 最初提供了 golang/x/net/context 库用来提供上下文信 息,最终还是在 Go1.7 中把此库提升到标准库 context 包中。 为啥呢?这是因为,在 Go1.7 之前,有很多库都依赖 golang/x/net/context 中的 Context 实现,这就导致 Go 1.7 发布之后,出现了标准库 Context 和 golang/x/net/context 并存的状况。新的代码使用标准库 Context 的时候,没有办法 使用这个标准库的 Context 去调用旧有的使用 x/net/context 实现的方法。 所以,在 Go1.9 中,还专门实现了一个叫做 type alias 的新特性,然后把 x/net/context 中的 Context 定义成标准库 Context 的别名,以解决新旧 Context 类型冲突问题,你可 以看一下下面这段代码: time.geekbang/column/article/304086 2/15 20