envoy怎样代理

联启 网络工具 13

本文目录导读:

envoy怎样代理-第1张图片-电脑手机工具软件下载 - 免费实用工具合集 | 联启科技

  1. 核心概念:Envoy 的配置模型
  2. 配置实战:一个简单的反向代理
  3. 更常见的场景:代理内部 HTTP 服务 + 负载均衡
  4. 高级配置:路径路由(API 网关模式)
  5. 使用管理接口验证
  6. 总结:Envoy 代理的核心步骤

Envoy 是一个高性能、开源的边缘和服务代理,常用于微服务架构中作为 API 网关或服务网格的数据面(如 Istio 的数据面),下面我会从核心概念配置结构具体示例(反向代理与负载均衡)三个方面,帮你理解如何使用 Envoy 进行代理。


核心概念:Envoy 的配置模型

Envoy 的配置基于 xDS 协议(动态发现)或静态文件,对于初学者,掌握静态配置就足够了,其核心组件包括:

  1. Listener(监听器):Envoy 会在哪些 IP:Port 上接收来自下游(客户端)的请求。
  2. Filter(过滤器):定义如何处理进入 Listener 的流量,最核心的是 http_connection_manager(处理 HTTP 流量)或 tcp_proxy(处理 TCP 流量)。
  3. Cluster(集群):定义上游(后端服务)的地址、负载均衡策略、健康检查等。
  4. Endpoint(端点):集群中具体的后端服务实例(IP:Port)。

代理的本质Listener 监听端口 -> 过滤器解析请求 -> 根据路由规则转发到对应的 Cluster -> Cluster 将请求发送到具体的 Endpoint


配置实战:一个简单的反向代理

假设你想让 Envoy 监听本地的 10000 端口,并将所有请求代理到 www.example.com(即一个标准的反向代理)。

编写 Envoy 配置文件(envoy.yaml

admin:
  access_log_path: /tmp/admin_access.log
  address:
    socket_address:
      address: 0.0.0.0
      port_value: 9901 # Envoy 管理界面端口
static_resources:
  # 1. 定义监听器
  listeners:
  - name: listener_0
    address:
      socket_address:
        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
          stat_prefix: ingress_http
          # 2. 定义 HTTP 路由
          route_config:
            name: local_route
            virtual_hosts:
            - name: local_service
              domains: ["*"]  # 匹配所有域名
              routes:
              - match:
                  prefix: "/" # 匹配所有路径
                route:
                  cluster: target_service # 转发到名为 target_service 的集群
          # 3. 定义 HTTP 过滤器(此处省略额外过滤器)
          http_filters:
          - name: envoy.filters.http.router
            typed_config:
              "@type": type.googleapis.com/envoy.extensions.filters.http.router.v3.Router
  # 4. 定义集群(上游服务)
  clusters:
  - name: target_service
    type: STRICT_DNS # 使用 DNS 解析
    lb_policy: ROUND_ROBIN # 负载均衡策略
    load_assignment:
      cluster_name: target_service
      endpoints:
      - lb_endpoints:
        - endpoint:
            address:
              socket_address:
                address: www.example.com # 上游域名
                port_value: 443
    # 由于目标是 HTTPS,需要指定 TLS 上下文(作为客户端访问上游)
    transport_socket:
      name: envoy.transport_sockets.tls
      typed_config:
        "@type": type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.UpstreamTlsContext
        sni: www.example.com

启动 Envoy

# 假设你已经安装好了 envoy
envoy -c envoy.yaml

验证

在浏览器或使用 curl 访问 http://localhost:10000,Envoy 会将请求代理到 https://www.example.com(因为上游是 443 端口且配置了 TLS)。

注意:如果你代理的是 HTTP 后端(如 localhost:8080),则不需要 transport_socket 部分,直接配置地址和端口即可。


更常见的场景:代理内部 HTTP 服务 + 负载均衡

假设你的后端有 2 个实例:

  • 0.0.1:8080
  • 0.0.2:8080

你希望 Envoy 在 8081 端口接收请求,并负载均衡到这两个节点。

配置文件(简化版,只修改 clusters 部分):

  clusters:
  - name: service_backend
    type: STRICT_DNS  # 或 STATIC(静态IP)
    lb_policy: LEAST_REQUEST  # 或 ROUND_ROBIN、RING_HASH
    # 对于静态 IP,使用 type: STATIC
    load_assignment:
      cluster_name: service_backend
      endpoints:
      - lb_endpoints:
        - endpoint:
            address:
              socket_address:
                address: 10.0.0.1
                port_value: 8080
        - endpoint:
            address:
              socket_address:
                address: 10.0.0.2
                port_value: 8080

关键参数说明

  • type: STATIC(直接写死 IP)、STRICT_DNS(DNS 解析,支持轮询)、EDS(基于端点发现服务)。
  • lb_policy: ROUND_ROBIN(轮询)、LEAST_REQUEST(最少请求)、RING_HASH(一致性哈希)等。

高级配置:路径路由(API 网关模式)

Envoy 也可以作为网关,根据路径将请求转发到不同的后端服务。

route_config:
  virtual_hosts:
  - name: api_gateway
    domains: ["*"]
    routes:
    - match: { prefix: "/api/users" }
      route: { cluster: user_service }
    - match: { prefix: "/api/orders" }
      route: { cluster: order_service }
    - match: { prefix: "/" }
      route: { cluster: default_service }

使用管理接口验证

启动后,你可以通过 Envoy 的管理界面查看配置是否生效:

# 管理接口默认在 localhost:9901
curl http://localhost:9901/config_dump  # 查看完整配置
curl http://localhost:9901/clusters     # 查看集群和健康状态
curl http://localhost:9901/stats        # 查看统计数据

Envoy 代理的核心步骤

  1. 确定监听入口listeners 部分定义端口。
  2. 选择协议过滤器:HTTP(http_connection_manager)或 TCP(tcp_proxy)。
  3. 配置路由规则route_config 中根据域名或路径匹配。
  4. 定义上游集群clusters 中指定后端地址和负载均衡策略。
  5. 启动并观察:使用管理接口排错。

Envoy 的配置非常灵活,但初次接触时容易因为 YAML 的层级复杂而感到困惑,建议从最简单的 HTTP 反代 + 单集群 开始,逐步增加路由规则、TLS、重试、超时等特性。

如果你有更具体的场景(比如想代理 WebSocket、gRPC,或者实现限流、熔断),可以告诉我,我可以给你补充相关的配置片段。

标签: 代理

抱歉,评论功能暂时关闭!