Envoy 是一个开源的边缘服务代理,也是 Istio Service Mesh 默认的数据平面,专为云原生应用程序设计。

与HAProxy以及Nginx等传统Proxy依赖静态配置文件来定义各种资源以及数据转发规则不同,Envoy几乎所有配置都可以通过订阅来动态获取。对应的发现服务以及各种各样的API统称为xDS。Envoy与xDS之间通过Proto约定请求和响应的数据模型,不同类型资源,对应的数据模型也不同。

1 Envoy整体架构

Envoy 的架构如图所示:

Envoy 中也可能有多个 Listener,每个 Listener 中可能会有多个 filter 组成了 chain。

Envoy 接收到请求后,会先走 FilterChain,通过各种 L3/L4/L7 Filter 对请求进行微处理,然后再路由到指定的集群,并通过负载均衡获取一个目标地址,最后再转发出去。

在Envoy中,具有最为核心的四种资源:Listener,Router,Cluster,以及Filter。

1.1 Listener:Envoy工作的基础

简单理解,Listener是Envoy打开的一个监听端口,用于接收来自Downstream(客户端)连接。Envoy可以支持复数个Listener。多个Listener之间几乎所有的配置都是隔离的。Listener配置中核心包括监听地址、Filter链等。

Listener对应的配置/资源发现服务称之为LDS。LDS是Envoy正常工作的基础,没有LDS,Envoy就不能实现端口监听(如果启动配置也没有提供静态Listener的话),其他所有xDS服务也失去了作用。

1.2 Cluster:对上游服务的抽象

在Envoy中,每个Upstream上游服务都被抽象成一个Cluster。Cluster包含该服务的连接池、超时时间、endpoints地址、端口、类型(类型决定了Envoy获取该Cluster具体可以访问的endpoint方法)等等。

Cluster对应的配置/资源发现服务称之为CDS。一般情况下,CDS服务会将其发现的所有可访问服务全量推送给Envoy。与CDS紧密相关的另一种服务称之为EDS。CDS服务负责Cluster资源的推送。而当该Cluster类型为EDS时,说明该Cluster的所有endpoints需要由xDS服务下发,而不使用DNS等去解析。下发endpoints的服务就称之为EDS。

1.3 Router:上下游之间的桥梁

Listener可以接收来自下游的连接,Cluster可以将流量发送给具体的上游服务,而Router则决定Listener在接收到下游连接和数据之后,应该将数据交给哪一个Cluster处理。它定义了数据分发的规则。虽然说到Router大部分时候都可以默认理解为HTTP路由,但是Envoy支持多种协议,如Dubbo、Redis等,所以此处Router泛指所有用于桥接Listener和后端服务(不限定HTTP)的规则与资源集合。

Route对应的配置/资源发现服务称之为RDS。Router中最核心配置包含匹配规则和目标Cluster,此外,也可能包含重试、分流、限流等等。

1.4 Filter:强大源于可扩展

Filter,通俗的讲,就是插件。通过Filter机制,Envoy提供了极为强大的可扩展能力。

利用Filter机制,Envoy理论上可以实现任意协议的支持以及协议之间的转换,可以对请求流量进行全方位的修改和定制。强大的Filter机制带来的不仅仅是强大的可扩展性,同时还有优秀的可维护性。Filter机制让Envoy的使用者可以在不侵入社区源码的基础上对Envoy做各个方面的增强。

  • 网络过滤器(Network Filters): 工作在 L3/L4,是 Envoy 网络连接处理的核心,处理的是原始字节,分为 Read、Write 和 Read/Write 三类。
  • HTTP 过滤器(HTTP Filters): 工作在 L7,由特殊的网络过滤器 HTTP connection manager 管理,专门处理 HTTP1/HTTP2/gRPC 请求。它将原始字节转换成 HTTP 格式,从而可以对 HTTP 协议进行精确控制。

2 配置

Envoy流程中每一个环节可以静态配置,也可以动态服务发现。

