您当前位置:资讯中心 >服务器 >浏览文章

Envoy 基础入门教程,看这一篇就够了

来源:互联网 日期:2023/10/30 7:12:04 阅读量:(0)

Envoy 是一个用 C++ 开发的高性能代理,Envoy 是一种 L7 代理和通信总线,专为大型的现代面向服务的架构而设计。

核心能力

Envoy 的诞生源于以下理念:

网络对于应用程序来说应该是透明的,当网络和应用程序出现问题时,应该很容易确定问题的源头。

当然要实现上述目标是非常困难的。Envoy 试图通过提供以下高级功能来实现这一目标:

非侵入架构: Envoy 是一个独立的进程,设计为伴随每个应用程序服务一起运行。所有 Envoy 实例形成一个透明的通信网格,每个应用程序通过 localhost 发送和接收消息,不需要知道网络拓扑。对服务的实现语言也完全无感知,这种模式也被称为 Sidecar 模式。

L3/L4 过滤器架构: Envoy 的核心是一个 L3/L4 层的网络代理。可插拔的过滤器链机制允许编写不同的 TCP/UDP 代理任务的过滤器,并将其插入到主服务器中。而且已经内置支持了各种任务的过滤器,例如原始 TCP 代理、UDP 代理、HTTP 代理、TLS 客户端证书身份验证、Redis、MongoDB、Postgres 等。

HTTP L7 过滤器架构: HTTP 是现代应用程序架构的关键组件,因此 Envoy 支持了一个额外的 HTTP L7 过滤器层。HTTP 过滤器可以被插入到 HTTP 连接管理子系统中,执行不同的任务,如缓存、速率限制、路由/转发、嗅探 Amazon 的 DynamoDB 等。

顶级的 HTTP/2 支持: 在 HTTP 模式下运行时,Envoy 同时支持 HTTP/1.1 和 HTTP/2。Envoy 可以作为透明的 HTTP/1.1 到 HTTP/2 双向代理运行。这意味着可以连接任何组合的 HTTP/1.1 和 HTTP/2 客户端与目标服务器。推荐的服务到服务配置在所有 Envoy 之间使用 HTTP/2 创建持久连接网格,请求和响应可以在该连接上进行多路复用。

HTTP/3 支持(目前处于 alpha 版): 从 Envoy 1.19.0 版本开始,Envoy 现在支持上游和下游的 HTTP/3,而且可以在任何方向上进行 HTTP/1.1、HTTP/2 和 HTTP/3 之间的转换。

HTTP L7 路由: 在 HTTP 模式下运行时,Envoy 支持路由子系统,该子系统能够根据路径、权限、内容类型、运行时值等路由和重定向请求。在使用 Envoy 作为前端/边缘代理时,此功能非常有用,但在构建服务到服务的网格时也可以利用它。

gRPC 支持: gRPC 是 Google 的一个 RPC 框架,使用 HTTP/2 或更高版本作为底层多路复用传输。Envoy 支持用作 gRPC 请求和响应的路由和负载均衡基础所需的所有 HTTP/2 功能,这两个系统非常互补。

服务发现和动态配置: Envoy 可以选择使用一组分层的动态配置 API 来进行集中管理。这些层向 Envoy 提供了关于后端集群中的主机、后端集群自身、HTTP 路由、监听套接字和加密材料的动态更新。对于更简单的部署,可以通过 DNS 解析(甚至完全跳过)来完成后端主机发现,并且进一步的层可以由静态配置文件替代。

健康检查: 构建 Envoy 网格的推荐方法是将服务发现视为最终一致的过程。Envoy 包含一个健康检查子系统,可以选择对上游服务集群执行主动健康检查。然后,Envoy 使用服务发现和健康检查信息的结合来确定健康的负载均衡目标。Envoy 还通过异常值检测子系统支持被动健康检查。

高级负载均衡: 分布式系统中不同组件之间的负载均衡是一个复杂的问题。由于 Envoy 是一个独立的代理而不是库,因此可以独立实现高级负载均衡以供任何应用程序访问。目前 Envoy 支持自动重试、熔断、通过外部速率限制服务进行全局速率限制、异常检测等。

前端/边缘代理支持: 在边缘使用相同的软件有很大的好处(可观察性、管理、相同的服务发现和负载均衡算法等)。Envoy 的功能集使其非常适合作为大多数现代 Web 应用程序用例的边缘代理。这包括 TLS 终止、HTTP/1.1、HTTP/2 和 HTTP/3 支持以及 HTTP L7 路由。

