Envoy

一、Envoy简介

Envoy 是一款由Lyft开源的高性能服务代理软件,使用现代C++语言(C++11及C++14)开发,提供四层和七层网络代理功能。2017年,Envoy 被捐赠给 CNCF 基金会,最终成为继Kubenetes利Prometheus 之后第3个 CNCF毕业项目。尽管在设计之初Envoy没有将性能作为最终的目标,而是更加强调模块化、易测试、易开发等特性,但是它仍旧拥有足可媲美 Nginx 等经典代理软件的超高性能。在保证性能的同时,Envoy也提供了强大的流量治理功能和可观察性。其独创的xDS 协议则

成为构建 Sevice Mesh 通用数据平面 API(UPDA)的基石。具体来说,Envoy 具有以下的优点。

  • 高性能:使用C++语言实现,基于 Libevent 事件机制及 I/O,保障性能。
  • 易扩展:利用其L3/L4/L7筛选器机制,Envoy 可以在各个层次进行功能 展。包括但不限额外代理协议支持、HTE 流量治理功能 展等。Envo及好的期送相现S+语育对各种操作的简化,使其开发过程非常友好。此外,Eavoy 也提供了基于WASM 的扩展支持,以及基于Lua脚本的简单功能扩展。
  • 多协议支持:原生支持代理HTTP、Kafka、Dubbo、Redis 等多种协议。
  • 动态化配置:基于xDS 协议实现配置的完全动态化,简化配置更新操作,实现监听端口、路由规则、后端服务发现等全运行时动态下发及更新。
  • 可观察性:内置日志、指标和分布式追踪3个模块,用于实现全方位、多维度的流量和事件观察。
  • HTTP筛选器:社区原生提供了大量的功能强大的HTTP筛选器,如限流、认证鉴权、缓存、压缩、gRPC协议转换等,开箱即用。
  • 社区开放活跃:Bnvoy完全开源,不存在对应的商业版本,保证了它的发展不会受限于商业化;而且 Envoy 社区非常活跃,不断向前推动Bnvoy 的演进和发展。

得益于以上的种种特性,Envoy可以说已经是云原生时代数据平面的事实标准。新兴的微服务网关,如Gloo、Ambassador 都基于 Bnvoy 进行扩展开发;而在服务网格中,Istio、Kong社区、Kuma、亚马逊AWS AppMesh 都使用 Envoy作为默认数据平面。接下来,本节将从系统架构、xDS协议、可观察性,以及应用场景4个方面介绍 Envoy 相关概念。

二、Envoy系统架构

在介绍更具体的内容之前,本小节先向读者介绍一些 Bnvoy 申常见的概念。在 Envoy 中,数据请求的人口方向被称为下游(Downstream),而数据请求的出口方向则被称为上游(Upstream)。Envoy接收来自下游的请求并将之转发给上游。Envoy 的系统架构如图所示。

ef39e2e9fe9b460594ac0ca4a2c91c15.png

在下游方向,Envoy 使用监听器(Listener)来监听数据端口,接收下游连接和请求;在上游方向,Envoy 使用集群(Cluster)来抽象上游服务,管理连接池,以及与之相关的使康检查等配置。而在监听器和集群之间,Envoy则使用筛选器(Filter)和路由(Router)将两者联系在一起。

相比于监听器、集群和路由等概念,筛选器可能需要稍微再多一点解释。筛选器是 Envoy 中可插拔的多种功能组件的统称,简单来说,筛选器就是插件。但是 Envoy 中L3/L4筛选器架构大大护展了它的功能界限,以至于筛选器的内涵要比常规理解的“插件”要丰富得多,所以本小节选择直译官方名称,称其为筛选器而非插件。Envoy包含了多种类型的筛选器。其中,L3/L4筛选器主要用于处理连接和协议解析,不同的L3/L4 筛选器可以使 Envoy代理不同协议的网络数据。举例来说,Envoy 中最为核心的 HTTP 代理功能就是构筑在一个名为 “ HTTP 连接管理器(HTTP ComnecionManager)” 的L4 筛选器上的。而L7筛选器(在绝大多数情况下,L7筛选器都可以等同于 HTTE筛选器)则是作为L4 筛选器的子筛选器存在的,用于支撑实现更加丰富的流量治理功能。监昕器、集群、路由和筛选器构成了Envoy 最为核心的骨架。

三、Envoy线程模型