2.1 静态配置

下面的配置将所有流量代理到 baidu.com,配置完成后我们应该能够通过请求 Envoy 的端点就可以直接看到百度的主页了,而无需更改 URL 地址。

static_resources:# 1. 监听器listeners:- name: listener_0address:socket_address: { address: 0.0.0.0, port_value: 10000 }# 2. 过滤器filter_chains:- filters:- name: envoy.http_connection_managerconfig:stat_prefix: ingress_httproute_config:name: local_routevirtual_hosts:- name: local_servicedomains: ["*"]routes:- match: { prefix: "/" }route: { host_rewrite: www.baidu.com, cluster: service_baidu }http_filters:- name: envoy.router# 3. 集群clusters:- name: service_baiduconnect_timeout: 0.25stype: LOGICAL_DNSdns_lookup_family: V4_ONLYlb_policy: ROUND_ROBINhosts: [{ socket_address: { address: www.baidu.com, port_value: 443 }}]tls_context: { sni: baidu.com }# 4. 管理
admin:access_log_path: /tmp/admin_access.logaddress:socket_address: { address: 0.0.0.0, port_value: 9901 }

2.2 动态配置xDS协议(动态服务发现)

Envoy 通过查询文件或管理服务器来动态发现资源。这些发现服务及其相应的 API 被统称为 xDS。

Envoy 通过订阅(subscription)方式来获取资源,如监控指定路径下的文件、启动 gRPC 流(streaming)或轮询 REST-JSON URL。后两种方式会发送 DiscoveryRequest 请求消息,发现的对应资源则包含在响应消息 DiscoveryResponse 中。

xDS 协议是 “X Discovery Service” 的简写,这里的 “X” 表示它不是指具体的某个协议,是一组基于不同数据源的服务发现协议的总称:

  • CDS:Cluster Discovery Service
  • EDS:Endpoint Discovery Service
  • SDS:Secret Discovery Service
  • RDS:Route Discovery Service
  • LDS:Listener Discovery Service

xDS 协议是由 Envoy 提出的,目前已成为服务网格的协议标准之一。

Envoy是 Istio 中默认的 sidecar 代理,但只要实现了 xDS 协议,理论上也可以作为 Istio 中的 sidecar 代理 —— 比如蚂蚁集团开源的 MOSN。

比如每个 Envoy 流以发送一个 DiscoveryRequest 开始,包括了列表订阅的资源、订阅资源对应的类型 URL、节点标识符和空的 version_info。EDS 请求示例如下:

version_info:
node: { id: envoy }
resource_names:
- foo
- bar
type_url: type.googleapis.com/envoy.api.v2.ClusterLoadAssignment
response_nonce

管理服务器可立刻或等待资源就绪时发送 DiscoveryResponse 作为响应,示例如下:

version_info: X
resources:
- foo ClusterLoadAssignment proto encoding
- bar ClusterLoadAssignment proto encoding
type_url: type.googleapis.com/envoy.api.v2.ClusterLoadAssignment
nonce: A

参考

Envoy 入门教程
https://www.envoyproxy.io/docs/envoy/v1.18.3/

