前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Envoy架构之流程梳理

Envoy架构之流程梳理

作者头像
灰子学技术
发布2021-07-09 11:45:23
1.6K0
发布2021-07-09 11:45:23
举报
文章被收录于专栏:灰子学技术

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

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

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

一、Envoy中的消息流程

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

流程介绍如下:

代码语言:javascript
复制
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)

流程如下:

代码语言:javascript
复制
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模块完成。

代码语言:javascript
复制
备注: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支持热重启,即重启时可以做到无缝衔接,其基本实现原理是:

代码语言:javascript
复制
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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-06-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 灰子学技术 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
负载均衡
负载均衡(Cloud Load Balancer,CLB)提供安全快捷的流量分发服务,访问流量经由 CLB 可以自动分配到云中的多台后端服务器上,扩展系统的服务能力并消除单点故障。负载均衡支持亿级连接和千万级并发,可轻松应对大流量访问,满足业务需求。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档