网关系统概述
2025/9/7大约 5 分钟
网关系统概述
本系统是一个基于Netty和Springboot 责任链模式 和 分布式服务治理的微服务网关,核心功能包括 负载均衡、请求鉴权、自定义请求处理、接口调用处理、结果包装、服务注册与发现、动态配置更新 等。系统通过 Redis 实现接口信息缓存、心跳状态同步,结合 JWT鉴权 与 安全组标识 完成权限校验,支持 HTTP/Dubbo 双协议封装与泛化调用。
在GitHub上查看项目地址
网关核心模块
- 功能:作为请求处理的核心入口,负责请求的完整生命周期管理。
- 子模块:
- Netty处理链:基于Netty构建的高性能请求处理链,包含以下Handler:
- AuthorizationHandler:JWT鉴权验证,结合安全组秘钥进行权限校验,使用Caffeine本地缓存提升性能
- RateLimitHandler:分布式限流处理,支持全局、服务、接口、IP四级限流粒度
- PreExecutorHandler:前置处理器编排,支持串行和并行执行自定义处理器
- ExecutorHandler:执行器处理,根据请求类型选择HTTP或Dubbo连接并执行
- PostExecutorHandler:后置处理器编排,处理响应结果
- ResultHandler:结果封装处理,统一返回格式
- 分布式限流器:支持两种限流模式:
- DISTRIBUTED模式:纯分布式限流,使用Redis侧的令牌桶或滑动窗口算法
- LOCAL_DISTRIBUTED模式:本地+分布式混合模式,批量从Redis获取令牌后在本地高性能限流
- 负载均衡:基于NGINX负载均衡 + 权重策略分配请求到后端服务,支持动态配置更新。
- 动态代理与 RPC 调用:创建动态代理对象,封装 HTTP/Dubbo 请求,对连接源进行包装存储,支持泛化调用(泛型参数传递)。
- 配置订阅:通过Redis Pub/Sub订阅配置变更消息,实现限流配置、服务实例等的实时更新。
- Netty处理链:基于Netty构建的高性能请求处理链,包含以下Handler:
网关中心模块
- 功能:管理全局配置、服务注册与发现、接口信息同步、限流配置管理。
- 子模块:
- 配置管理:动态加载并刷新 Redis/Nginx 配置,支持负载均衡策略更新。NGINX配置通过SSH远程管理(配置在application.yml的nginx.config.remote中)。
- 限流配置管理:提供限流规则的创建、更新、删除、查询功能,支持实时推送配置到所有网关节点,实现动态限流策略调整。支持两种限流模式(DISTRIBUTED和LOCAL_DISTRIBUTED)和两种限流算法(TOKEN_BUCKET和SLIDING_WINDOW)。
- 服务注册与发现:
- 服务提供者通过 SDK 注册服务信息(URL、接口名、方法名、参数类型、是否鉴权、是否HTTP、HTTP类型)。
- Redis 存储服务元数据(Key格式:
heartbeat:server:服务名:地址和heartbeat:group:分组名:地址)。 - 接口信息存储在Redis(Key格式:
URL:服务名:接口路径)。
- 心跳与续约:
- 服务启动时主动注册,后续定期发送心跳续约(间隔 15 秒,过期时间 30 秒)。
- 网关中心定时任务每15秒发送心跳请求(通过Redis Pub/Sub的heartBeat频道)。
- Redis Key 过期自动触发服务下线(通过监听__keyevent@*__:expired事件),避免僵尸节点。
- 接口拉取与同步:服务提供者通过SDK上传接口信息到网关中心,网关中心同步到Redis,网关核心从Redis加载接口元数据。
SDK 模块
- 功能:提供服务提供者使用的 SDK,简化服务注册与调用。
- 子模块:
- 服务注册 SDK(server-find-sdk):
- 自动加载配置,扫描
@ApiInterface和@ApiMethod注解 - 解析接口元数据(URL、方法名、参数类型等)
- 支持 HTTP 和 Dubbo 双协议注册
- 自动上传接口信息到网关中心
- 定期发送心跳续约,维持服务在线状态
- 自动加载配置,扫描
- 请求调用 SDK(server-send-sdk):
- 提供
GatewayClient便捷调用网关接口 - 支持 GET、POST、PUT、DELETE 等 HTTP 方法
- 自动处理 JWT 鉴权和安全认证
- 支持请求参数和请求体的灵活传递
- 统一处理响应结果和异常
- 提供
- 服务注册 SDK(server-find-sdk):
Redis 消息订阅与事件通知
- 功能:实现分布式事件驱动,确保网关与服务提供者的实时通信。
- 子模块:
- 消息订阅:监听 Redis 通道,接收服务上下线、配置变更等事件:
service-launched:服务启动/刷新本地缓存通知heartBeat:心跳请求通知rate-limit-config-update:限流配置更新通知__keyevent@*__:expired:Redis Key过期事件(用于服务下线检测)
- 事件处理:
- 服务下线事件:监听Redis Key过期事件,自动标记服务离线状态,更新NGINX配置。
- 配置变更事件:网关核心订阅限流配置更新消息,动态更新本地限流器配置。
- 心跳事件:网关核心订阅心跳消息,触发服务实例状态检查。
- 全局唯一 ID 生成:使用Snowflake算法生成分布式唯一ID(通过UniqueIdUtil工具类)。
- 消息订阅:监听 Redis 通道,接收服务上下线、配置变更等事件:
数据库与持久化
- 功能:存储网关核心数据,支持高可用与快速查询。
- 子模块:
- 接口信息:存储接口的 URL、方法、参数、安全组等元数据。
- 服务注册:记录服务提供者的地址、心跳时间、接口映射关系。
- 限流配置:存储限流规则(限流类型、目标、阈值、策略等),支持动态配置和实时生效。
- 配置管理:存储网关全局配置(如NGINX地址、负载均衡权重等等)。