# ypbin-starter
**Repository Path**: wenbin1001/ypbin-starter
## Basic Information
- **Project Name**: ypbin-starter
- **Description**: 企业级 Spring Boot 3 框架库——统一响应、鉴权、缓存、多租户、数据权限、日志审计与可观测,单体与微服务同源,约定优于配置。
- **Primary Language**: Java
- **License**: Apache-2.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2026-08-28
- **Last Updated**: 2026-08-28
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# ypbin-starter
**为企业级 Spring Boot 应用打造的系统级基建**
让业务团队从第一行代码起就站在生产就绪的地基上 · 单体与微服务同源 · 约定优于配置 · 可覆盖可扩展
[](https://github.com/wenbin-wb/ypbin-starter/actions/workflows/ci.yml)
[](https://central.sonatype.com/artifact/cn.ypbin/ypbin-starter-bom)
[](https://www.apache.org/licenses/LICENSE-2.0)
[](https://www.oracle.com/java/)
[](https://spring.io/projects/spring-boot)
[快速开始](#快速开始) · [模块总览](#模块总览) · [业务系统如何对接](#业务系统如何对接) · [各模块使用文档](#各模块使用文档)
[完整文档:https://ypbin.cn/guide/starter/](https://ypbin.cn/guide/starter/)
---
## 简介
每个团队起新项目,都要把统一响应、鉴权、缓存、多租户、数据权限、日志审计、微服务治理这些东西重写一遍——同样的坑,不同的踩法。`ypbin-starter` 把这层「系统级基建」一次性做对、做透,沉淀成一组可独立引入的 Spring Boot Starter:**业务系统只写业务,基建交给 starter。**
它不是又一个把开源库简单包一层的脚手架。每一个模块的边界、每一个默认值、每一处扩展点的位置,都是在真实生产场景里权衡过的结果——安全默认优先于便利、扩展点优先于配置项、约定优先于文档。
- **一套架构,单体微服务同源**。基础层不依赖 Spring Cloud,单体直接用、微服务叠加治理层,对外契约完全一致,前端无感知。避免了「单体一套、微服务另起炉灶」的常见撕裂。
- **能力即插即拔,且随时可被接管**。所有能力 Bean 一律 `@ConditionalOnMissingBean` + `@ConditionalOnProperty`——你定义同类型 Bean 就覆盖默认实现,改一行配置就关停整个模块。starter 定义抽象与默认行为,业务方按需注入自己的实现,不改 starter 一行源码。
- **难做对的地方,替你做对了**。缓存击穿/穿透/雪崩三重防护、序列化期零 N+1 的引用翻译、异步线程的上下文透传、密码错误锁定的 TTL 竞态、接口签名的时钟偏移与重放窗口——这些容易埋雷的细节都已内建并经过对抗性审查。
## 设计取舍
> 好的框架不在于它做了什么,而在于它拒绝做什么。以下是几个关键决策及其理由。
- **认证选 Sa-Token,而非自研 JWT 或 Spring Security。** 后台管理的诉求是「会话、踢人、续期、多端」,Spring Security 的过滤器链对此过重,自研 JWT 又要重造轮子。需要开放平台级 access+refresh 双令牌时才上 OAuth2,不为极少数场景绑架全局复杂度。
- **扩展点强制批量,从 API 层面消灭 N+1。** `@RefText` 的数据源接口一次收一组 ID、返回映射,业务方想写出 N+1 都难;列表翻译由切面在序列化前自动预加载,业务代码零改动。把正确的做法设成唯一的做法。
- **异常统一 HTTP 200 + 业务码。** 前后端交互中 HTTP 状态码语义混乱是常见摩擦源,本项目约定所有业务异常走 200、由 `R.code` 区分,前端只需一套拦截逻辑。这是明确的取舍,不是疏忽。
- **数据权限只拦标注方法,不做全局无差别切面。** 全局拦截会让定时任务、登录校验等内部查询悄悄丢数据;`@DataPermission` 显式开启,边界清晰、可预期。
- **starter 只给运行时与扩展点,不碰业务表。** 客户端管理、字典、在线用户、任务调度——表结构和页面归业务系统,starter 提供抽象和默认(读配置)实现。职责边界一刀切干净,升级 starter 不会动业务数据。
## 特性
- **分层架构**:基础层(core/json/web/data/cache/security 等)单体与微服务共用;扩展层(crud/tenant/datapermission)与微服务层(cloud-*)按需叠加。层间单向依赖,无循环。
- **约定优于配置**:统一 `ypbin.*` 配置前缀,自动装配,零配置即用;每个默认值都选生产安全的一侧。
- **可覆盖可扩展**:能力 Bean 全部 `@ConditionalOnMissingBean` 可覆盖、`@ConditionalOnProperty` 可开关;模块间仅通过扩展点接口解耦,不泄露实现。
- **安全内建**:生产环境自动关闭 API 文档、网关身份头清洗防伪造、密码复杂度/错误锁定/有效期策略、XSS 过滤、字段加密、数据脱敏、接口签名防重放。
- **性能内建**:多级缓存(L1 Caffeine + L2 Redis + Pub/Sub 失效广播)、缓存三重防护、序列化期零 N+1 翻译、日志异步落库、限流/幂等 Redis+Lua 原子实现。
- **微服务就绪**:Feign 请求头透传与 R 错误解码、CircuitBreaker 默认开启、版本灰度负载均衡、Nacos 注册/配置/动态路由、Gateway 横切、Sentinel 被调方保护、requestId 全链路贯穿。
- **工程治理**:`${revision}` + flatten 统一版本,对外 BOM 一键导入;spotless 强制代码风格与 license 头;已发布 Maven Central,遵循语义化版本。
## 技术栈
| 项 | 版本 |
|---|---|
| JDK | 21 |
| Spring Boot | 4.1.0 |
| 认证 | Sa-Token 1.45.0 |
| ORM | MyBatis-Plus 3.5.17 |
| 缓存 | Redis(Spring Data Redis) |
| 对象存储 | AWS SDK v2(S3 兼容) |
| API 文档 | SpringDoc OpenAPI 3.1.0 |
| Excel | FastExcel 1.3.0 |
| 验证码 | tianai-captcha 1.5.5(滑块/旋转/点选/拼接) |
| 加解密 | AES-GCM / 国密 SM2·SM4(BouncyCastle 1.85) |
| 邮件 | Spring Mail(配置可动态化) |
| 微服务 | Spring Cloud 2025.1.2 + Gateway / OpenFeign / LoadBalancer |
| 注册配置 | Nacos(spring-cloud-alibaba 2025.1.0.0) |
| 熔断降级 | Resilience4j |
| 网关 | Spring Cloud Gateway(WebFlux) |
## 快速开始
### 1. 引入 BOM 统一版本
在你的项目 `pom.xml` 的 `dependencyManagement` 中导入:
```xml
cn.ypbin
ypbin-starter-bom
1.3.0
pom
import
```
### 2. 按需引入模块(无需再写版本号)
```xml
cn.ypbin
ypbin-starter-web
cn.ypbin
ypbin-starter-data
cn.ypbin
ypbin-starter-cloud-gateway
cn.ypbin
ypbin-starter-cloud-nacos
cn.ypbin
ypbin-starter-cloud-core
```
引入即自动装配,无需额外注解。
## 模块总览
| 模块 | artifactId | 职责 | 配置前缀 |
|---|---|---|---|
| 核心 | `ypbin-starter-core` | 统一响应 R、异常体系、通用枚举、SpringUtils、上下文透传、树形工具 | — |
| JSON | `ypbin-starter-json` | Jackson 统一序列化(时间格式、大数字转字符串)、`@Sensitive` 脱敏 | `ypbin.json` |
| Web | `ypbin-starter-web` | 全局异常处理、CORS、404 统一 JSON、XSS 过滤、可重复读请求 | `ypbin.web` |
| 数据 | `ypbin-starter-data` | MyBatis-Plus 增强、`BaseEntity`(主键/审计/状态/逻辑删除)、拦截器编排、字段加密、雪花 ID | `ypbin.data` |
| 缓存 | `ypbin-starter-cache` | Redis 缓存 + `getOrLoad` 防击穿/穿透/雪崩 + 多级缓存(L1 Caffeine + L2 Redis,跨实例失效广播) | `ypbin.cache` |
| 安全 | `ypbin-starter-security` | Sa-Token 封装(全局登录拦截、当前用户门面、权限数据源扩展点)、登录客户端策略、密码编码器与密码策略(复杂度/错误锁定) | `ypbin.security` |
| API 文档 | `ypbin-starter-api-doc` | SpringDoc OpenAPI 元信息配置 | `ypbin.api-doc` |
| 存储 | `ypbin-starter-storage` | 本地 + S3 兼容对象存储,多源路由 | `ypbin.storage` |
| 日志 | `ypbin-starter-log` | `@Log` 操作日志 AOP + 全量访问日志切面 | `ypbin.log` |
| 工具 | `ypbin-starter-tools` | 分布式限流 `@RateLimit`、幂等 `@Idempotent`、分布式锁 `@DistributedLock`、AES/国密加解密 | `ypbin.tools` |
| 异步 | `ypbin-starter-async` | 统一线程池、`@Async` 接管、异步异常处理、上下文透传、`AsyncUtils` 静态工具 | `ypbin.async` |
| 定时任务 | `ypbin-starter-job` | 动态调度(注册/启停/改 cron/立即执行)、分布式锁多实例防重、执行监听落库扩展点 | `ypbin.job` |
| Excel | `ypbin-starter-excel` | 基于 FastExcel 的注解驱动导入导出 | — |
| 验证码 | `ypbin-starter-captcha` | 行为验证码(滑块/旋转/点选/拼接) | `ypbin.captcha` |
| 消息 | `ypbin-starter-messaging` | 邮件(SMTP 配置可动态化/后台配置)、WebSocket(STOMP)、SSE + 统一推送门面 `PushService`、MQTT(Paho) | `ypbin.mail` / `ypbin.websocket` / `ypbin.sse` / `ypbin.mqtt` |
| 敏感词 | `ypbin-starter-sensitive-words` | Hutool DFA 敏感词检测/替换,可插拔词库 | `ypbin.sensitive-words` |
| 国际化 | `ypbin-starter-i18n` | Spring MessageSource 多语言,参数/头解析 Locale | `ypbin.i18n` |
| 接口加解密 | `ypbin-starter-api-crypto` | `@ApiEncrypt` 请求解密/响应加密(Advice) | `ypbin.api-crypto` |
| 接口签名 | `ypbin-starter-sign` | `@ApiSign` 四件套验签(AK/SK)、防重放、应用启停/过期、MD5/HMAC 可配 | `ypbin.sign` |
| 第三方登录 | `ypbin-starter-social` | JustAuth OAuth 登录,按平台可插拔 | `ypbin.social` |
| 多租户 | `ypbin-starter-extension-tenant` | 行级租户隔离、`@TenantIgnore` 跨租户逃逸 | `ypbin.tenant` |
| CRUD | `ypbin-starter-extension-crud` | 通用控制器/服务基类,防 Over-Posting | — |
| 数据权限 | `ypbin-starter-extension-datapermission` | 行级数据范围过滤、`@DataPermission` 门控 | `ypbin.data-permission` |
| Feign | `ypbin-starter-cloud-core` | OpenFeign 请求头透传、错误解码、熔断兜底 | `ypbin.cloud.feign` |
| Nacos | `ypbin-starter-cloud-nacos` | Nacos 注册发现 + 配置中心 + LoadBalancer 聚合 + ConfigData 启动兜底 | `ypbin.cloud.nacos` |
| 负载均衡 | `ypbin-starter-cloud-loadbalancer` | 版本灰度路由、优先 IP、权重随机、Nacos metadata | `ypbin.cloud.loadbalancer` |
| 可观测性 | `ypbin-starter-cloud-observability` | X-Request-Id 与 MDC 关联、Micrometer Tracing 门面(OTLP 可选) | `ypbin.observability` |
| 流量防护 | `ypbin-starter-cloud-sentinel` | Sentinel Web/网关限流、被拒统一 R 响应、Nacos 规则热更新 | `ypbin.cloud.sentinel` |
| 网关 | `ypbin-starter-cloud-gateway` | Spring Cloud Gateway 横切(CORS/异常/鉴权/文档聚合/动态路由) | `ypbin.gateway` |
| 单体聚合 | `ypbin-starter-app-web` | 一次引入单体 Web 常用基础能力(web/json/data/cache/security/api-doc/log/tools) | — |
| 微服务聚合 | `ypbin-starter-app-cloud` | 在 app-web 基础上叠加微服务能力(cloud-core/nacos/loadbalancer/observability/sentinel) | — |
详细用法见 [各模块使用文档](#各模块使用文档)。
## 业务系统如何对接
业务系统(如后台管理)只做业务功能,系统级能力用本 starter 已有的、或实现其**扩展点接口**(Provider)即可,不必重造。核心扩展点:
| 扩展点 | 模块 | 是否必须 | 作用 |
|---|---|---|---|
| `PermissionProvider` | security | 必须 | 提供用户权限码/角色码,接通 Sa-Token 注解鉴权 |
| `TenantProvider` | extension-tenant | 启用多租户时必须 | 提供当前租户 ID |
| `DataScopeHandler` | extension-datapermission | 启用数据权限时必须 | 提供数据范围 SQL |
| `DictProvider` | json | 可选 | 字典数据源,配 `@DictText` 自动翻译 |
| `RefTextProvider` | json | 可选 | 引用翻译数据源(ID→名称),配 `@RefText` |
| `LoginClientProvider` / `PasswordPolicyProvider` | security | 可选 | 登录客户端 / 密码策略从数据库动态配置 |
| `MailConfigProvider` / `StorageConfigProvider` / `SignAppProvider` | messaging/storage/sign | 可选 | 邮件/存储/开放应用配置后台动态化 |
| `SensitiveWordProvider` / `AuthRequestProvider` / `GatewayAuthProvider` | sensitive-words/social/gateway | 可选 | 词库 / OAuth 平台 / 网关鉴权 |
| `JobHandler`(+`@YpbinJob`) / `JobExecutionListener` | job | 可选 | 定时任务执行体 / 执行日志落库 |
| `IpLocationResolver` | log | 可选 | 操作日志 IP 归属地解析(接 ip2region 等) |
除「必须」项外均有默认实现(多为读配置文件),想接数据库/后台配置时才覆盖。所有能力 Bean 均 `@ConditionalOnMissingBean`,定义同类型 Bean 即覆盖。
> 完整的企业级落地范例见配套项目 **[ypbin-admin](https://github.com/wenbin-wb/ypbin-admin)**:基于本 starter 构建的后台管理系统,演示了 RBAC、字典、在线用户、任务调度等扩展点如何对接数据库与前端。
## 单体 vs 微服务
两套后端共用 L1 基础层,对外契约一致(详见 [CONTRACT.md](CONTRACT.md)),前端可复用同一套调用逻辑。
| | 单体应用 | 微服务应用 |
|---|---|---|
| 起步依赖 | `ypbin-starter-app-web` | 各业务服务引 `ypbin-starter-app-cloud` |
| 网关 | 无 | 独立部署,引 `ypbin-starter-cloud-gateway` |
| 鉴权 | 应用内 sa-token | 网关统一校验 + 内部身份头透传 |
| 对前端 | 契约一致 | 契约一致 |
聚合 starter 为纯依赖聚合,业务方仍可用 Maven `` 排除不需要的单个模块。网关不纳入 `app-cloud`,因为它是独立部署单元而非业务服务依赖。
## 各模块使用文档
各模块的详细配置项、API 与扩展点用法见 **[docs/MODULES.md](docs/MODULES.md)**。上面[模块总览](#模块总览)表可快速定位到对应章节。
## 版本与兼容性
| ypbin-starter | Spring Boot | Spring Cloud | JDK |
|---|---|---|---|
| 1.0.x | 3.5.x | 2025.0.x | 17+ |
| 1.4.x+ | 4.1.x | 2025.1.x | 21+ |
遵循[语义化版本](https://semver.org/lang/zh-CN/)。版本变更详见 [CHANGELOG.md](CHANGELOG.md)。
## 本地构建
```bash
# 编译并安装到本地仓库(verify 阶段自动执行代码风格校验)
mvn clean install
# 一键格式化代码(统一 license 头、import 顺序、去除多余空白)
mvn com.diffplug.spotless:spotless-maven-plugin:apply
```
发布到 Maven Central 的完整流程与版本迭代规范见 [RELEASING.md](RELEASING.md)。
## 许可证
基于 [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0) 开源,可自由用于商业项目。
Copyright © 2024-present wenbin