Envoy详解:高性能C++代理服务器的安装与配置指南
概述
Envoy是Lyft公司开源的高性能C++编写的代理服务器,广泛应用于云原生架构中。作为一个现代化的网络代理,Envoy可以替代传统的Nginx、HAProxy等工具,在微服务架构中扮演着重要的角色。本文将详细介绍Envoy的特性、安装配置以及使用方法。
Envoy简介
Envoy于2016年由Lyft公司开源,并于2017年加入CNCF(云原生计算基金会)。它是一个专为云原生应用设计的边缘和服务代理,具有以下核心特性:
- 高性能:基于C++开发,单进程架构,避免了多进程/多线程的上下文切换开销
- 可观测性:内置丰富的统计指标,支持多种追踪后端
- 动态配置:通过xDS API实现动态配置更新,无需重启
- 支持多种协议:HTTP/1.1、HTTP/2、gRPC、TCP、TLS等
- 灵活的过滤链:通过过滤器架构实现功能扩展
Envoy应用场景
- API网关:作为微服务的统一入口
- Sidecar代理:在服务网格中作为Sidecar部署
- 边缘代理:处理南北向流量
- 负载均衡器:实现高级负载均衡策略
- 透明代理:实现流量拦截和转发
环境准备
系统要求
- 操作系统:Linux(Ubuntu/CentOS/Debian)、macOS、Windows
- 内存:至少512MB
- CPU:x86_64或ARM64架构
- 磁盘:至少100MB空间
安装Envoy
方式一:使用APT安装(Ubuntu/Debian)
# 添加GPG密钥
sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl gnupg lsb-release
# 添加Envoy仓库
curl -fsSL https://getenvoy.io/gpg | sudo gpg --dearmor -o /usr/share/keyrings/envoy-archive-keyring.gpg
# 添加仓库
echo "deb [signed-by=/usr/share/keyrings/envoy-archive-keyring.gpg] https://apt.envoyproxy.io $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/envoy.list
# 安装Envoy
sudo apt-get update
sudo apt-get install envoy
方式二:使用YUM安装(CentOS/RHEL)
# 添加仓库
sudo tee /etc/yum.repos.d/envoy.repo << 'EOF'
[envoy]
name=Envoy Repository
baseurl=https://yum.envoyproxy.io/main/centos/7/x86_64
enabled=1
gpgcheck=0
EOF
# 安装Envoy
sudo yum install envoy
方式三:使用Docker运行
# 运行最新版本的Envoy
docker run --name envoy -d -p 9901:9901 -p 10000:10000 envoyproxy/envoy:latest
# 或者使用自定义配置文件
docker run --name envoy -d -v /path/to/envoy.yaml:/etc/envoy/envoy.yaml:ro -p 9901:9901 -p 10000:10000 envoyproxy/envoy:latest
方式四:手动下载二进制文件
# 下载最新版本的Envoy
curl -LO https://github.com/envoyproxy/envoy/releases/download/v1.35.0/envoy-v1.35.0-linux-x86_64.tar.gz
# 解压
tar xzf envoy-v1.35.0-linux-x86_64.tar.gz
# 移动到系统路径
sudo mv envoy /usr/local/bin/
# 验证安装
envoy --version
Envoy配置基础
配置文件结构
Envoy使用YAML格式的配置文件,主要包含以下几个部分:
static_resources:
listeners: # 监听器定义
- name: ...
address: ...
filter_chains: ...
clusters: # 集群定义(后端服务)
- name: ...
hosts: ...
dynamic_resources: # 动态资源配置
lds_config: ...
cds_config: ...
admin: # 管理界面配置
address: ...
一个完整的示例配置
admin:
address:
socket_address:
protocol: TCP
address: 0.0.0.0
port_value: 9901
static_resources:
listeners:
- name: http_listener
address:
socket_address:
protocol: TCP
address: 0.0.0.0
port_value: 10000
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
codec_type: AUTO
stat_prefix: http_connection_manager
http_filters:
- name: envoy.filters.http.router
typed_config:
"@type": type.googleapis.com/envoy.extensions.filters.http.router.v3.Router
route_config:
name: local_route
virtual_hosts:
- name: local_service
domains: ["*"]
routes:
- match:
prefix: "/"
route:
cluster: web_service
host_rewrite: localhost
prefix_rewrite: /
clusters:
- name: web_service
connect_timeout: 0.25s
type: LOGICAL_DNS
dns_lookup_family: V4_ONLY
lb_policy: ROUND_ROBIN
load_assignment:
cluster_name: web_service
endpoints:
- lb_endpoints:
- endpoint:
address:
socket_address:
address: 127.0.0.1
port_value: 8080
核心概念详解
Listener(监听器)
Listener是Envoy接收入站流量的入口点。每个Listener可以绑定到一个或多个网络地址(IP:端口),并配置相应的过滤器链。
# TCP监听器示例
- name: tcp_listener
address:
socket_address:
protocol: TCP
address: 0.0.0.0
port_value: 10001
filter_chains:
- filters:
- name: envoy.filters.network.tcp_proxy
typed_config:
"@type": type.googleapis.com/envoy.extensions.filters.network.tcp_proxy.v3.TcpProxy
stat_prefix: tcp_proxy
cluster: backend_cluster
Cluster(集群)
Cluster定义了一组可以路由到的主机(endpoints),Envoy会将流量负载均衡到集群中的所有主机。
# 简单集群配置
- name: my_cluster
type: STRICT_DNS
connect_timeout: 5s
lb_policy: ROUND_ROBIN
load_assignment:
cluster_name: my_cluster
endpoints:
- lb_endpoints:
- endpoint:
address:
socket_address:
address: backend.example.com
port_value: 80
Route(路由)
路由配置决定了HTTP请求如何被路由到不同的集群,支持基于路径、前缀、头部、查询参数等条件的路由。
route_config:
name: api_route
virtual_hosts:
- name: api_vhost
domains: ["api.example.com"]
routes:
# 基于路径前缀的路由
- match:
prefix: /v1/users
route:
cluster: users_service
prefix_rewrite: /
timeout: 10s
高级功能配置
负载均衡策略
# ROUND_ROBIN - 轮询
- name: round_robin_cluster
lb_policy: ROUND_ROBIN
load_assignment:
cluster_name: round_robin_cluster
endpoints:
- lb_endpoints:
- endpoint:
address:
socket_address:
address: backend1.example.com
port_value: 80
熔断器配置
- name: circuit_breaker_cluster
connect_timeout: 1s
lb_policy: ROUND_ROBIN
circuit_breakers:
thresholds:
- priority: DEFAULT
max_connections: 1000
max_pending_requests: 1000
max_requests: 1000
max_retries: 3
Envoy管理界面
Envoy提供了一个管理界面,可以查看运行状态、统计数据和动态修改配置。
admin:
address:
socket_address:
protocol: TCP
address: 0.0.0.0
port_value: 9901
# 常用管理端点
# 查看服务器信息: curl http://localhost:9901/server_info
# 查看当前配置: curl http://localhost:9901/config_dump
# 查看集群状态: curl http://localhost:9901/clusters
# 查看统计信息: curl http://localhost:9901/stats
运维管理
启动Envoy
# 使用配置文件启动
envoy -c /etc/envoy/envoy.yaml
# 使用systemd管理
sudo systemctl enable envoy
sudo systemctl start envoy
sudo systemctl status envoy
监控指标
# Envoy支持多种监控指标格式
# 查看所有指标
curl http://localhost:9901/stats
# 以Prometheus格式查看
curl http://localhost:9901/stats/prometheus
常见问题与解决方案
Q1: Envoy启动失败,配置文件报错
问题描述:启动Envoy时提示配置文件语法错误
解决方法:
- 使用YAML语法检查工具验证配置文件
- 检查YAML缩进是否正确(使用空格而非制表符)
- 查看详细错误日志
# 验证配置文件语法
python3 -c "import yaml; yaml.safe_load(open('/etc/envoy/envoy.yaml'))"
# 调试启动
envoy -c /etc/envoy/envoy.yaml --log-level debug
Q2: 负载均衡不生效
问题描述:所有请求都路由到同一台后端服务器
解决方法:
- 检查集群类型配置是否正确
- 确认后端服务器配置了多个endpoint
- 验证负载均衡策略配置
Q3: gRPC请求失败
问题描述:gRPC客户端无法连接或请求超时
解决方法:
- 确保listener配置了
codec_type: H2 - 在cluster中配置
http2_protocol_options
总结
Envoy作为云原生时代的核心代理组件,提供了丰富的功能和灵活的配置方式。通过本文的介绍,你应该已经掌握了Envoy的基本概念、安装配置和使用方法。
参考资源
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。







