# gateway_daily **Repository Path**: henriy/gateway_daily ## Basic Information - **Project Name**: gateway_daily - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-07-01 - **Last Updated**: 2026-09-20 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 知乎登录业务(Spring Cloud Alibaba 微服务) 基于 Spring Cloud Alibaba 的标准微服务工程,实现统一网关鉴权 + RS256 登录体系。 ## 一、工程结构 ``` zhihu-parent (父工程,统一版本管理) ├── zhihu-common 公共模块:统一返回体 R、JWT(RS256) 工具、RSA 工具、常量、模型 ├── zhihu-gateway 网关:路由、负载均衡、Token 校验、灰度、日志链路 (端口 8888) └── zhihu-business 业务:登录/刷新/登出/用户信息、MyBatis-Plus、Redis (端口 9001) ``` ## 二、技术栈 | 类别 | 选型 | |------|------| | 基础 | JDK8、Maven、Spring Boot 2.6.13 | | 微服务 | Spring Cloud 2021.0.5 + Spring Cloud Alibaba 2021.0.5.0 | | 注册/配置 | Nacos | | 网关 | Spring Cloud Gateway(响应式) | | 负载均衡 | Spring Cloud LoadBalancer(自定义灰度策略) | | 远程调用 | OpenFeign(为后续多模块互调预留) | | 持久层 | MyBatis-Plus(示例内嵌 H2,可切 MySQL) | | 缓存/登录态 | Redis(业务侧阻塞、网关侧响应式) | | 鉴权 | JWT,签名算法 RS256(公私钥分离) | ## 三、核心链路 ``` 前端 → 网关(8888) → TraceLogGlobalFilter 生成/透传 traceId,记录进入/耗时日志 → AuthGlobalFilter 白名单放行 / RS256 验签 / Redis 踢人校验 / 注入 X-User-Id → GrayLoadBalancer 按 X-Gray-Version 版本 + metadata.weight 选实例 → lb://zhihu-business 负载均衡转发 → 业务模块 直接信任 X-User-Id,无需重复鉴权 ``` ## 四、需求落点对照 1. **负载均衡**:路由 `uri: lb://zhihu-business`,从 Nacos 拉实例。 2. **网关统一鉴权**:`AuthGlobalFilter` 完成 Token + 登录态校验,业务零鉴权代码。 3. **统一配置**:白名单、公钥、路由全部集中在 `zhihu-gateway/application.yml`。 4. **灰度(Header/权重)**:`GrayLoadBalancer` 读 `X-Gray-Version` 命中 Nacos 实例 `metadata.version`,多实例按 `metadata.weight` 加权随机。 5. **日志/链路**:`TraceLogGlobalFilter` 统一入口生成 traceId 并透传下游。 6. **RS256**:business 持私钥签发,gateway 仅持公钥验签。 7. **单端登录/踢人**:`zhihu.jwt.kick=true/false` 开关;Redis 存有效 jti 集合,网关 `SISMEMBER` 校验。 8. **refresh 接口**:`POST /auth/refresh`,验签 + Redis 校验后轮换签发(旧 refresh 作废防重放)。 ## 五、前置依赖 启动前需准备(默认本机): - Nacos:`127.0.0.1:8848` - Redis:`127.0.0.1:6379` (数据库默认用内嵌 H2,自动建表 + 初始化账号,无需额外安装。切 MySQL 时改 `zhihu-business/application.yml` 的 datasource 即可。) ## 六、启动 ```bash # 1. 打包 mvn clean package -DskipTests # 2. 分别启动(确保 Nacos / Redis 已就绪) java -jar zhihu-business/target/zhihu-business.jar java -jar zhihu-gateway/target/zhihu-gateway.jar ``` ## 七、接口验证(统一走网关 8888) 初始账号:`admin / 123456`、`zhihu / 123456` ```bash # 登录(白名单,免 Token) curl -X POST http://localhost:8888/auth/login \ -H "Content-Type: application/json" \ -d '{"username":"admin","password":"123456"}' # 返回 userInfo + accessToken + refreshToken # 访问受保护接口(带 accessToken) curl http://localhost:8888/user/info \ -H "Authorization: Bearer {accessToken}" # 刷新 Token curl -X POST http://localhost:8888/auth/refresh \ -H "Content-Type: application/json" \ -d '{"refreshToken":"{refreshToken}"}' # 登出 curl -X POST http://localhost:8888/auth/logout \ -H "Authorization: Bearer {accessToken}" # 灰度:命中 v2 版本实例 curl http://localhost:8888/user/info \ -H "Authorization: Bearer {accessToken}" \ -H "X-Gray-Version: v2" ``` ## 八、踢人验证 `zhihu.jwt.kick=true` 时:用 admin 登录两次,第一次拿到的 accessToken 再访问 `/user/info` 会返回 `4013 账号已在别处登录,您已被迫下线`(旧 jti 已被新登录清除)。 设为 `false` 则两端 Token 均可用(多端共存)。 ## 九、密钥说明 `application.yml` 中已内置一对 2048 位 RSA 密钥用于演示: - business 同时持有 `private-key`(签发) 与 `public-key`(刷新验签) - gateway 仅持有 `public-key`(验签) **生产环境务必替换为自己的密钥**,并通过 Nacos 配置中心 / 环境变量注入,不要硬编码进仓库。 重新生成可用:`keytool` 或 `openssl genrsa` 转 PKCS8。 ``` ## 十、后续扩展新业务模块 新增模块(如 `zhihu-order`)只需: 1. 注册到 Nacos; 2. 网关已开启 `discovery.locator`,可直接通过 `/zhihu-order/**` 访问; 或在 `application.yml` 的 `routes` 增加一条干净路径路由。 无需改动鉴权逻辑——网关统一拦截,业务读 `X-User-Id` 即可。