Envoy 架构、术语与基本配置解析
Envoy官网:https://www.envoyproxy.io/
正如微服务背景从业者很快意识到的那样,转移到分布式体系结构时出现的大多数操作问题最终都基于两个方面:网络和可观察性。与单个整体应用程序相比,网络连接和调试一组交错的分布式服务仅是一个大数量级的问题。
Envoy最初是在Lyft上构建的,是一种高性能C ++分布式代理,专为单个服务和应用程序而设计,以及为大型微服务“服务网格”架构设计的通信总线和“通用数据平面”。基于对NGINX,HAProxy,硬件负载平衡器和云负载平衡器等解决方案的学习,Envoy与每个应用程序一起运行,并通过与平台无关的方式提供通用功能来抽象化网络。当基础架构中的所有服务流量都通过Envoy网格流动时,通过一致的可观察性,调整整体性能以及在单个位置添加基板功能,即可轻松可视化问题区域。
Envoy 本身可以做反向代理和负载均衡,它也是 Istio 数据平面中默认使用的 sidecar。在了解一门技术之前一开始就要了解其中的基本概念和术语,只有融入了该语境才能理解这门技术。本文将为大家介绍 Envoy 中的基本术语和重点概念。
架构
下图是 Envoy proxy 的架构图,显示了 host B 经过 Envoy 访问 host A 的过程。每个 host 上都可能运行多个 service,Envoy 中也可能有多个 Listener,每个 Listener 中可能会有多个 filter 组成了 chain。
Envoy Proxy架构图
其中的基本术语将在下面解释。
基本术语
Host:能够进行网络通信的实体(在手机或服务器等上的应用程序)。在 Envoy 中主机是指逻辑网络应用程序。只要每台主机都可以独立寻址,一块物理硬件上就运行多个主机。
Downstream:下游(downstream)主机连接到 Envoy,发送请求并或获得响应。
Upstream:上游(upstream)主机获取来自 Envoy 的链接请求和响应。
Cluster: 集群(cluster)是 Envoy 连接到的一组逻辑上相似的上游主机。Envoy 通过服务发现发现集群中的成员。Envoy 可以通过主动运行状况检查来确定集群成员的健康状况。Envoy 如何将请求路由到集群成员由负载均衡策略确定。
Mesh:一组互相协调以提供一致网络拓扑的主机。Envoy mesh 是指一组 Envoy 代理,它们构成了由多种不同服务和应用程序平台组成的分布式系统的消息传递基础。
运行时配置:与 Envoy 一起部署的带外实时配置系统。可以在无需重启 Envoy 或 更改 Envoy 主配置的情况下,通过更改设置来影响操作。
Listener: 侦听器(listener)是可以由下游客户端连接的命名网络位置(例如,端口、unix域套接字等)。Envoy 公开一个或多个下游主机连接的侦听器。一般是每台主机运行一个 Envoy,使用单进程运行,但是每个进程中可以启动任意数量的 Listener(监听器),目前只监听 TCP,每个监听器都独立配置一定数量的(L3/L4)网络过滤器。Listenter 也可以通过 Listener Discovery Service(LDS)动态获取。
Listener filter:Listener 使用 listener filter(监听器过滤器)来操作链接的元数据。它的作用是在不更改 Envoy 的核心功能的情况下添加更多的集成功能。Listener filter 的 API 相对简单,因为这些过滤器最终是在新接受的套接字上运行。在链中可以互相衔接以支持更复杂的场景,例如调用速率限制。Envoy 已经包含了多个监听器过滤器。
Http Route Table:HTTP 的路由规则,例如请求的域名,Path 符合什么规则,转发给哪个 Cluster。
Health checking:健康检查会与SDS服务发现配合使用。但是,即使使用其他服务发现方式,也有相应需要进行主动健康检查的情况。详见 health checking。
xDS
xDS 是一个关键概念,它是一类发现服务的统称,其包括如下几类:
- CDS:Cluster Discovery Service
- EDS:Endpoint Discovery Service
- SDS:Service Discovery Service
- RDS:Route Discovery Service
- LDS:Listener Discovery Service
正是通过对 xDS 的请求来动态更新 Envoy 配置。
Envoy Mesh
Envoy Mesh 指的是由 envoy 做负载均衡和代理的 mesh。该 Mesh 中会包含两类 envoy:
- Edge envoy:即流量进出 mesh 时候的 envoy,相当于 kubernetes 中的 ingress。
- Service envoy:服务 envoy 是跟每个 serivce 实例一起运行的,应用程序无感知的进程外工具,在 kubernetes 中会与应用容器以 sidecar 形式运行在同一个 pod 中。
Envoy 即可以单独作为 edge envoy,也可以仅做 service envoy 使用,也可以两者同时使用。Mesh 中的所有 envoy 会共享路由信息。
Envoy 配置
Envoy 中的配置包括两大类:listenner 配置和 cluster 配置。
Listener 配置
我们知道 Envoy 中可以配置一组 listener 以实现复杂的处理逻辑。Listener 中设置监听的 TCP 端口,还有一组 filter 对这些端口上的数据流进行处理。如下所示,该示例来自使用Envoy 作为前端代理。
listeners:- address:socket_address:address: 0.0.0.0port_value: 80filter_chains:- filters:- name: envoy.http_connection_managerconfig:codec_type: autostat_prefix: ingress_httproute_config:name: local_routevirtual_hosts:- name: backenddomains:- "*"routes:- match:prefix: "/service/1"route:cluster: service1- match:prefix: "/service/2"route:cluster: service2
这是一个 http_connection_manager
例子,其中必须包含 virtual_hosts
配置,而 virtual_hosts
配置中必须包含以下几项配置:
name
:服务名称domains
:DNS 域名,必须能跟virtual_host
的 URL 匹配routes
:路由列表
每个路由中还可以包含以下配置:
prefix
:URL 路径前缀cluster
:处理该请求的 envoy clustertimeout_ms
:当出错时的超时时间
如上面的例子中,我们还需要定义 service1
cluster 和 service2
cluster。
Cluster 配置
Cluster 是一组逻辑相似的主机配置,定义哪些主机属于一个服务,cluster 的配置中包含了服务发现和负载均衡方式配置。依然是参考使用Envoy 作为前端代理中的配置:
clusters:- name: service1connect_timeout: 0.25stype: strict_dnslb_policy: round_robinhttp2_protocol_options: {}hosts:- socket_address:address: service1port_value: 80- name: service2connect_timeout: 0.25stype: strict_dnslb_policy: round_robinhttp2_protocol_options: {}hosts:- socket_address:address: service2port_value: 80
Cluster 的配置中至少包含以下信息:
name
:cluster 名称,就是服务名称type
:该 cluster 怎么知道主机是否启动?即服务发现类型,有以下方式:static
:监听 cluster 中的所有主机strict_dns
:envoy 会监听 DNS,每个匹配的 A 记录都会认定为有效logical_dns
:envoy 将使用 DNS 来增加主机,如果 DNS 不再返回该主机也不会删除这些主机信息sds
:即 Serivce Discovery Serivce,envoy 访问外部的 REST 获取 cluster 成员信息
lb_type
:cluster 的负载均衡类型,有以下方式:round_robin
:轮询主机weighted_least_request
:最近获得最少请求的主机random
:随机
hosts
:能够定义 cluster 中主机的 URL 地址,通常是tcp://
URL
参考
- Terminology - www.envoyproxy.io
- Part 1: Getting started with Envoy Proxy for microservices resilience
- Envoy作为前端代理
本文转载自 Envoy 的架构与基本术语 - jimmysong.io。
Envoy 架构、术语与基本配置解析相关推荐
- 【Mybatis 之应用篇】2_配置解析、属性名问题、日志、分页和注解开发
文章目录 Mabatis 四.配置解析 1.核心配置文件 2.environments(环境配置)☆ 3.properties(属性)☆ 4.typeAliases(类型别名)☆ 5.settings ...
- Java生鲜电商平台-秒杀系统微服务架构设计与源码解析实战
Java生鲜电商平台-秒杀系统微服务架构设计与源码解析实战 Java生鲜电商平台- 什么是秒杀 通俗一点讲就是网络商家为促销等目的组织的网上限时抢购活动 比如说京东秒杀,就是一种定时定量秒杀,在规定 ...
- Dubbo 框架设计与源码解读(配置解析优先级、线程分配、负载均衡、容错方案)
整体框架设计 图例说明: 图中左边淡蓝背景的为服务消费⽅使⽤的接⼝,右边淡绿⾊背景的为服务提供⽅使⽤的接⼝,位于中轴线上的为双⽅都⽤到的接⼝. 图中从下⾄上分为⼗层,各层均为单向依赖,右边的⿊⾊箭头代 ...
- 运维之DNS服务器Bind9配置解析和基础示例及附带命令
0x03 Bind 配置解析 实例1.DNS主从区域传输介绍与配置 实例2.DNS区域传输限制 实例3.DNS部分二级域名解析 示例1.采用Bind建立一个A记录DNS服务器 示例2.采用Bind建立 ...
- Java-Mybatis(二): Mybatis配置解析、resultMap结果集映射、日志、分页、注解开发、Mybatis执行流程分析
Java-Mybatis-02 学习视频:B站 狂神说Java – https://www.bilibili.com/video/BV1NE411Q7Nx 学习资料:mybatis 参考文档 – ht ...
- EtherCAT总线通信架构模型以及CoE参考模型解析
EtherCAT总线通信架构模型以及CoE参考模型解析 1.主从站系统构成模型 EtherCAT 总线通信支持几乎所有的通讯布线拓扑类型,包括线型(菊花链).树型.星型等,一般使用菊花链形串联比较简单 ...
- Dubbo架构设计与源码解析(一) 架构设计
作者:黄金 一.架构演变 单应用架构 ----> 垂直架构 ----> 分布式架构 ----> 微服务架构 ----> 云原生架构 二.Dubbo总体架构 1.角色职能 • C ...
- Java生鲜电商平台-商品中心的架构设计与源码解析(小程序/APP)
Java生鲜电商平台-商品中心的架构设计与源码解析(小程序/APP) 说明:Java生鲜电商平台中,由于商品的架构很大程度决定了电商的扩展性与伸缩性.对此根据自己多年的生鲜电商经验,整理了以下的商品中 ...
- python3.6爬虫环境安装要多少内存_Python3爬虫环境配置——解析库安装(附tesserocr安装方法)...
Python3爬虫环境配置--解析库安装(附tesserocr安装方法) 抓取网页代码后,第二步就是提取信息,为了方便程序设计,这里不采用繁琐的正则提取,利用社区里强大的Python解析库,如lxml ...
- Flume(NG)架构设计要点及配置实践
Flume(NG)架构设计要点及配置实践 http://shiyanjun.cn/archives/915.html 转载于:https://blog.51cto.com/vikenxu/165732 ...
最新文章
- 做好自己,一切都是最好的安排
- 【渝粤题库】陕西师范大学201691 日语(二) 作业
- npm解决node-sass安装失败
- FPGA之VGA控制
- 马云:首批助力欧洲防疫的物资今天到达比利时
- python no module named pandas_【原创】大叔经验分享(11)python引入模块报错ImportError: No module named pandas numpy...
- 如何在html嵌入html网页
- 微服务体系三维可缩放模型
- 拓端tecdat|R语言用主成分PCA、 逻辑回归、决策树、随机森林分析心脏病数据并高维可视化
- java saxreader 生成xml_SAXReader解析xml文件demo
- ZStack-2.6.2-c74 搭建私有云
- 高中数学向量巨难题型四心问题解题技巧
- 失眠可以用什么东西改善一个失眠多年的朋友给我推荐
- 第二章:Djgo后台管理
- int转换成char
- 浙大MBA考研经验分享:名校梦不可负~
- 范德堡大学计算机,范德堡大学计算机专业博士成功申请案例
- 世卫和盖茨基金会被黑?疑2.5万电邮账号密码被公开
- 【BYM】Android模块化实践复盘
- Linux战地日记—date命令详细示例
热门文章
- Scrapped or attached views may not be recycled. isScrap:false isAttached:true android.support.v7.wid
- php获取手机本地,PHP通过API获取手机号码归属地
- idear右边的依赖视图没了_APP开发中出现提到的Idear是什么意思
- linux中彻底分析#!bin/sh是什么意思
- QT连接MySQL数据库问题
- 如何从Mixamo下载人物模型的动画
- 华为手机 计算机 怎么传文件,华为手机如何与电脑互传文件?华为手机不用数据线和电脑互传文件...
- Preact 在TSX中优雅使用className
- 零基础学平面设计要从哪入手
- 一周学习荟萃(TED,知识,教育,笑话,鸡汤)