本篇文章主要用来介绍envoy中的流程,以及这些流程和代码里面的模块是如何对应起来的,算是从一个大的层面来解读envoy的实现。
在开始之前,我们先介绍下Envoy中的关键字段:
Listener:
服务(程序)监听者。就是真正干活的。
Envoy 会暴露一个或者多个listener监听downstream的请求。
Filter:
过滤器。在 Envoy 中指的是一些“可插拔”和可组合的逻辑处理层。
是 Envoy 核心逻辑处理单元。
Route_config:
路由规则配置,即请求路由到后端那个集群(cluster)。
Cluster:
服务提供方集群。Envoy 通过服务发现定位集群成员并获取服务。
具体请求到哪个集群成员是由负载均衡策略决定。
通过健康检查服务来对集群成员服务状态进行检查。
一、Envoy中的消息流程
在开始之前,我们先来介绍一下,一个消息在经过envoy的时候,都需要做些什么事情,流程如下所示:
流程介绍如下:
1.msg消息从listener进入到envoy中
2.msg会先经过解码操作
3.envoy的filter部分会根据msg里的关键信息做路由处理,传递给编码阶段
4.msg编码之后,会转向外部的服务Cluster
对于Envoy来说,解决最基本的点就是将消息通讯从业务解耦出来。基于这个消息通讯,Envoy在消息层面做了处理,例如解码消息的内容,并对这些消息里面的关键字做特殊处理,例如限流、路由、熔断、流量控制等等,这部分在Envoy中叫做Filter。而Filter的功能实现又会依赖于一些配置信息,例如路由配置信息,这些配置信息的获取和更新,则是通过Envoy中的XDS协议来实现的。
二、Envoy配置中的流程关联关系
下面是Envoy中的配置信息,里面标识出来,消息的流动状态:
(图片来自于:https://juejin.cn/post/6844903637710274573)
流程如下:
Listener接收到消息之后,会丢给filter_chains,
filter_chains默认会使用http_filter,
进而会根据配置的路由规则去找到对应的cluster,
消息会根据cluster中配置的网络出口来发送消息。
对请求数据的处理,Envoy抽象为Filter,这也是Envoy里面逻辑部分的核心,例如:对请求的读写是ReadFilter、WriteFilter,对HTTP请求数据的编解码是StreamEncoderFilter、StreamDecoderFilter,对TCP的处理是TcpProxyFilter,其继承自ReadFilter,对HTTP的处理是ConnectionManager,其也是继承自ReadFilter等等,各个Filter最终会组织成一个FilterChain,在收到请求后首先走FilterChain,其次路由到指定集群并做负载均衡获取一个目标地址,然后转发出去。
三、Envoy中的架构设计
通过Envoy的架构我们可以看到,Envoy主要有下面三个特点:
1. Envoy采用了类Nginx的架构,方式是:多线程 + 非阻塞 + 异步IO(Libevent),这种实现方式让Envoy的转发性能并不比Nginx差太多。
2. Envoy支持配置信息的热更新,其功能由XDS模块完成。
备注:XDS是个统称,具体包括ADS(Aggregated Discovery Service)、
SDS(Service Discovery Service)、
EDS(Endpoint Discovery Service)、
CDS(Cluster Discovery Service)、
RDS(Route Discovery Service)、
LDS(Listener Discovery Service)
XDS模块功能是向Istio的Pilot获取动态配置信息,拉取配置方式分为V1与V2版本,其中V1采用HTTP,V2采用gRPC。
3. Envoy支持热重启,即重启时可以做到无缝衔接,其基本实现原理是:
1.将统计信息与锁放到共享内存中。
2.新老进程采用基本的RPC协议使用Unix Domain Socket通讯。
3.新进程启动并完成所有初始化工作后,向老进程请求监听套接字的副本。
4.新进程接管套接字后,通知老进程关闭套接字。
5.通知老进程终止自己。
参考资料:
https://www.servicemesher.com/envoy/start/start.html
https://juejin.cn/post/6844903637710274573
http://dockone.io/article/8212
https://cloud.tencent.com/developer/article/1640416
https://cloud.tencent.com/developer/article/1396879
https://cloud.tencent.com/developer/article/1396880
https://cloud.tencent.com/developer/article/1396877