# central-platform **Repository Path**: rainxw/central-platform ## Basic Information - **Project Name**: central-platform - **Description**: 前后端分离的企业级微服务架构--后端。 springboot 3.5.9、spring cloud 2025、spring cloud alibaba 2025 、Spring Authorization Server oatuh2 鉴权。 基于zlt框架,实现后微服务框架的脚手架(可以学习,参考,相互交流,应对AI崛起) - **Primary Language**: Unknown - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 5 - **Forks**: 2 - **Created**: 2026-01-29 - **Last Updated**: 2026-07-10 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README

Central-Platform

Version JDK Spring Boot Spring Cloud Spring Cloud Alibaba Spring Authorization Server License

**中文** | [English](./README.en.md) --- ## 一、项目简介 Central-Platform 是一套基于 **Spring Boot 3.5.9 + Spring Cloud 2025 + Spring Cloud Alibaba 2025** 的前后端分离企业级微服务后端脚手架。 项目核心聚焦于以下能力: - **标准 OAuth2/OIDC 认证体系**:基于 Spring Authorization Server 1.5.5,支持密码模式、验证码模式、手机号模式、OpenID Connect,并集成 Redis 分布式 Session 与 Opaque Token(不透明令牌/引用令牌)。 - **统一 API 网关**:Spring Cloud Gateway(WebFlux 响应式),实现鉴权、限流、动态路由、接口聚合文档。 - **可插拔微服务架构**:12 个 Spring Boot Starter 封装横切关注点,业务模块开箱即用。 - **多维度可观测性**:Spring Boot Admin 监控 + 集中日志中心 + Prometheus 指标采集。 - **弹性设计**:Sentinel 熔断限流 + Feign 服务降级 + Nacos 动态配置。 - **消息驱动与实时推送**:RabbitMQ 消息驱动 + SSE 长连接实时推送。 > 本项目基于 [zlt/microservices-platform](https://gitee.com/zlt2000/microservices-platform) 升级演进而来,适用于学习、参考及二次开发。 --- ## 二、技术栈 ## 总体架构图 ![framework.png](https://gitee.com/rainxw/central-resouce/raw/master/image/platform.png)! ### 核心框架 | 组件 | 版本 | 说明 | |-----------------------------|------------|----------------------| | JDK | 17+ | 运行时 | | Spring Boot | 3.5.9 | 基础框架 | | Spring Cloud | 2025.0.0 | 微服务套件 | | Spring Cloud Alibaba | 2025.0.0.0 | Nacos 注册/配置、Sentinel | | Spring Authorization Server | 1.5.5 | OAuth2 / OIDC 授权服务器 | | Spring Cloud Gateway | 2025.0.0 | 响应式 API 网关(WebFlux) | ### 存储与缓存 | 组件 | 版本 | 说明 | |---------------|--------|-------------------------| | MySQL | 8.x | 主数据库 | | MyBatis-Plus | 3.5.12 | ORM 框架,支持逻辑删除 | | Druid | 1.2.23 | 数据库连接池,含 SQL 监控 | | Redis | 8.2.1 | Redis server | | Redisson | 3.52.0 | Redis 客户端,分布式缓存/Session | | Elasticsearch | 9.x | 全文搜索与日志分析 ### 消息队列 | 组件 | 版本 | 说明 | |------|------|------| | RabbitMQ | 4.x+ | 消息代理,支持 DLX 重试、延迟消息、死信队列监控 | ### 服务治理 | 组件 | 版本 | 说明 | |------|------|------| | Nacos | 3.x(8848) | 服务注册、配置中心 | | Sentinel | 2025.0.0 | 熔断、限流、流量控制 | | Spring Cloud OpenFeign | 2025.0.0 | 声明式 HTTP 客户端 | | Apache Dubbo | 3.3.5 | RPC 框架(Starter 集成,可选启用) | | Apache Curator | 5.9.0 | ZooKeeper 分布式协调 | ### 安全与认证 | 组件 | 说明 | |------|------| | Spring Security | 权限模型与 Filter Chain | | Spring Security OpaqueTokenIntrospector | 网关统一鉴权,Token 为 Opaque Token(不透明令牌/引用令牌,非 JWT 自包含令牌),通过调用 UAA 内省端点验证 | | Spring Security OAuth2 | 各微服务内部安全上下文解析(内网隔离,无需二次验签) | ### 对象存储 | 组件 | 说明 | |------|------| | AWS SDK S3 2.41.5 | S3 兼容存储(MinIO / 阿里云 OSS / AWS) | ### 工具与文档 | 组件 | 说明 | |------|------| | Knife4j 4.5.0 + SpringDoc 2.8.15 | OpenAPI 3 接口文档,网关聚合 | | Spring Boot Admin 3.5.6 | 应用监控面板 | | Micrometer Prometheus | Metrics 指标采集 | | HuTool 5.8.42 | Java 工具库 | | Transmittable ThreadLocal | 跨线程上下文传递(链路追踪) | --- ## 三、系统架构 ### 整体调用关系 ``` ┌────────────────────────────────────────────────────────────────────┐ │ 客户端 (Browser / App) │ └────────────────────────────┬───────────────────────────────────────┘ │ HTTPS(唯一对外入口) ▼ ┌────────────────────────────────────────────────────────────────────┐ │ sc-gateway (9900) ← 唯一对外暴露服务 │ │ ┌──────────────────┐ ┌──────────────────┐ ┌──────────────────┐ │ │ │ Opaque Token鉴权 │ │ PermissionAuth │ │ Sentinel 限流/熔 │ │ │ │ (内省端点验证) │ │ Manager │ │ 断 (Nacos规则) │ │ │ └──────────────────┘ └──────────────────┘ └──────────────────┘ │ │ ┌─────────────────────────────────────────────────────────────┐ │ │ │ 动态路由 (Nacos) + 静态路由 (application.yml) │ │ │ └─────────────────────────────────────────────────────────────┘ │ └──────┬──────────┬───────────┬──────────┬──────────┬────────────────┘ │ │ │ │ │(内网隔离,不对外) ▼ ▼ ▼ ▼ ▼ ┌──────────┐ ┌────────┐ ┌────────┐ ┌────────┐ ┌──────────┐ │ uaa │ │system │ │file │ │search │ │log │ │ (8000) │ │(7000) │ │(5000) │ │(7100) │ │(7200) │ └──────────┘ └────────┘ └────────┘ └────────┘ └──────────┘ │ │ │ │ │ │ Feign调用 │ ▲ ▼ │ (权限菜单) │ │ Elasticsearch(9.x) │ └──────────┘ │ (日志/审计) ▼ │ Redis Feign(search-client SDK) (Session/Token缓存) │ system-center(日志查询) ┌──────────────────────────────────────────────────────────────────────────────────────────┐ │ 基础设施层(内网) │ │ Nacos(8848) MySQL(各库独立) Redis Elasticsearch(9.x) MinIO RabbitMQ(5672) │ │ │ └──────────────────────────────────────────────────────────────────────────────────────────┘ ``` ### SSE 实时推送流程 ``` ┌────────────────────────────────────────────────────────────────────┐ │ central-sse (9300) ← SSE 长连接网关 │ │ ┌──────────────────┐ ┌──────────────────┐ ┌──────────────────┐ │ │ │ WebFlux SSE │ │ RabbitMQ 通知 │ │ 网关 Header 透传 │ │ │ │ 多端连接管理 │ │ 监听 │ │ (x-user-id) │ │ │ └──────────────────┘ └──────────────────┘ └──────────────────┘ │ │ ┌──────────────────┐ ┌──────────────────┐ │ │ │ 心跳保活(15s) │ │ 空闲清理(90s) │ │ │ └──────────────────┘ └──────────────────┘ │ └──────────────────────────────┬─────────────────────────────────────┘ │ 监听 RabbitMQ 事件 ▼ ┌────────────────────────────────────────────────────────────────────┐ │ RabbitMQ (5672) │ │ ┌──────────────────┐ ┌──────────────────┐ ┌──────────────────┐ │ │ │ 消息交换机 │ │ DLX 死信交换机 │ │ 延迟消息交换机 │ │ │ │ (central.mq) │ │ (central.dlx) │ │ (central.delay) │ │ │ └──────────────────┘ └──────────────────┘ └──────────────────┘ │ └────────────────────────────────────────────────────────────────────┘ ``` ``` 前端 sc-gateway central-sse RabbitMQ 业务服务 | | | | | |-- GET /api-sse/subscribe -->| | | | | |------- 路由转发 ----->| | | | | |----- 监听队列 ---->| | | | | | | | | | |<--- 事件发布 --| | | |<----- 消费事件 ----| | |<- SSE 事件流 ----------------|<------ 推送事件 -------| | | | | | | | | 客户端收到实时推送(notify 事件) | | | ``` ### 认证流程 > **核心原则**:网关(sc-gateway)是唯一对外入口,统一负责 Opaque Token 鉴权(通过 `OpaqueTokenIntrospector` 调用 UAA 内省端点)。内部微服务处于网络隔离状态,不直接对外暴露,无需独立验签 Token。 ``` 客户端 Gateway(唯一出口) UAA(8000) Redis │ │ │ │ │──POST /oauth2/token──►│ │ │ │ │──透传(PreserveHost)──────►│ │ │ │ │──验证User+Client──►│ │ │ │◄──Session Context──│ │ │◄──Opaque Token───────────│ │ │◄──Opaque Token────────│ │ │ │ │ │ │ │──GET /api-system/xx──►│ │ │ │ │──Opaque Token 鉴权(OpaqueTokenIntrospector→UAA /oauth2/introspect) │ │ │──查菜单权限(Feign)──────►system-center(内网) │ │ │◄──允许/拒绝────────────────│ │ │ │──转发请求(已鉴权)──────►下游微服务(内网隔离) │ │◄──业务响应─────────────│ │ │ ``` --- ## 四、模块结构说明 ``` central-platform/ ├── central-commons/ # 通用 Starter 层(横切关注点) │ ├── central-common-core/ # 基础工具:安全工具类、MyBatis Base Mapper、Jackson 配置 │ ├── central-common-spring-boot-starter/ # Web 通用配置 │ ├── central-db-spring-boot-starter/ # Druid + MyBatis-Plus 自动配置 │ ├── central-redis-spring-boot-starter/ # Redisson 自动配置 │ ├── central-log-spring-boot-starter/ # AOP 日志拦截、链路追踪、Feign/Dubbo 透传 │ ├── central-auth-client-spring-boot-starter/ # OAuth2 Resource Server 自动配置 │ ├── central-loadbalancer-spring-boot-starter/ # Feign + LoadBalancer + OKHttp 配置 │ ├── central-sentinel-spring-boot-starter/ # Sentinel Nacos 数据源 + Gateway 集成 │ ├── central-elasticsearch-spring-boot-starter/ # ES 9.x Java Client(`co.elastic.clients:elasticsearch-java`) │ ├── central-oss-spring-boot-starter/ # 对象存储抽象(S3/other 策略模式) │ ├── central-zookeeper-spring-boot-starter/ # Curator ZooKeeper 连接管理 │ └── central-rabbitmq-spring-boot-starter/ # RabbitMQ 企业级 Starter(DLX 重试、幂等消费、延迟消息) │ ├── central-uaa/ # OAuth2 授权服务器 [:8000] │ ├── central-gateway/ │ └── sc-gateway/ # Spring Cloud Gateway [:9900] │ ├── central-sse/ # SSE 推送服务 [:9300](WebFlux + RabbitMQ 事件驱动) │ ├── central-business/ # 业务服务层 │ ├── system-center/ # 系统管理中心 [:7000](用户/角色/菜单/部门/字典) │ ├── file-center/ # 文件管理中心 [:5000](S3/other 上传下载) │ └── search-center/ # 搜索中心( ES 9.x) │ ├── search-client/ # Feign SDK(供其他模块引用) │ └── search-server/ # ES 搜索服务 [:7100] │ ├── central-monitor/ # 监控层 │ ├── sc-admin/ # Spring Boot Admin [:6500] │ └── log-center/ # 日志中心 [:7200](ES 9.x) │ └── central-config/ # Nacos 配置集成入口 ``` | 模块 | 端口 | 数据库 | 职责 | |------|------|--------|-------------------------------| | sc-gateway | 9900 | 无 | 路由转发、Opaque Token 鉴权、权限鉴定、限流 | | central-sse | 9300 | 无 | SSE 推送服务,通知消息实时推送(WebFlux + RabbitMQ) | | central-uaa | 8000 | oauth-center | OAuth2/OIDC 授权服务器,Token 颁发与校验 | | system-center | 7000 | system-center | 用户、角色、菜单、权限、部门、字典管理 | | file-center | 5000 | file-center | 文件上传/下载,S3/other 双后端 | | search-server | 7100 | Elasticsearch | 全文搜索、聚合查询、索引管理(ES 9.x) | | log-center | 7200 | Elasticsearch | 操作日志收集、慢 SQL 日志、请求统计(ES 9.x) | | sc-admin | 6500 | 无 | 应用实例健康监控(JVM/线程/内存) | ### 公共 Starter 一览(12 个) | Starter | 配置前缀 | 说明 | |---------|----------|------| | central-common-core | - | 基础工具类、统一响应体 `Result`、实体基类 | | central-common-spring-boot-starter | - | Web 通用配置 | | central-db-spring-boot-starter | `central.db` | Druid + MyBatis-Plus 自动配置、多租户隔离 | | central-redis-spring-boot-starter | `central.redis` | Redisson 分布式锁 + Spring Cache + Lua 限流 | | central-log-spring-boot-starter | `central.log` | AOP 日志拦截、链路追踪、审计日志 | | central-auth-client-spring-boot-starter | `central.security.auth` | OAuth2 资源服务器客户端(Opaque Token 本地内省) | | central-loadbalancer-spring-boot-starter | `central.loadbalancer` | Feign + LoadBalancer + OKHttp 配置 | | central-sentinel-spring-boot-starter | `central.sentinel` | Sentinel Nacos 数据源 + Gateway 集成(⚠待重构) | | central-elasticsearch-spring-boot-starter | `central.elasticsearch` | ES 9.x Java Client,注解驱动映射、Lambda 查询构造器 | | central-oss-spring-boot-starter | `central.oss` | 对象存储抽象(S3/other 策略模式) | | central-zookeeper-spring-boot-starter | `central.zookeeper` | Curator ZooKeeper 连接管理 | | central-rabbitmq-spring-boot-starter | `central.rabbitmq` | RabbitMQ DLX 重试、幂等消费、延迟消息、链路追踪 | --- ## 五、核心功能拆解 ### 5.1 认证与授权(central-uaa) **认证模式**(扩展 Spring Authorization Server): | 模式 | Converter | Provider | 说明 | |------|-----------|----------|------| | 密码模式 | `PasswordAuthenticationConverter` | `PasswordAuthenticationProvider` | 用户名+密码 | | 密码+验证码 | `PasswordCodeAuthenticationConverter` | `PasswordCodeAuthenticationProvider` | MFA 场景 | | OpenID Connect | `OpenIdAuthenticationConverter` | `OpenIdAuthenticationProvider` | OIDC 隐式流 | | 手机号 | `MobileAuthenticationConverter` | `MobileAuthenticationProvider` | 手机验证码登录 | **Token 特性**: - 类型:**Opaque Token**(不透明令牌/引用令牌,非 JWT 自包含令牌),由网关通过 `OpaqueTokenIntrospector` 调用 UAA 内省端点(`/oauth2/introspect`)验证 - 鉴权边界:**仅在 sc-gateway 层完成 Token 验证**,内部微服务处于网络隔离状态,不直接对外暴露 - 分布式 Session:`RedisSecurityContextRepository`(Cookie: `OAUTH2SESSION`) - 支持 Token 自动续签(Gateway 层拦截器处理) - 单点登录:同账号互踢(强制下线已有 Session) ### 5.2 API 网关(sc-gateway) **Gateway 处理链**: ``` 请求入口(唯一对外暴露) ↓ 全局 Filter(RequestId 注入 / TraceId 透传) ↓ Opaque Token 鉴权(OpaqueTokenIntrospector 调用 UAA 内省端点,内部服务无需再验证) ↓ PermissionAuthManager(调用 system-center Feign 查菜单权限) ↓ Sentinel 限流(Nacos 动态规则 {appName}-sentinel-gw-flow) ↓ 路由匹配(静态 YAML + Nacos 动态路由) ↓ StripPrefix Filter → 下游微服务(内网隔离) ``` **路由规则**: | 前缀 | 目标服务 | Filter | |------|----------|--------| | `/oauth2/**` | uaa-server | PreserveHostHeader | | `/api-uaa/**` | uaa-server | StripPrefix=1, PreserveHostHeader | | `/api-system/**` | system-center | StripPrefix=1 | | `/api-file/**` | file-center | StripPrefix=1 | | `/api-log/**` | log-center | StripPrefix=1 | | `/api-search/**` | search-center | StripPrefix=1 | | `/api-sse/**` | central-sse | StripPrefix=1 | **免鉴权白名单**(代码中配置): ``` /oauth2/** /api-uaa/validate/** /api-uaa/tokens/key /api-uaa/css/**、/images/**、/js/** /*/v3/api-docs/**(接口文档) /api-system/language/findLanguageForWeb ``` ### 5.3 权限模型(system-center) ``` User (sys_user) └─► UserRole (sys_user_role) └─► Role (sys_role) └─► RoleMenu (sys_role_menu) └─► Menu (sys_menu) ──► URL 路径 + 请求方式 ``` - 网关通过 `PermissionAuthManager` 调用 `GET /menus/{roleCodes}` 获取当前用户可访问 URL 列表 - 菜单权限缓存:Redis,TTL 300s(菜单)/ 1800s(用户信息) - URL 权限校验开关:`central.security.auth.urlPermission.enable`(默认 false) ### 5.4 统一日志(log-center + central-log-starter) - 请求/响应日志通过 AOP(`central-log-starter`)在各服务本地采集 - 日志目标写入 Elasticsearch(索引规划:`sys-log-*`、`audit-log-*`、`mysql-slowlog-*`) - `log-center` 提供查询接口,依赖 `search-client` Feign SDK 查询 ES - 跨线程日志上下文:Transmittable ThreadLocal 保证 async 任务继承 TraceId ### 5.5 搜索服务(search-center) - `search-server`:封装 ES 客户端,支持通用查询/聚合/索引管理 - `search-client`:Feign 客户端 SDK,其他模块直接引入 Maven 依赖即可调用 - 降级策略:`SearchServiceFallbackFactory` 返回空 PageResult ### 5.6 文件服务(file-center) - 抽象接口 `IFileService`(策略模式) - S3 实现:`S3Service`(支持 MinIO / 阿里云 OSS / AWS S3) - 限制:单文件 10MB,单次请求 20MB,缓冲阈值 512KB - 异步上传:`AsyncTaskExecutor` 线程池 ### 5.7 消息队列(central-rabbitmq-spring-boot-starter) **核心特性**: | 特性 | 说明 | |------|------| | DLX 原生重试 | 基于 RabbitMQ Dead Letter Exchange 的 Broker 级重试,无需客户端轮询 | | 幂等消费 | Redis 状态机实现,消费前检查消息 ID,防止重复消费 | | 自动拓扑声明 | 启动时自动创建 Exchange、Queue、Binding,无需手动配置 | | 延迟消息 | 支持 `rabbitmq_delayed_message_exchange` 插件 | | DLQ 监控 | 死信队列消息自动记录,便于问题排查 | | 链路追踪 | 消息 Header 自动注入 TraceId、租户 ID 等上下文 | | 生产者确认 | Publisher Confirm 机制,确保消息到达 Broker | | 健康检查 | Spring Actuator 集成,监控连接和通道状态 | **配置示例**: ```yaml central: rabbitmq: exchange: central.mq.exchange # 默认交换机 routing-key: central.mq.routing.key # 默认路由键 retry: max-attempts: 3 # 最大重试次数 initial-interval: 1000 # 初始重试间隔(ms) multiplier: 2.0 # 间隔倍数 idempotent: enable: true # 启用幂等消费 ttl: 86400 # 幂等记录 TTL(秒) ``` **核心类**: - `MessagePublisher`:消息生产者,支持同步/异步发送、延迟消息 - `AbstractMessageListener`:消息消费者基类,子类实现 `onMessage()` 即可 - `MessageIdempotentService`:幂等消费服务,基于 Redis 状态机 **依赖关系**: - 依赖:central-common-core, spring-boot-starter-amqp - 被依赖:central-sse ### 5.8 SSE 实时推送(central-sse) **核心特性**: | 特性 | 说明 | |------|------| | WebFlux SSE | 基于 Spring WebFlux 的响应式 SSE 实现 | | 多端连接 | 每用户最多 5 个并发连接(不同设备/浏览器) | | RabbitMQ 通知监听 | 监听通知队列,自动路由到对应用户的 SSE 连接 | | 网关认证 | 通过网关 Header 透传用户信息(x-user-id),无本地认证逻辑 | | 心跳保活 | 每 15 秒发送心跳事件,防止连接超时断开 | | 空闲清理 | 90 秒无活动自动关闭连接,释放资源 | | 背压缓冲 | 每个连接最多缓冲 100 条事件,防止内存溢出 | | 优雅关闭 | 服务关闭时通知所有客户端重连 | **事件类型**: | 事件 | 说明 | |------|------| | `connected` | 连接建立成功 | | `task-completed` | 任务完成通知 | | `task-failed` | 任务失败通知 | | `device-status-changed` | 设备状态变更通知 | **配置示例**: ```yaml server: port: 9300 central: rabbitmq: exchange: central.notify.exchange queues: system-notify-events: main: system-notify.events.main retry: system-notify.events.retry dlq: system-notify.events.dlq routingKey: system-notify.# device-notify-events: main: device-notify.events.main retry: device-notify.events.retry dlq: device-notify.events.dlq routingKey: device-notify.# sse: heartbeat-interval-ms: 15000 cleanup-interval-ms: 60000 system-notify: max-connections-per-user: 5 backpressure-buffer-size: 500 idle-timeout-ms: 300000 device-notify: max-connections-per-user: 10 idle-timeout-ms: 60000 ``` **依赖关系**: - 依赖:central-config, central-log-spring-boot-starter, central-common-spring-boot-starter, central-rabbitmq-spring-boot-starter, spring-boot-starter-webflux, spring-cloud-starter-alibaba-nacos-discovery **路由**:网关 `/api-sse/**` → central-sse ### 5.9 搜索引擎(central-elasticsearch-spring-boot-starter) **核心特性**: | 特性 | 说明 | |------|------| | 注解驱动映射 | `@EsIndex` 定义索引名、分片数;`@EsField` 定义字段类型;`@EsId` 标记主键 | | 自动建索引 | 应用启动时自动检测并创建缺失索引 | | Lambda 查询构造器 | `LambdaEsQueryWrapper` 支持类型安全的链式查询构建 | | 模板化 CRUD | `EsTemplate` 提供 save/update/delete/search 等标准操作 | | Basic Auth | 支持 Elasticsearch 安全认证 | | 多节点支持 | 支持配置多个 ES 节点,自动负载均衡 | **配置示例**: ```yaml central: elasticsearch: nodes: - host: 127.0.0.1 port: 9200 username: elastic password: ${ES_PASSWORD} connect-timeout: 5000 socket-timeout: 60000 ``` **核心类**: - `EsTemplate`:ES 操作模板,封装 CRUD、批量操作、聚合查询 - `LambdaEsQueryWrapper`:Lambda 查询构造器,支持链式调用 - `EsIndexManager`:索引管理器,负责索引创建、映射更新 **依赖关系**: - 依赖:central-common-core, co.elastic.clients:elasticsearch-java:9.2.6 - 被依赖:search-center/search-server, log-center --- ## 六、项目启动方式 ### 6.1 依赖组件 启动前确保以下中间件已运行: | 组件 | 版本要求 | 默认端口 | 说明 | |------|------|----------|------| | MySQL | 8.x | 3306 | 需初始化各模块 SQL 脚本 | | Nacos | 3.x | 8848 | 注册中心 + 配置中心 | | Redis | 8.x+ | 6379 | Session / 缓存 | | Elasticsearch | 9.x | 9200 | 日志 + 搜索 | | RabbitMQ | 4.x+ | 5672 | 消息队列(SSE 推送) | | MinIO(可选) | 最新版 | 9000 | 文件存储(或使用阿里云 OSS) | ### 6.2 数据库初始化 ``` sql/ ├── oauth-center.sql # OAuth2 客户端、授权数据表 ├── system-center.sql # 用户、角色、菜单、部门等 ├── file-center.sql # 文件元数据表 └── logger-center.sql # 审计日志表(如独立部署) ``` ### 6.3 Nacos 配置导入 将 `central-config/` 下各模块配置导入 Nacos,或直接在各模块 `application-dev.properties` 中覆盖。 ### 6.4 启动顺序 ``` 1. Nacos(central-register 或独立部署) 2. central-uaa # 认证服务必须最先启动 3. system-center # 网关权限检查依赖此服务 4. sc-gateway # 统一入口 5. file-center / search-server / log-center # 业务服务 6. central-sse # SSE 长连接网关(依赖 RabbitMQ) 7. sc-admin # 最后启动监控 ``` ### 6.5 构建命令 & Docker 构建(可选) ```bash # 全量构建(跳过测试) mvn clean package -Dmaven.test.skip=true # 全量构建(含测试) mvn clean install # 单模块构建 mvn clean package -Dmaven.test.skip=true -pl central-uaa mvn clean package -Dmaven.test.skip=true -pl central-gateway/sc-gateway # 版本号变更 mvn versions:set -DnewVersion= && mvn versions:commit # Docker 镜像构建(各模块目录下执行) mvn clean package -pl central-uaa spring-boot:build-image # 运行docker容器 docker run -d -p 8080:8080 \ --name central-uaa \ kicksharkie/central-platform/central-uaa # Docker 镜像构建(构建整个项目(所有模块)) mvn clean package spring-boot:build-image # 注意:Docker 镜像构建采用 Spring Boot 3 + Cloud Native Buildpacks 构建 Docker 镜像,替代传统: ❌ Dockerfile ❌ Spotify docker-maven-plugin 实现: ✅ 无需 Dockerfile ✅ 自动分层镜像(Layered) ✅ JVM 容器优化 ✅ 更高构建效率与缓存利用率 ✅ 官方支持,长期可维护 #注意:需要本地有docker环境, 如 Docker Desktop ``` ## 七、关键配置说明 ### 7.1 数据源配置(各模块共用模板) ```properties # 通过 Nacos 配置中心统一管理,以下为本地 Dev 覆盖示例 central.datasource.ip=127.0.0.1 spring.datasource.url=jdbc:mysql://${central.datasource.ip}:3306/{module-db}?useUnicode=true&characterEncoding=UTF-8 # Druid 连接池 spring.datasource.druid.initial-size=10 spring.datasource.druid.max-active=500 spring.datasource.druid.min-idle=10 spring.datasource.druid.max-wait=60000 spring.datasource.druid.validation-query=SELECT 1 ``` ### 7.2 认证服务关键配置(central-uaa) ```properties # OAuth2 客户端注册存储:MySQL + Redis 缓存 # Opaque Token 内省端点:/oauth2/introspect(网关通过此端点验证令牌有效性及关联信息) # Token 存储:Redis(令牌与用户信息映射关系,由 UAA 维护) # Session Cookie server.servlet.session.cookie.name=OAUTH2SESSION # Token 自动续签(Gateway 侧配置) central.security.auth.tokenRenew.enable=true central.security.auth.tokenRenew.clientIds=webApp ``` ### 7.3 网关安全配置(sc-gateway) ```properties # URL 权限校验开关(默认关闭,开启后通过菜单 URL 校验权限) central.security.auth.urlPermission.enable=false central.security.auth.urlPermission.ignoreUrls=/api-system/menus/current,... # 动态路由(Nacos 数据源) central.gateway.dynamicRoute.enabled=false central.gateway.dynamicRoute.dataType=nacos ``` ### 7.4 Sentinel 配置 ```properties # Dashboard 地址 spring.cloud.sentinel.transport.dashboard=127.0.0.1:8080 spring.cloud.sentinel.eager=true # Nacos 数据源(流控规则) # 配置 ID:{spring.application.name}-sentinel-gw-flow ``` ### 7.5 MyBatis-Plus 公共策略 ```properties # 逻辑删除:deleted=1 已删除,deleted=0 正常 mybatis-plus.global-config.db-config.logic-delete-value=1 mybatis-plus.global-config.db-config.logic-not-delete-value=0 # 字段更新策略:仅更新非 null 字段 mybatis-plus.global-config.db-config.update-strategy=NOT_NULL ``` ### 7.6 RabbitMQ 配置 ```properties # 连接配置 spring.rabbitmq.host=127.0.0.1 spring.rabbitmq.port=5672 spring.rabbitmq.username=guest spring.rabbitmq.password=guest # 生产者确认 spring.rabbitmq.publisher-confirm-type=correlated spring.rabbitmq.publisher-returns=true # 消费者配置 spring.rabbitmq.listener.simple.acknowledge-mode=manual spring.rabbitmq.listener.simple.prefetch=10 ``` --- ## 八、服务间通信 ### 8.1 同步调用(OpenFeign) | 调用方 | 被调用方 | 接口 | 用途 | |--------|----------|------|------| | sc-gateway | system-center | `GET /menus/{roleCodes}` | 网关权限校验 | | system-center | search-center | `POST /search/{indexName}` | 系统内搜索 | | log-center | search-center | `POST /search/{indexName}` | 日志查询 | **Feign 公共配置**(`central-loadbalancer-starter`): ```yaml feign: httpclient: enabled: false okhttp: enabled: true # 使用 OKHttp compression: request.enabled: true response.enabled: true request.min-request-size: 2048 client: config: default: connect-timeout: 30000 read-timeout: 30000 ``` ### 8.2 异步调用(RabbitMQ) | 生产方 | 消费方 | Exchange | Routing Key | 用途 | |--------|--------|----------|-------------|------| | 业务服务 | central-sse | `central.notify.exchange` | `system-notify.#` | 消息通知事件 | | 设备服务 | central-sse | `central.notify.exchange` | `device-notify.#` | 设备状态事件 | **事件推送流程**: 1. 业务服务通过 `MessagePublisher` 发布通知事件 2. RabbitMQ 将事件路由到订阅队列 3. central-sse 消费事件,查找用户 SSE 连接,实时推送 4. 客户端通过 SSE 连接接收通知消息 ### 8.3 SSE 事件推送流程 ``` ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │ 业务服务 │ │ RabbitMQ │ │ central-sse │ │ 客户端 │ │ │ │ │ │ │ │ (Browser) │ └──────┬───────┘ └──────┬───────┘ └──────┬───────┘ └──────┬───────┘ │ │ │ │ │ 1.发布通知事件 │ │ │ │───────────────────►│ │ │ │ │ 2.路由到队列 │ │ │ │───────────────────►│ │ │ │ │ 3.查找用户连接 │ │ │ │───────────────────►│ │ │ │ 4.发送SSE事件 │ │ │ │───────────────────►│ │ │ │ │ ``` ### 8.4 服务发现 - 注册中心:Nacos(`spring.cloud.nacos.discovery.enabled=true`) - 负载均衡:Spring Cloud LoadBalancer(客户端),Caffeine 实例列表缓存 - 服务 ID 小写:`spring.cloud.gateway.discovery.locator.lower-case-service-id=true` ### 8.5 降级策略 | Feign Client | Fallback | 降级返回值 | |---|---|---| | `MenuService` | `MenuServiceFallbackFactory` | 空列表(`Collections.emptyList()`) | | `SearchService` | `SearchServiceFallbackFactory` | 空 `PageResult` | | `AggregationService` | `AggregationServiceFallbackFactory` | 空聚合结果 | ### 8.6 链路上下文传播 - `Transmittable ThreadLocal`:跨线程(线程池、@Async)传递 TraceId、租户等上下文 - Feign 拦截器:`RequestHeaderInterceptor` 将上下文注入 HTTP Header 传递至下游 - RabbitMQ:消息 Header 自动注入 TraceId,消费端自动恢复上下文 --- ## 九、安全机制分析 ### 9.1 纵深防御体系 ``` Layer 1: TLS/HTTPS(Nginx 或 Gateway 终止) Layer 2: Gateway Opaque Token 鉴权(OpaqueTokenIntrospector 调用 UAA /oauth2/introspect,唯一对外入口) Layer 3: Gateway 权限校验(URL 级别,基于菜单权限) Layer 4: 内网隔离(微服务不对外暴露,仅接受来自 Gateway 的内部流量) Layer 5: 方法级鉴权(@PreAuthorize,可选) ``` > **设计说明**:Token 为 Opaque Token(不透明令牌/引用令牌,非 JWT 自包含令牌),所有鉴权逻辑集中在 Gateway 完成。内部微服务因处于网络隔离状态,不需要也不应该暴露在公网,无需进行二次 Token 验签。 ### 9.2 Opaque Token 设计(OpaqueTokenIntrospector) - **Token 类型**:Opaque Token(不透明令牌/引用令牌),令牌本身是无意义的随机字符串,不携带任何用户信息 - **验证机制**:网关使用 Spring Security `OpaqueTokenIntrospector`,向 UAA 内省端点(`POST /oauth2/introspect`)发请求,由 UAA 查询 Redis/DB 返回令牌关联的用户信息和权限 - **与 JWT 的区别**:JWT 可本地验签(自包含),Opaque Token 每次验证都需回调 UAA(中心化校验),但更易实现令牌即时撤销 - **鉴权位置**:**仅限 sc-gateway**,内部服务信任网关转发的请求 - **刷新令牌**:支持(配置 `OAuth2RefreshTokenGenerator`) - **Gateway 令牌续签**:拦截器检测过期时间阈值,自动请求刷新 ### 9.3 分布式 Session 安全 - Session 存储:Redis(`RedisSecurityContextRepository`) - Cookie 名称:`OAUTH2SESSION` - 单点登出:同账号登录时踢掉已有 Session(防重复登录) ### 9.4 安全注意事项(代码审查发现) 1. **sc-admin 默认凭据**:用户名 `admin`/密码 `admin`,生产必须修改 2. **Docker 镜像内存**:已采用 Cloud Native Buildpacks 的 `BP_JVM_HEAP_RATIO=75`(JVM 堆内存 = 容器内存限制的 75%),生产环境建议容器内存至少 512MB-2GB 3. **URL 权限校验默认关闭**:`urlPermission.enable=false`,建议生产开启 4. **Opaque Token 内省端点安全**:网关调用 UAA 内省端点所用的客户端凭据(client-id/client-secret)建议通过安全渠道(Nacos 加密配置 / Vault)管理,避免明文存储 --- ## 十、存在的问题与优化建议 ### 10.1 架构层面 | 问题 | 现状 | 建议 | |------|------|------| | 无分布式事务 | 跨服务写操作无 Saga/TCC 保障 | 涉及多服务数据一致性场景需引入 Seata | | Gateway 单点 | 未见 Gateway 集群配置示例 | 生产需多实例 + Nginx 前置,避免单点故障 | ### 10.2 性能层面 | 问题 | 说明 | 建议 | |------|------|------| | 权限校验 N+1 | 每次请求都 Feign 调用 system-center 查菜单 | 网关侧增加菜单权限本地缓存(Caffeine),TTL 30-60s | | 连接池偏大 | Druid maxActive=500,OKHttp 全局 1000 连接 | 根据实际 QPS 调整,避免资源浪费 | | Docker 内存配置 | 已采用 CNB `BP_JVM_HEAP_RATIO=75`,堆内存自适应容器限制 | 生产容器内存建议 512MB-2GB,CNB 自动启用 `-XX:+UseContainerSupport` | ### 10.3 工程化层面 | 问题 | 说明 | 建议 | |------|------|------| | 配置凭据安全 | 数据库密码、Redis 密码通过 Nacos 明文存储 | 集成 Spring Cloud Vault 或加密配置(Jasypt) | | 缺少 CI/CD 配置 | 无 `.github/workflows` 或 Jenkinsfile | 补充流水线,自动化测试 + 镜像构建 | | 缺少单元测试 | 代码中未见测试用例 | 对 Service 层和安全逻辑补充单元测试 | | 日志索引无生命周期 | ES 日志索引无 ILM 策略 | 配置 Index Lifecycle Management,避免磁盘无限增长 | --- ## 十一、项目亮点总结 ### 架构亮点 1. **完整 OAuth2/OIDC 实现**:基于最新 Spring Authorization Server 1.5.5,支持 4 种认证流程,采用 Opaque Token(不透明令牌/引用令牌)+ Redis 分布式 Session,令牌即时撤销能力强,是学习 OAuth2 实战的高质量参考。 2. **12 个可插拔 Starter**:将数据库、缓存、日志、认证、搜索、对象存储、消息队列等横切关注点封装为独立 Starter,新业务模块引入即用,遵循 Spring Boot 自动配置最佳实践。 3. **响应式网关 + 声明式权限**:sc-gateway 基于 WebFlux,`PermissionAuthManager` 以响应式方式集成 Feign 权限查询,在不阻塞 Netty 线程的前提下实现细粒度鉴权。 4. **策略模式对象存储**:`IFileService` 抽象 + `S3Service`/`ohterService` 双实现,切换存储后端无需修改业务代码,扩展性佳。 5. **Nacos 全面集成**:注册发现、配置中心、Sentinel 流控规则、Gateway 动态路由全部对接 Nacos,运维变更无需重启服务。 6. **Knife4j 网关聚合文档**:所有微服务 API 文档统一通过网关聚合展示,开发联调体验友好。 7. **企业级消息队列**:central-rabbitmq-starter 封装 DLX 原生重试、幂等消费、延迟消息、链路追踪等企业级特性,开箱即用,无需手动配置拓扑。 8. **SSE 实时推送**:central-sse 基于 WebFlux 响应式编程,通过 RabbitMQ 事件驱动实现通知消息实时推送到客户端,支持多端连接、心跳保活、背压缓冲等生产级特性。 ### 技术选型亮点 - 使用当前最新稳定版本(Spring Boot 3.5、Spring Cloud 2025),技术栈前沿 - 引入 Redisson(而非 Spring Data Redis)处理分布式场景,功能更丰富 - Feign + OKHttp + 连接池 + 压缩,HTTP 客户端调优完整 - Transmittable ThreadLocal 解决异步链路上下文丢失问题,细节到位 - RabbitMQ + DLX 重试机制,避免了传统客户端轮询重试的复杂性 - WebFlux SSE 替代传统轮询,实现真正的服务端推送,降低网络开销 --- ## 十二、端口速查 | 服务 | 端口 | |------|------| | Nacos | 8848 | | uaa-server(认证) | 8000 | | sc-gateway(网关) | 9900 | | central-sse(SSE 网关) | 9300 | | system-center | 7000 | | file-center | 5000 | | search-server | 7100 | | log-center | 7200 | | sc-admin | 6500 | --- ## 许可证 [Apache License 2.0](./LICENSE)