Envoy 采用多线程及基于 Libeveat 的事件触发机制来保证其超高的性能。在 Envoy 中,共存在3种不同的线程,分别是 Main 线程、Worker线程及文件刷新线程。Envoy 的线程模型如图所示。

c1ef5f5e70df4af0bd863912afbfffb6.png

Main 线程负责配置更新(对接 xDS 服务)、监控指标刷新和输出、对外提供 Admin 端口等工作。此外,Main 线程也负责整个进程的管理,如处理操作系统信号、Envoy热重启等。

Worker 线程是一个非阻塞的事件循环,每个 Worker 线程都会监听所有的 Listener,并处理相关链接和请求事件。需要注意的是,操作系统会保证一个事件最终只会被一个 Worker 线程处理。在绝

大多数情况下,Worker 线程都只在不断地处理下游的请求和上游的响应。在极少数情况下,Main线程会将配置更新以事件的形式添加到 Worker 线程的事件循环中。

文件刷新线程负责将 Envoy 需要持久化的数据写人磁盘。在 Envoy 中,所有打开的文件(主要是日志文件)都分别对应一个独立的文件刷新线程,用于周期性地把内存缓冲的数据写人磁盘文件中。而Worker 线程在写文件时,实际只是将数据写人内存缓冲区,最终由文件刷新线程落盘。如此可以避免 Worker线程被磁盘I/O所阻塞。

此外,为了尽可能地减少线程间因数据共享而引人的争用及锁操作,Envoy设计了一套非常巧妙的 Thread Local Store机制(简称 TLS),如果读者希望更进一步了解可以阅读 Envoy 社区提供的官方文档。这里不再深人介绍更多关于 Envoy线程模型的技术细节。

四、Envoy扩展功能

在对Envoy的整体框架及其事件模型有了一个初步的了解之后,本小节将再次着重介绍Envoy强大功飪的源泉:筛选器。正如前文所述,筛选器本质上就是插件,因此通过扩展开发筛选器,可以在不侵人Envoy 主干源码的前提下,实现对 Envoy 功能的扩展增强。而且L3/L4 筛选器架构大大拓宽了 Envoy 中 “扩展” 二字的可能性。在 Envoy 中大量的核心功能都是以可插拔的扩展构筑在其L3/14筛选器架构之上的。不过本小节并不打算过多地介绍 Envoy 中筛选器开发或实现的具体细节,而是从原理和结构层面解析不同层次筛选器的工作机制,使读者对Envoy筛选器及其扩展功能有一个粗略但完整的认知。Envoy 的扩展功能如图所示。

9441c429ae694469b9b285014aa7c414.png

当换作系统接收到来自下游的连接时,会随机选择一个Worker 线程来处理该有件。每个监听器缩选器(Listener Filter) 都用于处理该连接的状态。监听器筛选器会在一个新连接截操作系统接收之后且 Envoy 仍来完全创建对应的连接对系之前发挥作用。此比时,Listener 可以直接操作原始的套接字(Sooket),也可以中断插件链执行。直到所有的监听器筛选器执行完成,一个可操作的 Envoy 连接对象才会被建立,Envoy 开始按收来自下游的请求或数据。当该连接具体的消求或教据到来之时,每个 L4 (Network)筛选辉开始工作。监听累筛选器很少被用到,对绝大部分的开发人员来说,即使是需要深度定制开发Eavey,也极少会需要开发监听器缔选器。

L4 筛选器分为 Read 和 Write 两种不同类型,分别用于读取外部数据利向外部发送数据,它们可以直接操作连接上的二进制字节流。在大部分的实现当中,L4筛选器负责将连接中的二进制字节游解析为具有的协议语义的数据(奶HTTP Headers,Body等)并交由L7筛选器做进一步处理。Envoy使用全个 L4 筛选器分别解析不同协议来实现全协议代理功能。目前社区已经据供了与 HTTP、Dubbo、Mongo、Kafka、Thrift 等协议对应的全种 L4 筛选器,而且通过扩展L4筛选器,可以轻极她在不受人Envoy 主干的前提下,扩展支持新的协议。另外必须说明的是,协议解析并不是L4 筛选器的必备功能,同样存在一些非协议解析类型的L4筛选器,如工作在L4的限流、鉴权等筛选器。实际上,在L4 筛选器和L7 筛选器之间,应这有一个专门的编解码器。不过在常见的变现当中,给解码器都集成成到对应协议的L4 筛选器中,所以在本节提供的筛选器链路图中干脆也略去了对应的层次。在一般情况下,只有在需要扩展 Envoy 以支持视外的协议时,才需要扩展开发L4筛选器。

