乐趣区

关于envoy:Envoy-HTTP-反向代理实现的事件流

本文摘自我的开源图书:《Istio & Envoy 底细》中的:HCM upstream/downstream 事件驱动合作下的 HTTP 反向代理流程 一节。能够下载 pdf 或在线浏览。如转载图片不清,可回到原文。

HTTP 反向代理的总流程

整体看,Socket 事件驱动的 HTTP 反向代理总流程如下:

图中看出,有 4 种事件驱动了整个流程。前面几节会一一剖析。

Downstream Read Request 模块合作

图:Downstream Read-Ready 模块合作

用 Draw.io 关上

大略阐明一下流程:

  1. downstream socket 可读回调
  2. Http::ConnectionManagerImpl 读取 socket,增量放入 Http1::ConnectionImpl
  3. Http1::ConnectionImpl 调用 nghttp2 增量解释 HTTP 申请
  4. 如果 nghttp2 认为曾经 残缺读取了 HTTP Request 申请,则调用 Http::ServerConnection::onMessageCompleteBase()
  5. Http::ServerConnection::onMessageCompleteBase() 首先 进行 downstream ReadReady 监听
  6. Http::ServerConnection::onMessageCompleteBase() 调用 Http::FilterManager,发动 http filter chain 的 decodeHeaders 迭代流程
  7. 个别,http filter chain 的最初一个 http filter 是 Router::FilterRouter::Filter::decodeHeaders() 被调用
  8. Router::Filter::decodeHeaders() 的逻辑就见下图了。

Downstream Request Router 模块合作

图:Downstream Request Router 模块合作

用 Draw.io 关上

大略阐明一下流程:

  1. Router::FilterRouter::Filter::decodeHeaders() 被调用
  2. 依据配置的 Router 规定,匹配到 Cluster
  3. 如 Cluster 连接池对象不存在,则新建
  4. 新建 Envoy::Router::UpstreamRequest 对象。
  5. 调用 Envoy::Router::UpstreamRequest::encodeHeaders(bool end_stream),encode HTTP header
  6. 通过一系列的负载平衡算法,匹配到 upstream 的 host(endpoint)
  7. 发现到选定的 upstream host 的连贯有余,则:

    1. 关上一新的 socket fd(未连贯)
    2. 注册 upstream socket FD 的 WriteReady / Connected 事件。筹备在事件回调时写 upstream request
    3. 用 socket fd 发动到 upstream host 的异步连贯申请
  8. 关联 downstream 与 upstream fd

Upstream Write Request 模块合作

图:upstream connect & write 模块合作

用 Draw.io 关上

大略阐明一下流程:

  1. upstream socket write ready 回调
  2. 发现是连贯胜利回调,关联 upstream socket 到 ConnectionPool::ActiveClient
  3. upstream socket write ready 回调
  4. 发现是连贯可写,写入 upstream HTTP request

Upstream Read Response 模块合作

图:Upstream Read-Response 模块合作
:::
用 Draw.io 关上

Downstream Write Response 模块合作

图:Downstream Write Response 模块合作
用 Draw.io 关上

求证过程

见:

  • 逆向工程与云原生现场剖析 Part4 —— eBPF 跟踪 Istio/Envoy 之 upstream/downstream 事件驱动合作下的 HTTP 反向代理流程
退出移动版