HCM upstream/downstream 事件驱动协作下的 HTTP 反向代理流程#
HTTP 反向代理的总流程#
整体看,Socket 事件驱动的 HTTP 反向代理总流程如下:
图中看出,有4种事件驱动了整个流程。后面几节会逐个分析。
为免一下子进入各个步骤细节而让人迷途,建议回顾一下之前举例的所有步骤的总流程: Istio 下 Envoy 配置举例
Downstream Read Request 模块协作#
图:Downstream Read-Ready 模块协作#
大概说明一下流程:
downstream socket 可读回调
Http::ConnectionManagerImpl 读取 socket,增量放入 Http1::ConnectionImpl
Http1::ConnectionImpl 调用 nghttp2 增量解释 HTTP 请求
如果 nghttp2 认为已经 完整读取了 HTTP Request 请求,则调用
Http::ServerConnection::onMessageCompleteBase()
Http::ServerConnection::onMessageCompleteBase()
首先 停止 downstream ReadReady 监听Http::ServerConnection::onMessageCompleteBase()
调用Http::FilterManager
,发起http filter chain
的 decodeHeaders 迭代流程一般,
http filter chain
的最后一个 http filter 是Router::Filter
,Router::Filter::decodeHeaders()
被调用Router::Filter::decodeHeaders()
的逻辑就见下图了。
Downstream Request Router 模块协作#
图:Downstream Request Router 模块协作#
大概说明一下流程:
Router::Filter
,Router::Filter::decodeHeaders()
被调用根据配置的 Router 规则,匹配到 Cluster
如 Cluster 连接池对象不存在,则新建
新建
Envoy::Router::UpstreamRequest
对象。调用
Envoy::Router::UpstreamRequest::encodeHeaders(bool end_stream)
, encode HTTP header经过一系列的负载均衡算法,匹配到 upstream 的 host(endpoint)
发现到选定的 upstream host 的连接不足,则:
打开一新的 socket fd(未连接)
注册 upstream socket FD 的 WriteReady / Connected 事件。 准备在事件回调时写 upstream request
用 socket fd 发起到 upstream host 的异步连接请求
关联 downstream 与 upstream fd
Upstream Write Request 模块协作#
图:upstream connect & write 模块协作#
大概说明一下流程:
upstream socket write ready 回调
发现是连接成功回调,关联 upstream socket 到
ConnectionPool::ActiveClient
upstream socket write ready 回调
发现是连接可写,写入 upstream HTTP request
Upstream Read Response 模块协作#
图:Upstream Read-Response 模块协作#
Downstream Write Response 模块协作#
图:Downstream Write Response 模块协作#