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%彩蛋

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

相关推荐
炎码工坊3 小时前
微服务通信安全实战:JWT在分布式架构中的应用与最佳实践
安全·网络安全·云原生·系统安全·安全架构
yours_Gabriel3 小时前
【java面试】微服务篇
java·微服务·中间件·面试·kafka·rabbitmq
程序员Bears3 小时前
Spring Cloud Hystrix熔断机制:构建高可用微服务的利器
spring cloud·hystrix·微服务
藥瓿亭5 小时前
K8S认证|CKS题库+答案| 9. 网络策略 NetworkPolicy
linux·运维·docker·云原生·容器·kubernetes·cks
955.5 小时前
k8s从入门到放弃之Pod的容器探针检测
云原生·容器·kubernetes
开航母的李大5 小时前
【中间件】Web服务、消息队列、缓存与微服务治理:Nginx、Kafka、Redis、Nacos 详解
前端·redis·nginx·缓存·微服务·kafka
2501_915106327 小时前
iOS性能调优实战:借助克魔(KeyMob)与常用工具深度洞察App瓶颈
websocket·网络协议·tcp/ip·http·网络安全·https·udp
渗透好难12 小时前
CTF show 数学不及格
安全·系统安全·密码学
容器魔方12 小时前
KubeCon China 2025 | 与KubeEdge畅聊毕业经验与创新未来
云原生·容器·云计算
运维潇哥14 小时前
k8s业务程序联调工具-KtConnect
云原生·容器·kubernetes