L7筛选器一般是对应协议的L4筛选器的子筛选器,如 HTTP筛选器就是L4筛选器“HTTP连接管理器”的子筛选器。L4 筛选器在完成二进制数据的解析之后,会依次调用各个L7筛选器来处理解析后的具有协议语义的结构化数据,用于实现各种流量治理功能,包括但不限于限流、熔断、IP黑/白名单、认证鉴权、绥存、降级等。实际上,路由组件也往往被实现为一个特的L7筛选器。当然,推个互联网是搭建在 HTTP上的,所以在 Envoy 中处处可见对HTTP的特化。在Envoy 中,L7筛选器几乎可以等同于 HTTP筛选器,因为如 Kafka、Redis 等其他协议的L4筛选器目前还没有提供良好的L7支持。L7筛选器是大部分开发人员最常用的,也是最需要关注的类型。通过扩展L7筛选器,可以扩展支持各种特定的流量控制功能,而且社区本身也提供了大量可靠、高性能的L7筛选器供用户直接使用。

在所有的L7筛选器都执行完成之后,路由组件将被调用,将请求通过连接池发送给后端服务,并异步等待后端响应。在收到后端服务响应之后,Envoy会倒序执行上述插件链,最终将响应传递给客户端。至此,一个完整的请求转发和响应流程便完成了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/621653.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

EI级 | Matlab实现VMD-TCN-BiLSTM变分模态分解结合时间卷积双向长短期记忆神经网络多变量光伏功率时间序列预测

EI级 | Matlab实现VMD-TCN-BiLSTM变分模态分解结合时间卷积双向长短期记忆神经网络多变量光伏功率时间序列预测 目录 EI级 | Matlab实现VMD-TCN-BiLSTM变分模态分解结合时间卷积双向长短期记忆神经网络多变量光伏功率时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基…

Vue3-46-Pinia-获取全局状态变量的方式

使用说明 在 Pinia 中,获取状态变量的方式非常的简单 : 就和使用对象一样。 使用思路 : 1、导入Store;2、声明Store对象;3、使用对象。 在逻辑代码中使用 但是 Option Store 和 Setup Store 两种方式定义的全局状态变量…

全新小白菜QQ云端机器人登录系统源码 /去除解密授权学习版源码

源码介绍: 全新小白菜QQ云端机器人登录系统源码,是一款经过全面解密的授权学习版源码。 这款源码已解除了授权版的限制,然而许多人可能对其用途并不了解。实际上,该源码主要面向群机器人爱好者设计。它是一个基于挂机宝机器人框…

RT-DETR算法优化改进:多层次特征融合(SDI)结合PConv、DualConv、GSConv,实现二次创新 | UNet v2最新论文

💡💡💡本文独家改进:多层次特征融合(SDI)高效结合DualConv、PConv、GSConv等实现二次创新 1)替代原始的Concat; RT-DETR魔术师专栏介绍: https://blog.csdn.net/m0_63774211/category_12497375.html ✨✨✨魔改创新RT-DETR 🚀🚀🚀引入前沿顶会创新(CVPR…

Java期末复习题库(封装,继承,抽象类,接口,GUI)

包与字符串 1.创建包的基本操作 在biology包中的animal包中有human类,它具有name,height,weight的属性,还具有eat(),sleep()和work()的行为,在biology包中的plant包中有flower类,它具有name,color,smell的属性,还具有drink()和blossom()的行为. 现在在一个school包中的garde…

优雅处理并发:Java CompletableFuture最佳实践

第1章:引言 大家好,我是小黑,今天,小黑要和大家聊聊CompletableFuture,这个Java 8引入的强大工具。 在Java传统的Future模式里,咱们都知道,一旦开始了一个异步操作,就只能等它结束…

26.9K Star,漫画阅读 APP 开源了

今天推荐是一款适用于 Android 6.0 及更高版本的免费开源漫画阅读器,基于 Kotlin 开发的。这款 APP 完全免费、好用、无广告,自带上千个全球漫画源,在线阅读和下载都很方便,是漫画爱好者必备! 它以插件的形式提供了来自…

【我想开发一个小程序,大概需要多少钱?】

小程序开发为什么报价差距很大?主要是因为小程序的实现方法和功能模型不同。 小程序的实现方法: 实现方法主要分为SAAS小程序、定制小程序和第三方平台小程序。不同的实现方法价格都是不一样的,大概的区间如下: SAAS小程序和第三…

