API网关Envoy的鉴权与限流:构建安全可靠的微服务网关

🔥「炎码工坊」技术弹药已装填!

点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】

引言

在云原生和微服务架构盛行的今天,API网关作为服务流量的入口,承担着路由转发、安全控制、流量管理等核心职责。Envoy 作为一款高性能、可扩展的云原生代理工具,凭借其灵活的插件化架构和强大的社区支持,成为构建现代API网关的首选方案之一。本文将深入探讨如何利用 Envoy 实现高效的鉴权与限流机制,并结合实际配置示例,帮助开发者掌握其核心原理和落地实践。


一、Envoy的核心能力与定位

Envoy 是由 Lyft 开发并开源的高性能网络代理,具备以下关键特性:

  • 多协议支持:支持HTTP/1.1、HTTP/2、gRPC、TCP等协议。
  • 可编程性:通过插件化架构(Filters)实现功能扩展。
  • 动态配置:支持xDS协议动态更新配置(CDS、EDS、LDS、RDS等)。
  • 可观测性:内置丰富的指标监控(Prometheus兼容)和日志输出。
  • 高性能:基于C++实现,适用于高并发、低延迟场景。

在微服务架构中,Envoy 既可以作为 服务网格中的 Sidecar 代理 ,也可以作为 边缘网关统一管理入口流量。


二、Envoy的鉴权机制详解

1. JWT Token 鉴权

JWT(JSON Web Token)是微服务中最常用的无状态鉴权方案。Envoy 提供了内置的 envoy.filters.http.jwt_authn 过滤器,支持对请求中的 JWT 令牌进行自动验证。

配置示例:

复制代码
http_filters:
  - name: envoy.filters.http.jwt_authn
    typed_config:
      "@type": type.googleapis.com/envoy.extensions.filters.http.jwt_authn.v3.JwtAuthentication
      providers:
        provider1:
          issuer: "https://example.com"
          audiences:
            - "api"
          forward: true
          remote_jwks:
            http_uri:
              uri: "https://example.com/.well-known/jwks.json"
              cluster: jwks_cluster
            cache_duration:
              seconds: 300

核心配置项说明:

  • issuer:令牌签发者,用于验证令牌来源。
  • audiences:受众列表,确保令牌针对当前服务。
  • remote_jwks:远程 JWKS 服务地址,用于获取公钥验证签名。
  • forward:是否将验证后的 JWT 头部转发到后端服务。

实际效果:

  • 请求头中携带 Authorization: Bearer <token>
  • Envoy 自动验证签名、过期时间、签发者等字段。
  • 验证失败时返回 401 Unauthorized。

2. 外部授权服务(External Authorization)

对于更复杂的鉴权逻辑(如基于角色的访问控制、IP白名单等),Envoy 支持通过 envoy.filters.http.ext_authz 过滤器将请求转发至外部授权服务。

配置示例:

复制代码
http_filters:
  - name: envoy.filters.http.ext_authz
    typed_config:
      "@type": type.googleapis.com/envoy.extensions.filters.http.ext_authz.v3.ExtAuthorization
      grpc_service:
        envoy_grpc:
          cluster_name: ext_authz
      failure_mode_allow: false

工作流程:

  1. 客户端发送请求到 Envoy。
  2. Envoy 将请求头、路径、方法等信息转发给外部授权服务(如 Go/Python 实现的 gRPC 服务)。
  3. 授权服务返回 AllowDeny 决策。
  4. Envoy 根据决策决定是否放行请求。

优势:

  • 灵活集成企业内部的权限系统(如 LDAP、OAuth2.0、RBAC)。
  • 可以结合请求上下文(如用户ID、IP地址、请求路径)进行细粒度控制。

三、Envoy的限流策略详解

1. 限流服务集成(Ratelimit Service)

Envoy 支持与开源的 Ratelimit[1] 服务集成,提供分布式限流能力。

配置步骤:

  1. 启用 Ratelimit 过滤器

    http_filters:

  2. 定义限流规则(在 Ratelimit 服务中配置):

    domain: rl
    descriptors:

    • key: remote_address
      value: 192.168.1.1
      rate_limit:
      unit: minute
      requests_per_unit: 100

核心配置项说明:

  • domain:限流规则的作用域,需与 Ratelimit 服务配置一致。
  • request_type:指定限流作用于 internalexternalboth 类型的请求。
  • rate_limit_service:指定 Ratelimit 服务的 gRPC 地址。

限流响应头:

Envoy 会在响应头中添加以下字段:

  • X-RateLimit-Limit: 当前窗口的配额。
  • X-RateLimit-Remaining: 剩余请求数。
  • X-RateLimit-Retry-After: 重试等待时间(秒)。

2. 本地限流(Local Rate Limiting)

对于轻量级限流需求,Envoy 提供了内置的 envoy.filters.http.local_rate_limit 过滤器,无需依赖外部服务。

配置示例:

