架构
2 分钟阅读
简要概述
Envoy 是为面向服务架构(SOA)设计的 L7 层代理,主要围绕解决以下核心思想:
网络应对应用程序透明,当网络和应用程序发生问题时,应该很容易确定问题的根源。
功能特点
实现上述的目标非常困难,在设计上试图通过提供以下高级功能来实现这一目标:
- 独立进程架构
相比传统的 sdk 方式,部署升级更加简单方便;
- L3/L4 过滤器架构
可插拔的过滤器链机制,可方便为 TCP/UDP 代理编译各自自定义任务;
- HTTP L7 过滤器架构
方便为 HTTP 协议添加执行不同的任务,如缓冲、速率限制、路由/转发;
- 优先支持 HTTP/2
推荐服务使用 h2 以创建持久连接的网格,使得请求和响应可以通过多路复用;
- HTTP/3 支持
支持上行和下行的HTTP/3,并能够在任何方向上进行HTTP/1.1、HTTP/2和HTTP/3的相互转换;
- HTTP L7 路由
支持一个路由子系统,能够根据路径、权限、内容类型、运行时值等路由和重定向请求;
- gRPC 支持
支持为 gRPC 请求和响应的路由和负载均衡;
- 服务发现和动态配置
支持 API 以及可动态更新集群本身能力;
- 健康检查
内置健康检查子系统,可以选择对上游服务集群执行主动的健康检查;
- 高级负载均衡
原生提供诸如自动重试、断路器、限速、异常检查等功能,并使其对任何应用程序都可使用;
- 前/边缘代理支持
原先提供了可观察性、管理、服务发现和负载均衡等非常易于在边缘端使用;
- 丰富的可观测性
为所有子系统提供了统计支持,对外暴露性能数据。
关键术语
术语 | 名称 | 说明 |
---|---|---|
Host | 主机 | 逻辑网络应用程序 |
Downstream | 下游 | 下游客户端主机连接到 Envoy,发送请求并接收响应 |
Upstream | 上游 | 上游服务端主机接收来自 Envoy 的连接和请求,并返回响应 |
Listener | 监听器 | 提供给下游客户端连接的网络地址 |
Cluster | 集群 | Envoy 连接到逻辑上相同的一组上游主机 |
Mesh | 网格 | 一组 Envoy 代理,它们之间互相协调网络拓扑 |
Runtime configuration | 运行时配置 | 可以更改配置设置来影响运行,而无需重启 Envoy 或更改主要配置 |
xDS
Envoy xDS APIs(xDS 协议)使用 proto3 编写定义在官方代码仓库 api 中,它们支持:
- 通过 gRPC 进行 xDS API 更新
- 自动通过 proto3 映射为 reset api
- 支持本地配置文件、REST 接口 或 gRPC 端点传递更新
- 通过扩展的端点分配 API 进行高级负载均衡
- TODO; 在需要时提供更强的一致性和排序特性
启动配置
示例配置
在使用 xDS API,需提供引导配置文件以启动服务,支持两种配置:
- 静态配置(static_resources),启动前人工已编写好;
- 动态配置(dynamic_resources),通过 xDS 服务端自发现;
以下是静态配置的示例:
cat >> demo.yaml << EOF
static_resources:
listeners:
- name: listener_0
address:
# envoy 服务监听的地址
socket_address:
address: 0.0.0.0
port_value: 80
filter_chains:
- filters:
- name: envoy.filters.network.http_connection_manager
typed_config:
"@type": type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager
http_filters:
- name: envoy.filters.http.router
typed_config:
"@type": type.googleapis.com/envoy.extensions.filters.http.router.v3.Router
stat_prefix: ingress_http
route_config:
virtual_hosts:
- name: local_service
# 匹配所有入口域名
domains: ["*"]
routes:
- match:
# 匹配所有以 '/' 开头的路由
prefix: "/"
route:
# 名称必须在 "clusters[_].name" 中存在
cluster: oneops-syncds-v1
# 对匹配到以 '/' 开头的路由,转发到后端 "oneops-syncds-v1" 时替换为 "/ds/" 前缀路径
prefix_rewrite: "/ds/"
clusters:
- name: oneops-syncds-v1
type: LOGICAL_DNS
dns_lookup_family: V4_ONLY
load_assignment:
cluster_name: oneops-syncds-v1
endpoints:
- lb_endpoints:
- endpoint:
address:
# 转发到后端真实服务器地址
socket_address:
address: 192.168.0.1
port_value: 8080
EOF
启动服务,以在 “80” 端口监听,并对所有转入请求转发至后端 “192.168.0.1:8080” 服务,设置 url 前缀为 “/ds/":
./envoy -c demo.yaml
静态配置
static_resources:
listeners:
...
clusters:
...
最后修改 2024.01.31: docs: 完成上游集群初版 (822daa1)