Zapier/Make.com/数环通/集简云的对比

Zapier/Make.com/数环通/集简云 这四家公司都是为了自动化,这也是流行大趋势。我不想错过未来的大趋势,花了2周时间分别用四家公司的模块实现了相同的任务。 为什么会用2周时间?我第一次接触无代码自动化。最重要的目的是为了白嫖&#xff0…

office办公技能|word中的常见通配符使用

一、删除Word中含有指定内容的整行 操作方法: 1、快捷键 CtrlH,打开Word的查找替换窗口,单击【更多】按钮,勾选“使用通配符”。 2、在查找内容处,输入“替换内容*^13”,替换为处什么都不填。 3、单击【…

Harbor离线安装

下载安装包 $ wget https://github.com/goharbor/harbor/releases/download/v2.7.4/harbor-offline-installer-v2.7.4.tgz解压 $ tar xvf harbor-offline-installer-v2.7.4.tgz -C /usr/local修改配置 $ cd /usr/local/harbor $ cp harbor.yml.tmpl harbor.yml $ vim harbo…

【文献解读】“MOBILEViT:轻量级、通用目的、移动友好的视觉变换器”。

今天阅读这篇2022年ICLR会议上发表的论文,主要是为了学习MobileViT模型,用于YOLO模型主干改造。 一、文献概述 作者:Sachin Mehta 和 Mohammad Rastegari。地点:作者所属机构是 Apple。内容简述: 提出了一种名为Mob…

手把手Docker部署Gitblit服务器

1拉取镜像 docker pull jacekkow/gitblit:v1.9.1 2.启动 docker run -d --name gitblit --restart always -p 10006:8080 -p 18443:8443 -p 19418:9418 -p 29418:29418 -v /data/gitblit/data:/opt/gitblit-data jacekkow/gitblit:v1.9.1 3.查看 默认账户/密码:admin/adm…

安卓手机变iOS!

Launcher iOS 16 - 安卓手机秒变iOS Launcher iOS 16 是一款iOS启动器,可以将安卓手机桌面变成iOS样子,还有iOS的开机动画和景深效果! 下载链接:【Launcher iOS 16】 ​

腾讯云优惠券介绍、种类、领取入口及使用教程

腾讯云作为国内领先的云服务提供商,为广大的企业和开发者提供了优质的云计算、大数据、人工智能等服务。为了更好地吸引用户,腾讯云推出了多种优惠活动,其中就包括腾讯云优惠券。本文将详细介绍腾讯云的优惠券种类、领取入口以及使用教程。 一…

第 4 章 链表

文章目录 4.1 链表(Linked List)介绍4.2 单链表的应用实例4.3 单链表面试题(新浪、百度、腾讯)4.4 双向链表应用实例4.4.1 双向链表的操作分析和实现4.4.2 课堂作业和思路提示 4.5 单向环形链表应用场景4.6 单向环形链表介绍4.7 Josephu 问题4.8 Josephu 问题的代码实现 4.1 链…

习题5-1 代码对齐(Alignment of Code, ACM/ICPC NEERC 2010, UVa1593)

输入若干行代码,要求各列单词的左边界对齐且尽量靠左。单词之间至少要空一格。每个单词不超过80个字符,每行不超过180个字符,一共最多1000行,样例输入与输出如图所示。 //代码对齐 //思路:统计每列最长的单词 不够长…

LeetCode 0083.删除排序链表中的重复元素:模拟

【LetMeFly】83.删除排序链表中的重复元素:模拟 力扣题目链接:https://leetcode.cn/problems/remove-duplicates-from-sorted-list/ 给定一个已排序的链表的头 head , 删除所有重复的元素,使每个元素只出现一次 。返回 已排序的…

docker-compose部署kafka、SASL模式(密码校验模式)

一.基础kafka部署 zookeeper,kafka,kafka-ui docker-compose.yml 注意点:192.168.1.20 是宿主机的ip version: "3" services:zookeeper:image: wurstmeister/zookeepercontainer_name: zookeeperrestart: alwaysports:- 2181:2…

Java判断字符串当中是否有中文符号(不是中文名称,是符号)

public static void main(String[] args) throws ParseException, IOException, URISyntaxException {// 测试示例String testString1 "Hello,test!";String testString2 "This is a test.";boolean result1 containsChineseSymbols(testStr…