最佳的可观测性: 如上所述,Envoy 的主要目标是使网络透明化。但是,问题在网络层面和应用层面都可能会出现。Envoy 为所有子系统提供了强大的统计支持。目前支持的统计数据输出端是 statsd(以及兼容的提供程序),但是接入其他不同的统计数据输出端并不困难。统计数据也可以通过管理端口进行查看,Envoy 还支持通过第三方提供者进行分布式跟踪。

常用术语

在我们介绍 Envoy 架构之前,有必要先介绍一些常用的术语定义,因为这些术语贯穿整个 Envoy 的架构设计。

  • Host(主机): 能够进行网络通信的实体(手机、服务器等上的应用程序)。在 Envoy 中主机是逻辑网络应用程序。一个物理硬件可能运行多个主机,只要每个主机可以独立进行寻址。
  • Downstream(下游): 下游主机连接到 Envoy,发送请求并接收响应。
  • Upstream(上游): 上游主机接收来自 Envoy 的连接和请求并返回响应。
  • Listener(侦听器): 侦听器是一个带有名称的网络位置(例如端口、unix domain socket 等),下游客户端可以连接到该位置。Envoy 暴露一个或多个监听器,供下游主机连接。
  • Cluster(集群): 一个集群是一组逻辑上相似的上游主机,Envoy 连接到这些主机。Envoy 通过服务发现来发现集群的成员。它还可以通过主动健康检查来确定集群成员的健康状况。Envoy 根据负载均衡策略确定将请求路由到哪个集群成员。
  • Mesh(网格): 一组主机协同工作,提供一致的网络拓扑结构。在这里 Envoy Mesh 是指一组 Envoy 代理,它们构成了由多种不同服务和应用程序平台组成的分布式系统的消息传递基础。
  • Runtime configuration(运行时配置): 与 Envoy 一起部署的实时配置系统。可以更改配置设置,影响操作而无需重新启动 Envoy 或更改主要配置。

架构设计

Envoy 采用单进程多线程架构。

一个独立的 primary 线程负责控制各种零散的协调任务,而一些 worker 线程则负责执行监听、过滤和转发任务。

一旦侦听器接受连接,该连接就会将其生命周期绑定到一个单独的 worker 线程。这使得 Envoy 的大部分工作基本上是单线程来处理的,只有少量更复杂的代码处理工作线程之间的协调。

通常情况下 Envoy 实现了 100% 非阻塞。对于大多数工作负载,我们建议将 worker 线程的数量配置为机器上的硬件线程数量。

Envoy 整体架构如下图所示:

Envoy 架构

Envoy 进程中运行着一系列 Inbound/Outbound 监听器(Listener),Inbound 代理入站流量,Outbound 代理出站流量。Listener 的核心就是过滤器链(FilterChain),链中每个过滤器都能够控制流量的处理流程。

Envoy 接收到请求后,会先走 FilterChain,通过各种 L3/L4/L7 Filter 对请求进行处理,然后再路由到指定的集群,并通过负载均衡获取一个目标地址,最后再转发出去。

其中每一个环节可以静态配置,也可以动态服务发现,也就是所谓的 xDS,这里的 x 是一个代词,是 lds、rds、cds、eds、sds 的总称,即服务发现,后 2 个字母 ds 就是 discovery service。

第一个 Envoy 代理

下面我们通过一个简单的示例来介绍 Envoy 的基本使用。

配置

Envoy 使用 YAML 文件来控制代理的行为,整体配置结构如下:

listen -- 监听器
    1.我监听的地址
    2.过滤链
        filter1
            路由: 转发到哪里
                virtual_hosts
                    只转发什么
                    转发到哪里 --> 由后面的 cluster 来定义
        filter2
        filter3
        # envoyproxy.io/docs/envoy/v1.28.0/api-v3/config/filter/filter
cluster
    转发规则
    endpoints
        --指定了我的后端地址
关键字:
声明:我公司网站部分信息和资讯来自于网络,若涉及版权相关问题请致电(63937922)或在线提交留言告知,我们会第一时间屏蔽删除。
有价值
0% (0)
无价值
0% (10)

分享转发:

发表评论请先登录后发表评论。愿您的每句评论,都能给大家的生活添色彩,带来共鸣,带来思索,带来快乐。