小哈书是一个仿小红书的社交内容平台后端项目,基于 Java 17、Spring Boot 3 和 Spring Cloud Alibaba 构建。项目采用 Maven 多模块与微服务架构,覆盖用户认证、笔记发布、评论互动、关注关系、计数、搜索、对象存储和数据对齐等核心场景。
本仓库主要用于微服务架构与高并发业务实践。当前仓库不包含前端项目、数据库初始化脚本和中间件编排文件,首次运行前需要自行准备基础设施并完成本地配置。
- 手机号验证码、账号密码登录与 Sa-Token 鉴权
- 用户资料、角色与权限管理
- 图文笔记发布、编辑、删除、置顶与可见性设置
- 笔记点赞、收藏及热点数据缓存
- 评论、子评论与评论点赞
- 用户关注、取关、粉丝和关注列表
- 用户、笔记、评论等维度的计数服务
- 基于 Elasticsearch 与 Canal 的搜索和数据同步
- 基于 MinIO / 阿里云 OSS 的对象存储
- 基于 Cassandra 的大文本 KV 存储
- 基于 Leaf / Snowflake 的分布式 ID 生成
- 基于 RocketMQ 的异步解耦与最终一致性处理
- 基于 XXL-JOB 的数据对齐任务
flowchart LR
Client[客户端] --> Gateway[Gateway :8000]
Gateway --> Auth[认证服务]
Gateway --> User[用户服务]
Gateway --> Note[笔记服务]
Gateway --> Relation[关系服务]
Gateway --> Comment[评论服务]
Auth --> User
User --> OSS[对象存储服务]
User --> ID[分布式 ID 服务]
Note --> KV[KV 服务]
Note --> Count[计数服务]
Note --> ID
Comment --> KV
Comment --> Count
User -. 事件 .-> MQ[(RocketMQ)]
Note -. 事件 .-> MQ
Relation -. 事件 .-> MQ
Comment -. 事件 .-> MQ
MQ --> Count
MQ --> Align[数据对齐服务]
Search[搜索服务] --> ES[(Elasticsearch)]
Canal[Canal] --> Search
Auth & User & Note & Relation & Comment & Count --> Redis[(Redis)]
User & Note & Relation & Comment & Count --> MySQL[(MySQL)]
KV --> Cassandra[(Cassandra)]
Auth & User & Note & Relation & Comment & Count & Search --> Nacos[(Nacos)]
| 分类 | 技术 |
|---|---|
| 基础框架 | Java 17、Spring Boot 3.0.2、Spring Cloud 2022.0.0 |
| 微服务 | Spring Cloud Alibaba 2022.0.0.0、Nacos、OpenFeign、Gateway、Sentinel |
| 认证鉴权 | Sa-Token 1.38.0 |
| 数据访问 | MyBatis、MySQL、Druid |
| 缓存与存储 | Redis、Caffeine、Cassandra、MinIO、阿里云 OSS |
| 消息与任务 | RocketMQ、XXL-JOB |
| 搜索与同步 | Elasticsearch 7.3.0、Canal |
| 工程工具 | Maven、Lombok、MapStruct、Jackson、Guava、Hutool |
| 模块 | 默认端口 | 说明 |
|---|---|---|
xiaoha-framework |
- | 公共组件、统一响应、业务上下文、Jackson 与操作日志 Starter |
xiaohashu-gateway |
8000 | API 网关、路由与统一鉴权 |
xiaohashu-auth |
8080 | 登录、验证码与认证服务 |
xiaohashu-oss |
8081 | MinIO / 阿里云 OSS 文件服务 |
xiaohashu-user |
8082 | 用户、角色与权限服务 |
xiaohashu-kv |
8084 | 基于 Cassandra 的内容 KV 服务 |
xiaohashu-distributed-id-generator |
8085 | Leaf / Snowflake 分布式 ID 服务 |
xiaohashu-note |
8086 | 笔记发布、点赞与收藏服务 |
xiaohashu-user-relation |
8087 | 关注与粉丝关系服务 |
xiaohashu-count |
8090 | 用户、笔记和评论计数服务 |
xiaohashu-data-align |
8091 | 数据对齐与定时任务服务 |
xiaohashu-search |
8092 | Elasticsearch 搜索与 Canal 同步服务 |
xiaohashu-comment |
8093 | 评论、子评论与评论点赞服务 |
带有 -api 后缀的子模块用于定义 Feign 接口和跨服务 DTO,带有 -biz 后缀的子模块包含具体业务实现。
- JDK 17
- Maven 3.8+
- MySQL 8.x
- Redis 6.x+
- Nacos 2.x
- RocketMQ 4.x
- Cassandra:
xiaohashu-kv - MinIO 或阿里云 OSS:
xiaohashu-oss - Elasticsearch 7.3.x、Canal:
xiaohashu-search - ZooKeeper、Leaf 数据库:
xiaohashu-distributed-id-generator - XXL-JOB:
xiaohashu-data-align - Sentinel Dashboard:
xiaohashu-count
本地开发配置默认使用以下地址:Nacos 127.0.0.1:8848、Redis 127.0.0.1:6379、RocketMQ 127.0.0.1:9876、MySQL 127.0.0.1:3307。如本机环境不同,请在启动前修改相应配置。
git clone https://github.com/yangboxuan726/xiaohashu.git
cd xiaohashu至少启动 MySQL、Redis、Nacos 和 RocketMQ。若需要运行全部服务,还需按上文准备 Cassandra、对象存储、Elasticsearch、Canal、ZooKeeper、XXL-JOB 和 Sentinel。
仓库暂未提供数据库初始化 SQL。请根据各模块 domain/dataobject、MyBatis Mapper 与 generatorConfig.xml 准备对应表结构,并为 Leaf 单独创建数据库。
各服务的配置主要位于:
<service>/src/main/resources/config/
├── bootstrap.yml
├── application.yml
├── application-dev.yml
└── application-prod.yml
网关配置位于 xiaohashu-gateway/src/main/resources/。请重点检查:
- Nacos 注册中心与配置中心地址
- MySQL、Redis、Cassandra 连接信息
- RocketMQ NameServer 地址
- MinIO / 阿里云 OSS 配置
- Elasticsearch、Canal、XXL-JOB、Sentinel 与 ZooKeeper 地址
阿里云短信、阿里云 OSS 和 MinIO 的访问凭据不再写入配置文件,请在启动服务前设置环境变量:
| 环境变量 | 用途 | 获取方式 |
|---|---|---|
ALIYUN_SMS_ACCESS_KEY_ID |
短信服务 AccessKey ID | 为短信服务创建独立 RAM 用户,在凭证管理中创建 AccessKey |
ALIYUN_SMS_ACCESS_KEY_SECRET |
短信服务 AccessKey Secret | 创建上述 AccessKey 时显示一次,请立即安全保存 |
ALIYUN_OSS_ACCESS_KEY_ID |
OSS 服务 AccessKey ID | 为 OSS 创建独立 RAM 用户并授予目标 Bucket 的最小权限 |
ALIYUN_OSS_ACCESS_KEY_SECRET |
OSS 服务 AccessKey Secret | 创建上述 AccessKey 时显示一次,请立即安全保存 |
MINIO_ACCESS_KEY |
MinIO 客户端 Access Key | 由 MinIO 管理员在部署服务时设置 |
MINIO_SECRET_KEY |
MinIO 客户端 Secret Key | 由 MinIO 管理员在部署服务时设置 |
阿里云 AccessKey 是 SDK 调用云 API 时使用的程序访问凭据,由 AccessKey ID 和 AccessKey Secret 组成,不是控制台登录密码。请优先使用 RAM 用户而非主账号,并遵循最小权限原则。具体创建步骤参见阿里云官方文档:创建 AccessKey。
PowerShell 临时设置示例:
$env:ALIYUN_SMS_ACCESS_KEY_ID = "<短信服务 RAM AccessKey ID>"
$env:ALIYUN_SMS_ACCESS_KEY_SECRET = "<短信服务 RAM AccessKey Secret>"
$env:ALIYUN_OSS_ACCESS_KEY_ID = "<OSS 服务 RAM AccessKey ID>"
$env:ALIYUN_OSS_ACCESS_KEY_SECRET = "<OSS 服务 RAM AccessKey Secret>"
$env:MINIO_ACCESS_KEY = "<MinIO Access Key>"
$env:MINIO_SECRET_KEY = "<MinIO Secret Key>"安全提示:不要把真实密码、AccessKey、Token 或私钥提交到 Git。建议使用环境变量、Nacos 加密配置或专用密钥管理服务;已经进入 Git 历史的凭据必须先在服务商控制台中轮换或吊销。
在项目根目录执行:
mvn clean package -DskipTests也可以只构建指定模块及其依赖,例如:
mvn -pl xiaohashu-auth -am clean package -DskipTests
mvn -pl xiaohashu-note/xiaohashu-note-biz -am clean package -DskipTests建议先启动 Nacos 与其他基础设施,再按依赖关系启动:
- 分布式 ID、OSS、KV
- 用户、认证
- 笔记、用户关系、评论、计数
- 搜索、数据对齐
- 网关
开发环境可直接在 IDE 中运行各模块的 *Application 启动类。完成上一步全量构建后,也可以指定服务的 POM 使用 Maven 启动,例如:
mvn -f xiaohashu-auth/pom.xml spring-boot:run
mvn -f xiaohashu-gateway/pom.xml spring-boot:run启动完成后,通过网关访问:
http://localhost:8000
网关当前提供 /auth/**、/user/**、/note/**、/relation/** 和 /comment/** 路由。登录后的请求使用以下认证头:
Authorization: Bearer <token>- 默认激活
dev配置,生产部署前请切换配置并完成安全加固。 - 服务通过 Nacos 完成注册发现,内部调用主要使用 OpenFeign。
- Redis 同时用于认证会话、业务缓存、布隆过滤器、Bitmap 和 ZSet 等场景。
- RocketMQ 用于点赞、收藏、关注、评论及计数等异步事件。
- 仓库中的
.flattened-pom.xml由 Flatten Maven Plugin 生成,不建议手工编辑。
欢迎通过 Issue 或 Pull Request 提交问题、改进建议与代码变更。提交前请确保:
- 未包含密码、云服务密钥、Token、私钥或本地日志。
- 相关模块能够通过构建与测试。
- 新增配置提供安全的示例值或环境变量引用。