微调
This commit is contained in:
@@ -1,143 +0,0 @@
|
||||
# rdms-gateway
|
||||
|
||||
## 1. 模块定位
|
||||
|
||||
`rdms-gateway` 是 API 服务网关模块,基于 Spring Cloud Gateway(WebFlux)实现,负责统一入口的路由转发、鉴权透传、跨域处理、访问日志、灰度/标签负载与全局异常处理。
|
||||
|
||||
## 2. 设计思路
|
||||
|
||||
- 通过网关统一处理横切能力,业务服务只关注业务逻辑。
|
||||
- 鉴权只做“解析 + 透传”,是否需要登录交给后端服务判定。
|
||||
- 灰度/标签负载通过自定义 `grayLb://` 方案实现。
|
||||
- 访问日志默认打印到日志,后续可扩展为落库。
|
||||
|
||||
## 3. 功能模块
|
||||
|
||||
### 3.1 路由与文档聚合
|
||||
|
||||
- 路由配置集中在 `application.yaml` 的 `spring.cloud.gateway.server.webflux.routes`。
|
||||
- Knife4j Gateway 负责聚合各服务的 OpenAPI 文档。
|
||||
|
||||
### 3.2 Token 鉴权透传
|
||||
|
||||
`TokenAuthenticationFilter` 负责:
|
||||
|
||||
- 从 `Authorization` 解析 Token
|
||||
- 远程校验 Token 有效性
|
||||
- 校验通过后将 `login-user` 头透传给后端
|
||||
- 不阻断请求,是否需要登录由后端服务决定
|
||||
|
||||
### 3.3 跨域处理
|
||||
|
||||
`CorsFilter` 统一放行跨域请求,并处理 OPTIONS 预检请求。
|
||||
|
||||
### 3.4 访问日志
|
||||
|
||||
`AccessLogFilter` 记录:
|
||||
|
||||
- 请求路径、方法、参数、Body、Headers
|
||||
- 响应体、响应码
|
||||
- 耗时、用户信息
|
||||
|
||||
当前实现是打印到日志(控制台/文件),可扩展为落库。
|
||||
|
||||
### 3.5 灰度/标签负载
|
||||
|
||||
灰度发布(Gray/Canary)是指新旧版本并行运行,只让一小部分请求先进入新版本验证,稳定后再逐步扩大流量,最终全量切换。
|
||||
|
||||
在本项目中,灰度不是按“百分比随机分流”,而是**按请求头定向路由**:
|
||||
|
||||
- 请求头 `version` 用于匹配实例 `metadata.version`
|
||||
- 请求头 `tag` 用于匹配实例 `metadata.tag`
|
||||
- 如果匹配不到目标实例,会回退到全量实例
|
||||
- 最终按 Nacos 权重随机选择实例
|
||||
|
||||
`grayLb://` + `GrayLoadBalancer` 规则:
|
||||
|
||||
- header `version` 匹配实例 metadata `version`
|
||||
- header `tag` 匹配实例 metadata `tag`
|
||||
- 无匹配时回落到全量实例
|
||||
|
||||
注意:
|
||||
|
||||
- 不带 `tag` 的请求会优先过滤掉带 `tag` 的实例,避免测试/灰度实例被默认流量命中
|
||||
- 灰度发布依赖请求头控制路由范围,需要由网关或内部调用方注入 `version/tag`,避免外部随意绕路
|
||||
|
||||
### 3.6 全局异常
|
||||
|
||||
`GlobalExceptionHandler` 将异常统一翻译为 `CommonResult` 返回。
|
||||
|
||||
### 3.7 Jackson 一致性
|
||||
|
||||
`GatewayJacksonAutoConfiguration` 统一 JSON 序列化策略(时间戳、Long -> Number 等)。
|
||||
|
||||
## 4. 开发人员上手
|
||||
|
||||
### 4.1 路由配置示例
|
||||
|
||||
```yaml
|
||||
spring:
|
||||
cloud:
|
||||
gateway:
|
||||
server:
|
||||
webflux:
|
||||
routes:
|
||||
- id: system-admin-api
|
||||
uri: grayLb://rdms-system-server
|
||||
predicates:
|
||||
- Path=/admin-api/system/**
|
||||
filters:
|
||||
- RewritePath=/admin-api/system/v3/api-docs, /v3/api-docs
|
||||
```
|
||||
|
||||
### 4.2 鉴权透传
|
||||
|
||||
前端携带:
|
||||
|
||||
```
|
||||
Authorization: Bearer <token>
|
||||
```
|
||||
|
||||
网关校验成功后,会透传 `login-user` 给后端服务。
|
||||
|
||||
### 4.3 灰度/标签路由
|
||||
|
||||
请求头示例:
|
||||
|
||||
```
|
||||
version: 1.0.0
|
||||
tag: dev
|
||||
```
|
||||
|
||||
服务实例需要在注册中心 metadata 中配置对应 `version/tag`。
|
||||
|
||||
### 4.4 WebSocket 路由
|
||||
|
||||
```yaml
|
||||
- id: system-websocket
|
||||
uri: grayLb://rdms-system-server
|
||||
predicates:
|
||||
- Path=/system/ws/**
|
||||
```
|
||||
|
||||
### 4.5 文档聚合示例
|
||||
|
||||
```yaml
|
||||
knife4j:
|
||||
gateway:
|
||||
enabled: true
|
||||
routes:
|
||||
- name: system-server
|
||||
service-name: rdms-system-server
|
||||
url: /admin-api/system/v3/api-docs
|
||||
```
|
||||
|
||||
## 5. 关键类索引
|
||||
|
||||
- 入口:`src/main/java/com/njcn/rdms/gateway/GatewayServerApplication.java`
|
||||
- 路由配置:`src/main/resources/application.yaml`
|
||||
- 鉴权:`src/main/java/com/njcn/rdms/gateway/filter/security/TokenAuthenticationFilter.java`
|
||||
- 灰度:`src/main/java/com/njcn/rdms/gateway/filter/grey/GrayLoadBalancer.java`
|
||||
- 访问日志:`src/main/java/com/njcn/rdms/gateway/filter/logging/AccessLogFilter.java`
|
||||
- 跨域:`src/main/java/com/njcn/rdms/gateway/filter/cors/CorsFilter.java`
|
||||
- 全局异常:`src/main/java/com/njcn/rdms/gateway/handler/GlobalExceptionHandler.java`
|
||||
Reference in New Issue
Block a user