GO HTTP中context的传递

Go 1.7引入了一个内置的上下文类型。在系统中,可以使用上下文传递请求范围的元数据,例如不同函数,线程甚至进程之间的请求ID。

Go最初将上下文包引入标准库,以统一同一进程内的上下文传播。因此整个库和框架空间可以对抗标准上下文,我们可以避免碎片。在引入该包之前,每个框架都在发明它们自己的上下文类型,并且没有两个上下文彼此兼容。这导致在没有编写胶水代码的情况下传播当前上下文变得困难的情况。

尽管引入公共上下文传播机制对于统一同一进程内的案例很有用,但Go上下文包不提供对线路的任何支持。如上所述,在网络系统中,上下文应该在不同进程之间传播。例如,在多服务体系结构中,请求通过多个进程(几个微服务,消息队列,数据库),直到提供用户请求。能够在进程之间传播上下文对于堆栈的下端与正确的上下文一起工作是很重要的。

如果要通过HTTP传播当前上下文,则需要自己序列化上下文。类似地,在接收端,你需要解析传入的请求并将值放入当前上下文中。假设,我们希望在上下文中传播请求ID。

WithID允许我们读取,IDFromContext允许我们将请求ID放在给定的上下文中。一旦我们想要跨越流程边界,我们就需要进行手动工作以将上下文置于线路上。同时,将其从有线解析到接收端的上下文。

在HTTP上,我们可以将请求ID转储为标头。大多数上下文感知元数据可以作为标头传播。一些传输层可能不提供报头或报头可能不满足传播数据的要求(例如,由于大小限制和缺乏加密)。在这种情况下,由实现来决定如何传播上下文。

HTTP传播

没有自动方法将上下文放入HTTP请求,反之亦然。由于无法迭代上下文值,因此也无法转储整个上下文。

在上面的传输中,请求ID(如果存在于请求上下文中)将作为“request-id”标头传播。

类似地,处理程序可以解析传入的请求以将“request-id”放入请求上下文中。

为了继续传播上下文,请确保将当前上下文传递给处理程序的传出请求。传入上下文将传播到//endpoint请求。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20181127A0YGMB00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

同媒体快讯

扫码关注云+社区

领取腾讯云代金券