Dawn's Blogs

分享技术 记录成长

0%

阅读dubbo-kubernetes的启发 (4) Envoy

Envoy 介绍

Envoy 是由 C++ 实现的,为面向大型现代服务架构而设计的 L7 代理和通信总线。Envoy 是一个独立的进程,伴随每个应用服务运行(service mesh),所有的 Envoy 形成了一个透明的网络,每一个应用与 localhost 收发消息,而对网络拓扑结构无感知。这样做的好处:

  • 适用于任何编程语言。Envoy 可以在 Java、Go、Python 等应用程序之间形成一个网络,Envoy 弥合了它们之间的差异。
  • Envoy 可以透明地在整个基础架构上快速部署和升级。

Envoy 在云原生中可以扮演边车的角色,所有到服务的流量都通过 Envoy 代理。

img

特点

Envoy 有以下功能/特点:

  • L3/L4/L7 架构:传统的网络代理要么在 HTTP 层工作,要么在 TCP 层工作。在 HTTP 层会读取整个 HTTP 请求数据,对请求解析并查看 HTTP 头部和 URL 以决定做什么;同时也需要读取后段的整个响应数据,并将其发送给客户端。这种方法非常复杂和缓慢,解决方法就是下沉到 TCP 中去操作。在 TCP 层只读取和写入字节,并使用 IP + 端口号来决定如何处理,但是无法根据不同的 URL 代理到不同的后端。Envoy 同时支持在 3/4 和 7 层工作,以此应对各自层级的限制。
  • 顶级 HTTP/2 支持:Envoy 将 HTTP/2 视为一等公民,支持 HTTP2 和 HTTP/1.1 之间的转换。
  • 服务发现和动态配置:Envoy 可以通过 API 来实现其控制平面(典型的,Istio 就是 Envoy 的一个控制面),控制平面可以实现服务发现并通过 API 接口动态更新 Envoy(数据面)的配置。不仅如此,控制平面还可以通过 API 将配置进行分层,然后逐层更新。
  • gRPC 支持:Envoy 支持 HTTP/2,同时也支持 gRPC。
  • 特殊协议支持:Envoy 支持对特殊协议在 L7 进行嗅探,包括 MongoDB、DynamoDB 等。
  • 可观测性:Envoy 使网络透明,可以生成许多流量方面的统计数据,这是其它代理软件很难取代的地方,可以集成 Promethus 等监控方案、分布式追踪系统。

Envoy 架构

Envoy 使用单进程-多线程架构。一个主线处理与协调任务,多个 worker 线程负责监听、过滤、转发。 当一个连接被监听器接受,连接的剩余生命周期将绑定在当前 worker 线程,这使得 Envoy 近似于非阻塞。这使得 Envoy 大部分连接近似单线程运行(高度并行), 只有少量的复杂代码用于实现 worker 线程之间的协调。

所以,worker 线程数量应该配置为物理机的线程数量

Envoy 同 Nginx 一样,也采用了多进程 + 非阻塞 + 异步 IO。

默认情况下,worker 线程之间没有协调。这表示所有 worker 线程都独立的尝试从每一个监听器接受连接, 然后依赖内核在线程之间执行适当的均衡。对于大多数工作负载,内核都可以很好的均衡传入的连接。但是, 对于某些工作负载,特别是那些只有少量但非常长寿命的连接的工作负载(例如 gRPC 流), 则可能希望让 Envoy 强制平衡工作线程之间的连接。为了支持这种行为, Envoy 允许为每个监听器配置不同类型的连接均衡。

下图为 Envoy 的架构图:

img

Envoy 有四个关键组件

  • 监听器(Listener): 监听器定义了 Envoy 如何处理连接请求,一旦建立连接之后,就会将该请求传递给一组过滤器(filter)进行处理。
  • 过滤器(Filter): 过滤器是处理入站和出站流量的链式结构的一部分。在过滤器链上可以集成很多特定功能的过滤器,例如,通过集成 GZip 过滤器可以在数据发送到客户端之前压缩数据。
  • 路由(Router): 路由用来将流量转发到具体的目标实例,目标实例在 Envoy 中被定义为集群。
  • 集群(Cluster): 集群定义了流量的目标端点,同时还包括一些其他可选配置,如负载均衡策略等。

Filter

Envoy 运行着一系列 Listener,Listener 的核心就是过滤器链(FilterChain)。过滤器链中的过滤器分为两个类别:

  • 网络过滤器(L3/L4 层):是 Envoy 网络连接处理的核心,处理的是原始字节,分为 Read、Write 和 Read/Write 三类。
  • L7 过滤器:在 L3/L4 之上的过滤器,主要支持 HTTP 和 Thrift 协议。
    • HTTP 过滤器:由 HTTP connection manager 管理,专门处理 HTTP1/HTTP2/gRPC 协议,将原始字节转换成 HTTP 格式,从而对 HTTP 协议进行精准控制。
    • Thrift Proxy:用于支持 Thrift 协议。

除了过滤器链之外,还有一种过滤器叫监听器过滤器(Listener Filters),它会在过滤器链之前执行,用于操纵连接的元数据。这样做的目的是,无需更改 Envoy 的核心代码就可以方便地集成更多功能。

img