Envoy架构之流程梳理

本篇文章主要用来介绍envoy中的流程,以及这些流程和代码里面的模块是如何对应起来的,算是从一个大的层面来解读envoy的实现。

在开始之前,我们先介绍下Envoy中的关键字段:

Listener:
 服务(程序)监听者。就是真正干活的。
 Envoy 会暴露一个或者多个listener监听downstream的请求。
Filter: 
过滤器。在 Envoy 中指的是一些“可插拔”和可组合的逻辑处理层。
是 Envoy 核心逻辑处理单元。
Route_config:
 路由规则配置,即请求路由到后端那个集群(cluster)。
Cluster: 
服务提供方集群。Envoy 通过服务发现定位集群成员并获取服务。
具体请求到哪个集群成员是由负载均衡策略决定。
通过健康检查服务来对集群成员服务状态进行检查。

一、Envoy中的消息流程

      在开始之前,我们先来介绍一下,一个消息在经过envoy的时候,都需要做些什么事情,流程如下所示:

Envoy架构之流程梳理_第1张图片

流程介绍如下:

1.msg消息从listener进入到envoy中
2.msg会先经过解码操作
3.envoy的filter部分会根据msg里的关键信息做路由处理,传递给编码阶段
4.msg编码之后,会转向外部的服务Cluster

    对于Envoy来说,解决最基本的点就是将消息通讯从业务解耦出来。基于这个消息通讯,Envoy在消息层面做了处理,例如解码消息的内容,并对这些消息里面的关键字做特殊处理,例如限流、路由、熔断、流量控制等等,这部分在Envoy中叫做Filter。而Filter的功能实现又会依赖于一些配置信息,例如路由配置信息,这些配置信息的获取和更新,则是通过Envoy中的XDS协议来实现的。

 二、Envoy配置中的流程关联关系

下面是Envoy中的配置信息,里面标识出来,消息的流动状态:

Envoy架构之流程梳理_第2张图片

图片来自于: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

你可能感兴趣的:(java,分布式,linux,nginx,网络)