服务网格-Envoy学习笔记:Envoy架构总览(3)

HTTP 链接管理

对于基于服务的现代应用架构来说,HTTP是一个非常核心的组件,因此 Envoy 提供大量的针对HTTP的功能。Envoy 在网络层有一个过滤器叫做HTTP 链接管理器(HTTP connection manager)。该过滤器将字节流转化为 HTTP 层的消息和事件。(例如HTTP header 信息,body 信息和 trailer 信息)。它还处理所有 HTTP 连接和请求所共有的功能,如访问日志记录、请求 id 生成和跟踪、请求/响应 Header 操作、路由表管理和统计信息。

HTTP 协议

Envoy 的 HTTP 连接管理器支持 HTTP/1.1、WebSockets 和 HTTP/2 。它不支持 SPDY。Envoy 的 HTTP 支持首选为 HTTP/2 多路复用代理。在内部,HTTP/2 术语用于描述系统组件。例如,HTTP 请求和响应发生在流上,编解码器 API 用于将不同的协议相关的内容转换为用于流、请求、响应等与协议不相关的形式。在 HTTP/1.1 的情况下,编解码器将协议的串行/流水线功能转换为类似于 HTTP/2 的内容,将其转换为更高的层。这意味着大多数代码不需要了解流是源自 HTTP/1.1 还是 HTTP/2 连接。

HTTP Header 清理

出于安全原因, HTTP 连接管理器执行各种 HTTP Header 清理操作。

路由表配置

每个HTTP 连接管理器都被分配一个路由表。该路由表可以支持以下两种模式:

  • 静态路由表
  • 基于RDS API的动态路由表

重试插件配置

通常在重试过程中,主机选择遵循与原始请求相同的过程。若要修改此行为,可以使用重试插件,这些插件分为两类:

  • 主机断言(Host Predicates):这些断言可用于 "拒绝" 主机,这将导致重新尝试选择主机。可以任意指定这些断言的数量,如果任何断言拒绝主机,则主机将被拒绝。
    Envoy 支持以下内置主机断言

    • envoy.retry_host_predicates.previous_hosts: 这将跟踪以前尝试过的主机,并拒绝已尝试的主机。
  • 优先级断言(Priority Predicates):这些断言可用于调整加载的优先级,这被用来决定重试时选择的顺序。只能指定一个这样的断言。
    Envoy支持以下内置优先级断言

    • envoy.retry_priority.previous_priorities: 这将跟踪以前重试的顺序,并调整加载的优先级,以便在后续重试中用于其他优先级。

主机选择将持续执行,直到配置的断言接受主机或达到配置的最大重试次数。
这些插件可以组合在一起,以影响主机选择和加载的优先级。Envoy 还可以使用自定义重试插件进行扩展,类似于添加自定义过滤器。

配置示例:
例如配置一个重试机制,尝试从来没有连接过的主机,可以使用内置的envoy.retry_host_predicates.previous_hosts断言。

retry_policy:
  retry_host_predicate:
  - name: envoy.retry_host_predicates.previous_hosts
  host_selection_retry_max_attempts: 3

这条断言会拒绝之前已经尝试过的主机,并且最多尝试重连3次。尝试时的次数限制是必要的,以便处理在以下情况:找到一个可接受的主机是不可能的(没有主机满足断言) 或非常不可能的(唯一合适的主机具有非常低的相对权重)。

若要配置重试以在重试期间尝试其他优先级,可以使用内置的envoy.retry_host_predicates.previous_hosts断言。

retry_policy:
  retry_priority:
    name: envoy.retry_priorities.previous_priorities
    config:
      update_frequency: 2

这将在后续的尝试中定位之前没有使用过的优先级。update_frequency决定重新计算加载顺序的频率。

这些插件可以组合使用,用来排除之前使用过的主机和优先级:

retry_policy:
  retry_host_predicate:
  - name: envoy.retry_host_predicates.previous_hosts
  host_selection_retry_max_attempts: 3
  retry_priority:
    name: envoy.retry_priorities.previous_priorities
    config:
      update_frequency: 2

内部重定向

Envoy 支持在内部处理302重定向,即捕获302重定向响应,生成新请求,将其发送到新路由匹配指定的上游目的地,并将重定向响应作为响应返回到原始请求。
内部重定向是通过路由配置中的 ref:redirect action <envoy_api_field_route.RouteAction.redirect_action>字段配置。当重定向处理打开时,来自上游的任何302响应都受 Envoy 的重定向处理的影响。
要成功处理重定向, 必须通过以下检查:

  1. 是302个响应。
  2. 具有与原始请求的 Scheme 匹配的有效的、完全限定的 URL的Location Header。
  3. 这一请求必须是交给 Envoy 处理的。
  4. 请求不能有 body。
  5. 以前必须没有重定向请求, 这取决于是否存在 x-envoy-furl 标头。

任何 Envoy 无法处理的都会将重定向请求交给下游。

一旦重定向通过了这些检查,发送到原始上游的请求 header 将进行以下修改:

  1. 将完全限定的原始请求 url 放在 x-envoy-furl 标头中。
  2. 用 Location Header 中的值替换Authority/Host、Scheme 和 Path。

然后,更改后的请求标头将选择新的路由,通过新的过滤链发送,然后在进行所有正常 Envoy 请求清理的情况下向上游运输。

警告

请注意,HTTP 连接管理器清理 (如清除不受信任的Header) 将只应用一次。每个路由 Header 修改将同时应用于原始路由和第二次路由,即使它们是相同的,因此请小心配置标头修改规则,以避免重复不需要的标头值。

示例重定向流可能如下所示:

  1. 客户端发送 http://foo.com/bar 的 Get 请求
  2. 上游1发送一个302响应包含 “location: http://baz.com/eep
  3. Envoy 配置为允许在原始路由上重定向,并向上游2发送新的附加 “x-envoy-original-url: http://foo.com/bar” 的 Get 请求,以获取 http://baz.com/eep 的内容。
  4. Envoy 将 http://baz.com/eep 的响应数据代理到客户端,作为对原始请求的响应。

超时

各种可配置的超时策略适用于 HTTP 连接及其组成流:

  1. 连接级空闲超时:这适用于没有任何流处于活动状态的空闲期间。
  2. 连接层流失超时:这发生在源于 GOAWAY 的 Enovy 和连接终止之间。
  3. 流级别空闲超时:这适用于每个单独的流。它可以在连接管理器和每个路由粒度进行配置。流上的 Header/data/trailer 事件会重置超时时间。
  4. 流级别的每个路由的上游超时:这适用于上游响应,即从下游请求结束到上游响应结束的时间的最大限制。这也可以在每次重试处指定。
  5. 流级别的每个路由 gRPC 最大超时:这限制了上游超时, 并允许通过 gRPC 超时请求 Header 重写超时。
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,451评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,172评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,782评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,709评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,733评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,578评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,320评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,241评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,686评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,878评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,992评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,715评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,336评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,912评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,040评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,173评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,947评论 2 355

推荐阅读更多精彩内容