Envoy

特性

进程无关架构

Envoy是一个自组织的模块,与应用Server并无直接依赖。所有的Envoy构建了一个透明的服务网格Service Mesh,处于其中的应用只需要简单的与本地的Envoy进行收发信息,并不需要关注整个网络拓扑。这种架构对于应用通信有两大好处:

  • Envoy可以让任何的编程语言编写的服务通信,协同工作,Envoy帮你屏蔽了服务之间的沟壑。
  • 任何曾经在大型微服务开发中工作过的人都知道发布一个库更新是多么的痛苦。Envoy可以以一种透明的方式快速的发布更新整个基础架构中的版本。

高级负载均衡

分布式系统中不同模块间的负载均衡是一个复杂的问题。因为Envoy是一个自组织的代理,所以它能在一个地方实现高级负载均衡技术并使他们可被访问。当前Envoy支持自动重试、断路器,全局限速,阻隔请求,异常检测。将来还会支持按计划进行请求速率控制。

动态配置

Envoy提供了可选的一系列的分层的动态配置API,使用这些API可以构建出复杂的集中式部署管理。

正向代理支持

虽然Envoy设计初衷是服务和服务之间通信系统,得益于其监视、管理、服务发现和负载均衡算法的实现,Enovy包含了足够多的特性为绝大多数Web服务做正向代理。

除了这些之外还有对HTTP/2的支持,L3、L4、L7代理,可以实现TCP Proxy、HTTP Proxy等功能

整体架构


线程模型

Envoy使用单进程多线程架构,其中一个扮演主线程的控制各种协调任务,而一些工作线程负责监听、过滤和转发。一旦某个链接被监听器Listener接受,那么这个链接将会剩余的生命周期绑定在这个woker线程。这种架构会使得大部分工作工作在单线程的情况下,只有少量的工作会涉及到线程间通信,Envoy代码是100%非阻塞的。

Listener监听器

  • 一个Envoy进程可以设置多个不同的listener,建议一台机器只使用一个Envoy实例。当前Envoy版本(1.8版本)只支持TCP listener
  • 每一个Listener的网络层L3/L4过滤器是独立配置的。并且一个Listener是可以通过配置来完成多种任务的:访问限制、TLS客户端校验、HTTP链接管理等
  • Listener也有自己的非网络层过滤器,它可以修改链接的Metadata信息,通常用来影响接下来链接是如何被网络层过滤器处理的。
  • 无论网络层过滤器还是Listener过滤器都可以提前终止后续的过滤器链的执行

HTTP 连接管理器

  • Envoy是完整支持HTTP/1.1, Websockets和 HTTP/2,不支持SPDY.
  • 这层过滤器主要是将原始的传递数据转变成HTTP层级的信息和事件,如收到Headers、收到Body数据,同样它也可以做接入日志、Request ID生成和追踪、req/res头部修改工作、路由表管理、统计分析
  • 每一个HTTP链接管理器有一个相匹配的路由表,路由表可以静态指定,也可以动态地通过RDS API来设置 route-dynamic
  • 其内部还有HTTP过滤器,可以支持在http层级在无需关注使用什么协议(HTTP/1.1 HTTP/2)实现的情况下进行操作HTTP内容。支持encode decode encode/decode三种不同类型过滤器

HTTP路由器

  • 经常用在做边缘/反向代理和构建内部Envoy Mesh发挥巨大作用
  • HTTP 路由器可以支持请求重试配置:最大重试次数 和 设置重试条件,比如某些5XX错误和具有幂等性操作的4XX错误
  • Envoy自己使用HTTP/2链接管理器实现了gRPC协议,将原来官方的google gRPC内置的很多功能比如重试、超时、endpoint 发现、负载均衡、负载报告、健康检查等功能都实现了,将来除非特殊特性必须,都可以使用Envoy gRPC来实现

Cluster管理器

Cluster管理器暴露API给过滤器,并允许过滤器可以得到链接到上游集群的L3/L4链接或者维持一个抽象的HTTP连接池用来链接上游集群(上游主机支持HTTP1.1还是HTTP2都是被隐藏的)过滤器决定是使用L3/L4链接还是HTTP Stream来链接上游集群。而对于集群管理器来说,它负责所有集群内主机的可用性、负载均衡、健康度、线程安全的上游链接数据,上游链接类型TCP/UP、UDS,上游可接受的协议 HTTP1.1/2。Cluster管理器既可以静态配置,也可以使用CDS-Cluster-Discovery-Service API来动态配置。 集群在正式使用之前有一个“加热”Warming的过程: 先做服务发现必要的初始化,比如DNS 记录更新、EDS更新,然后进行健康检查,当进行完上述的过程,会进入'Becoming available'状态,这个阶段Envoy不会把流量指向它们;在更新集群时,也不会把正在处理流量的集群处理掉,而是用新的去替换老的那些还未进行任何流量的集群