1. Introduction
Header Propagation
顾名思义就是将请求的 Header
进行传递,整个流程大致如下:
服务在接收到请求之后,会交给中间件处理,中间件会记录下原先请求(inbound)的 Header
,如果说这个请求需要访问别的服务以获得资源,那么可以将 inbound
请求的 Header
添加 outbound
请求的 Header
中。通常转发的情况分为三种:
- 直接转换
Header
: 比如说上述示例中,X-Feature: Test
被直接转发 - 转换
Header
的名称: 在获取X-Feature
之后,可能将这个Header
修改为X-Feature-Internal: Test
- 创建一个完全不同的
Header
: 也就是说在后续的请求Header
中 可能是这样的X-Feature-Internal: demo
2 HeaderPropagationOptions
HeaderPropagationOptions
只包含了一个 HeaderPropagationEntryCollection
类型的属性,该类型是 HeaderPropagationEntry
的集合,该类型包含下面三个属性
该类型代表了在 Middleware
中需要关注的 Header
InboundHeaderName
原始请求的需要传递的Header
名称;CapturedHeaderName
需要将它转换的Header
的名称;ValueFilter
可以将Header
的修改的委托。
3 HeaderPropagationMessageHandlerOptions
该类主要用在 HttpClient
的 MessageHandler
中,在 SendAsync
方法中,在 HttpRequestMessage
中添加相关的 Header
。
同样 HeaderPropagationMessageHandlerEntryCollection
是 HeaderPropagationHandlerEntry
的集合
该类型只有两个属性: 1) CaptureHeaderName
是 HeaderPropagationEntry
中 CaptureHeaderName
;2) OutboundHeaderName
是转换的请求, Header
的名称。
4 HeaderPropagationValue
这是一个字典,存储了因为 HeaderPropagation
的中间数据
采用 AsyncLocal
可以保存这个类型在多线程中也是安全的,其中字典的 Key
是 CaptureHeaderName
,它是衔接 HeaderPropagationEntry
和 HeaderPropagationMessageHandlerEntry
。
5. HeaderPropagationMiddleware
整个过程非常 StraightForward
, 依次迭代 HeaderPropagationEntryCollection
对象,从请求的 Header
中获取值,并且添加到 HeaderPropagationValue
中。
6 HeaderPropagationMessageHandler
HeaderPropagationMessageHandler
会在构建 HttpClient
的时候,创建这个 MessageHandler
。不过要注意下面几点
- 首先是迭代
HeaderPropagationMessageHandlerEntryCollection
对象,因为它是一个集合,迭代时候没有内存分配;还有通常情况下,这个数据量比较小; - 如果请求中已经有了这个
outboundHeaderName
, 则不需要添加header