Envoy架构理解--理解xDS/Listener/Cluster/Router/Filter相关推荐

  1. BlockChain:《Blockchain Gate》听课笔记——区块链的1.0架构 VS 区块链3.0架构+个人理解

    BlockChain:<Blockchain Gate>听课笔记--区块链的1.0架构 VS  区块链3.0架构+个人理解 相关文章 BlockChain:<Blockchain G ...

  2. 云技术-SaaS架构初步理解

    最近公司准备整一个SaaS的东西.有幸参入这一块东西的搭建,借着這个机会也重新好好梳理了一下对SaaS的认识.今天整理一下! 一.云计算与SaaS 说起SaaS,就得先说说云计算了.关于云计算分为三层 ...

  3. 阿里道延:我对技术架构的理解与架构师角色的思考

    我叫道延, 2014 年加入阿里,在阿里通信工作了近两年.2016 年年底加入业务平台团队,当时 Leader 找我的第一件事就是要解决大促的问题,第二件事就是解决安全生产的问题. 我带着这个命题进入 ...

  4. 对微服务监控系统分层和监控架构的理解

    对微服务监控系统分层和监控架构的理解 目录 微服务专栏地址 目录 1. 简介 2. 为什么需要监控体系 3. 与单体应用有什么区别 4. 要监控什么 5. 监控体系和分层 6. 监控架构和主流技术栈 ...

  5. 新的一年,谈谈我对技术架构的理解

    作者 | 道延    责编 | 张文 来源 | 转载自阿里巴巴中间件(ID:Aliware_2018) 我叫道延, 2014 年加入阿里,在阿里通信工作了近两年.2016 年年底加入业务平台团队,当时 ...

  6. 我对架构的理解-概念篇

    这两天和一朋友讨论这样一个问题:你认为公司的架构怎样,有哪些缺点?           其实在回答这个问题之前,有一些概念需要搞清楚,那就是什么是架构?           目前对于架构还并未有一个统 ...

  7. 从WebService到面向服务架构SOA理解【二】

    概要: (1)通过上一篇项目的WebService搭建学习,能够有了对WebService一定的认识. (2)接下来记录自己通过对WebService的学习对面向服务架构的理解. WebService ...

  8. 关于linux UART驱动和tty架构的理解

    关于linux UART驱动和tty架构的理解 最近要开发一个驱动程序,需要用到串口和SPI接口.平台的串口驱动程序本身在开发板中已经被实现了,也可以就这样直接使用,但是这样分开使用的结果就是在串口和 ...

  9. MVC三层架构简单理解

    文章目录 MVC三层架构: 1.理解MVC: 2.以前的架构(只有两层): 3 MVC 三层架构: MVC三层架构: 1.理解MVC: Model view Controller 模型.视图.控制器 ...

最新文章

  1. 请求Get和Post对于utf-8字符的处理的考虑
  2. 101个脚本之linux回收站
  3. python:软件目录结构规范
  4. 【百度分享】基于内核模块的测试代码编写(二)
  5. Tomcat 的 Server 文件配置详解
  6. MD5和SHA1加密
  7. Crystal 语法概述[转]
  8. 深入理解C++中的explicit关键字
  9. JAVA进阶开发之(二维数组)
  10. Ubuntu 下无法Tab键自动补全功能解决办法
  11. 本田da屏怎么进wince系统_谁说思域要停产的?打脸来得不是一般的快 第十一代本田思域Prototype...
  12. python地图图表和3d_Python地图可视化三大秘密武器
  13. 起底 ARM:留给中国队的时间不多了
  14. plc程序ST语言接近C语言,【PLC高级编程语言之ST文本】4.ST语言的运算符介绍
  15. 记一次简单的burpsuite弱口令爆破实验
  16. dsolve函数的功能_MATLAB 求解常微分方程的函数是dsolve()。
  17. 106短信通道等6种常见短信通道介绍,你了解多少呢
  18. 运用R语言绘制小提琴图
  19. 使用O2OA二次开发搭建企业办公平台(十三)流程开发篇:报销审批流程表单开发
  20. 【C语言航路】第一站:初识C语言(三)

热门文章

  1. URL重写实现会话跟踪
  2. 小哈智能机器人的功能_小哈智能教育机器人H2产品外观参数说明
  3. Windows如何安装mysql
  4. 大数据实战项目必备技能三:storm
  5. linux设备模型十二(热拔插hotplug)
  6. jib构建镜像(使用阿里云容器镜像服务拉取镜像)
  7. 粒子群算法总结+背包问题
  8. 洛谷P1510-精卫填海(01背包)
  9. unity摄影机depth模式_Unity3d摄像机详解
  10. 游戏角色是怎么动起来的?3D游戏动画系统介绍