# g2rain-gateway-webflux(WebFlux 网关)

g2rain-gateway-webflux 是基于 Spring Cloud Gateway / WebFlux 响应式编程模型 构建的企业级 API 网关,为 G2rain SaaS 平台提供统一路由转发、身份认证、安全防护与流量管理能力,适合高并发与非阻塞场景。

# 核心特性

# 动态路由管理

  • 数据库驱动路由:支持从数据库动态加载路由配置
  • 内存缓存优化:路由信息缓存到内存(提升查找性能)
  • 运行时刷新:支持动态刷新路由配置,无需重启服务
  • 负载均衡与服务发现:集成 Spring Cloud LoadBalancer,并可通过 Nacos 进行服务注册发现

# 多层认证体系

  • JWT Token 认证:标准 JWT 校验
  • DPoP Proof 认证:基于 DPoP 的增强安全认证
  • 双重认证机制:JWT + DPoP 双重验证
  • 认证服务集成:与 g2rain-iam 深度集成
  • 鉴权上下文管理:构建 EdgePrincipalContext

# 完整过滤器链(典型链路)

  • CachedBodyFilter:请求体缓存,确保请求体可重复读取
  • GatewayTokenAuthFilter:JWT 认证
  • GatewayDPoPAuthFilter:DPoP 认证
  • PrincipalForwardFilter:身份信息转发到下游服务
  • TraceLoggingFilter:请求响应日志记录
  • SignVerificationFilter:请求签名验证,保证请求完整性
  • ResponseAdjustFilter:统一响应格式调整

# 安全防护机制

  • 白名单机制:支持全局与过滤器级别白名单配置
  • 路径匹配:支持上下文路径、精确路径、模式路径三种匹配方式
  • 敏感信息保护:移除/保护认证头与 DPoP 信息
  • 防重放攻击:DPoP 的 JTI 校验

# 统一异常处理

  • GlobalErrorHandler 捕获 WebFlux 异常
  • 返回统一的 Result 响应格式
  • 多语言错误消息:ErrorMessageStorage

# 数据库路由定义与刷新

路由定义表(route_definition)与示例刷新接口:

CREATE TABLE `route_definition` (
  `ID` bigint NOT NULL AUTO_INCREMENT,
  `UPDATE_TIME` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `VERSION` int NOT NULL DEFAULT '0',
  `DELETE_FLAG` tinyint NOT NULL DEFAULT '0',
  `NAME` varchar(128) NOT NULL,
  `ENDPOINT_HOST` varchar(256) NOT NULL,
  `ENDPOINT_PATH` varchar(256) DEFAULT NULL,
  `CONTEXT` varchar(128) NOT NULL,
  `PATH` varchar(256) NOT NULL,
  `METHOD` varchar(32) DEFAULT NULL,
  PRIMARY KEY (`ID`)
) ENGINE=InnoDB DEFAULT CHARSET=UTF8MB4 COMMENT='网关路由定义表';

刷新路由(示例):

POST /actuator/gateway/refresh

# 配置文件要点(示例片段)

server:
  port: 8081

spring:
  cloud:
    nacos:
      server-addr: 127.0.0.1:8848
      discovery:
        namespace: dev
        group: g2rain
        service: g2rain-gateway
  r2dbc:
    url: r2dbc:mysql://localhost:3306/g2rain-system?useSSL=false&serverTimezone=Asia/Shanghai

gateway-white-list:
  global:
    pattern-paths:
      - /v2/api-docs
      - /actuator/**
  filters:
    gateway-token-auth-filter:
      context-paths:
        - /auth
        - /public