复制代码
http_filters:
  - name: envoy.filters.http.local_rate_limit
    typed_config:
      "@type": type.googleapis.com/envoy.extensions.filters.http.local_rate_limit.v3.LocalRateLimit
      stat_prefix: local_rate_limiter
      token_bucket:
        max_tokens: 100
        tokens_per_fill: 10
        fill_interval: 1s
      filter_enabled:
        runtime_key: local_rate_limit_enabled
        default_value:
          numerator: 100
          denominator: HUNDRED

工作原理:

  • 使用令牌桶算法控制请求速率。
  • 每秒填充固定数量的令牌,超过配额的请求被拒绝。
  • 支持运行时动态启停限流策略。

四、实战:搭建 Envoy 网关的完整鉴权与限流示例

1. 架构设计

我们将构建一个包含以下组件的实验环境:

  • Envoy:作为网关,负责鉴权和限流。
  • ExtAuthz:自定义的 gRPC 授权服务(Go 实现)。
  • Ratelimit:开源的限流服务。
  • Backend:简单的 HTTP 服务(如 Nginx)。

2. Docker Compose 配置

复制代码
version: '3.7'
services:
  envoy:
    image: envoyproxy/envoy:v1.28.0
    ports:
      - "8080:8080"
      - "9901:9901"
    volumes:
      - ./envoy.yaml:/etc/envoy/envoy.yaml
    depends_on:
      - extauthz
      - ratelimit
      - backend

  extauthz:
    build: ./extauthz
    ports:
      - "9902:9902"

  ratelimit:
    image: envoyproxy/ratelimit:latest
    ports:
      - "9903:9903"
    volumes:
      - ./ratelimit/config:/data

  backend:
    image: nginx:latest
    ports:
      - "8000:80"

3. 验证流程

  1. 发送请求到 Envoy 端口 8080
  2. Envoy 调用 extauthz 服务进行鉴权。
  3. 鉴权通过后,触发限流规则。
  4. 请求最终转发到 backend 服务。

五、最佳实践与注意事项

1. 鉴权策略建议

  • 最小权限原则:仅允许必要的权限,避免过度授权。
  • 令牌刷新机制:设置合理的 JWT 有效期,结合刷新令牌(Refresh Token)。
  • 审计日志:记录鉴权失败事件,用于安全分析。

2. 限流策略建议

  • 分级限流:按用户、IP、API 分级设置限流规则。
  • 突发流量容忍:使用令牌桶算法允许短时突发流量。
  • 熔断机制:在限流基础上结合熔断器(如 Hystrix)防止雪崩效应。

3. 性能优化

  • 本地限流优先:轻量级场景使用本地限流减少网络开销。
  • 缓存令牌验证结果:对 JWT 验证结果进行缓存,提升性能。
  • 异步限流调用:对限流服务调用设置超时和重试策略,避免阻塞主流程。

六、总结

Envoy 凭借其灵活的插件化架构和强大的社区生态,能够高效实现微服务架构中的鉴权与限流需求。通过 JWT 鉴权保障服务访问的安全性,结合 Ratelimit 和本地限流策略控制流量洪峰,开发者可以构建出既安全又稳定的 API 网关。随着云原生技术的不断发展,Envoy 在服务网格、边缘计算等领域的应用将进一步扩展,值得持续关注与深入实践。


后续学习建议

  • 深入研究 Envoy 的 xDS 协议,掌握动态配置管理。
  • 探索 Istio 集成 Envoy 的服务网格模式。
  • 实践 Envoy 的熔断、重试、负载均衡等高级功能。

希望本文能为你的微服务架构设计与 Envoy 实践提供有力支持!

引用链接

[1] Ratelimit: https://github.com/envoyproxy/ratelimit

🚧 您已阅读完全文99%!缺少1%的关键操作:

加入「炎码燃料仓」🚀 获得:

√ 开源工具红黑榜

√ 项目落地避坑指南

√ 每周BUG修复进度+1%彩蛋

(温馨提示:本工坊不打灰工,只烧脑洞🔥)

相关推荐
Kookoos12 分钟前
ABP vNext + Spark on Hadoop:实时流处理与微服务融合
hadoop·微服务·spark·.net·abp vnext
AKAMAI2 小时前
微服务架构的核心优势解析
后端·云原生·云计算
AKAMAI2 小时前
什么是云计算的边缘原生应用?
云原生·云计算·边缘计算
芯盾时代4 小时前
安全大模型智驱网络和数据安全效能跃迁
网络·人工智能·安全·网络安全
程序员阿超的博客8 小时前
云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?
云原生·容器·kubernetes
迢迢星万里灬8 小时前
Java求职者面试:微服务技术与源码原理深度解析
java·spring cloud·微服务·dubbo·netty·分布式系统
炎码工坊9 小时前
云原生微服务通信安全之JWT:从零到实践
网络安全·微服务·云原生·系统安全·安全架构
程序员阿超的博客9 小时前
云原生核心技术 (2/12): Docker 入门指南——什么是容器?为什么它比虚拟机更香?
docker·云原生·容器
上海运维Q先生9 小时前
Cilium动手实验室: 精通之旅---19.Golden Signals with Hubble and Grafana
云原生·k8s·grafana·cilium
网安INF10 小时前
CVE-2024-23897源码分析与漏洞复现(Jenkins 任意文件读取)
java·web安全·网络安全·jenkins·漏洞