讲一下这个项目整体框架架构设计,我准备写一篇博客贴到我的简历上
项目架构设计详解
1. 项目概述
一个考研经验交流项目,主要包括笔记发布、点赞、收藏、关注等功能。
平台需要满足海量用户的 高并发读写和数据一致性要求,确保用户操作的实时响应,并通过分布式架构实现高可用和高扩展性。
2. 整体架构设计
2.1 微服务架构图
┌─────────────────────────────────────────────────────────────────────────┐
│ 客户端层 (Web/APP) │
└───────────────────────┬─────────────────────────────────────────────────┘
│
┌───────────────────────▼─────────────────────────────────────────────────┐
│ 网关层 (Spring Cloud Gateway) │
└───────────────────────┬─────────────────────────────────────────────────┘
│
┌───────────────────────┼─────────────────────────────────────────────────┐
│ │ │
▼ ▼ ▼
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ 认证服务 │ │ 用户服务 │ │ 笔记服务 │ │ 评论服务 │
│ (xiaohashu-auth)│ │ (xiaohashu-user)│ │(xiaohashu-note) │ │(xiaohashu-comment)│
└────────┬────────┘ └────────┬────────┘ └────────┬────────┘ └────────┬────────┘
│ │ │ │
┌────────▼────────┐ ┌────────▼────────┐ ┌────────▼────────┐ ┌────────▼────────┐
│ 用户关系服务 │ │ 搜索服务 │ │ 计数服务 │ │ 对象存储服务 │
│(xiaohashu-user-relation) │(xiaohashu-search)│(xiaohashu-count) │(xiaohashu-oss) │
└────────┬────────┘ └────────┬────────┘ └────────┬────────┘ └────────┬────────┘
│ │ │ │
┌────────▼────────┐ ┌────────▼────────┐ ┌────────▼────────┐ ┌────────▼────────┐
│ 数据对齐服务 │ │ 分布式ID生成服务│ │ 键值存储服务 │ │ 基础框架 │
│(xiaohashu-data-align)│(xiaohashu-distributed-id-generator)│(xiaohashu-kv) │ │(xiaoha-framework) │
└─────────────────┘ └─────────────────┘ └─────────────────┘ └─────────────────┘
│ │ │ │
┌────────▼───────────────────▼───────────────────▼───────────────────▼────────┐
│ 基础设施层 │
│ Nacos(注册/配置中心) Redis(缓存) MySQL(数据库) Elasticsearch(搜索) │
│ RocketMQ(消息队列) XXL-JOB(任务调度) MinIO/OSS(对象存储) │
└─────────────────────────────────────────────────────────────────────────────┘
2.2 架构分层设计
小哈书项目采用经典的微服务架构分层设计,各层职责明确:
- 客户端层:用户直接交互的界面层,包括Web端和移动端
- 网关层:统一入口,负责请求路由、负载均衡、安全认证等
- 业务服务层:核心业务逻辑实现,按功能模块拆分为多个独立微服务
- 基础设施层:提供各类中间件支持,如数据库、缓存、消息队列等
- 公共框架层:提供共享组件、工具类、通用配置等
3. 核心技术栈
项目基于现代化技术栈构建,主要包括:
| 技术/组件 | 版本 | 用途 | 选型理由 |
|---|---|---|---|
| Spring Boot | 3.0.2 | 应用基础框架 | 简化开发、内嵌容器、自动配置 |
| Spring Cloud Alibaba | 2022.0.0.0 | 微服务生态套件 | 阿里巴巴开源,本土化支持好,组件丰富 |
| Spring Cloud | 2022.0.0 | 微服务基础框架 | 提供服务发现、负载均衡等核心功能 |
| JDK | 17 | 编程语言运行环境 | 长期支持版本,性能提升显著 |
| MySQL | 8.0.29 | 关系型数据库 | 稳定性高,社区活跃,性能优秀 |
| Elasticsearch | - | 全文搜索引擎 | 提供高效的全文搜索和复杂查询能力 |
| Redis | - | 分布式缓存 | 高性能内存数据库,支持多种数据结构 |
| RocketMQ | - | 消息队列 | 高吞吐量、高可用、顺序消息支持 |
| Nacos | - | 服务注册与配置中心 | 阿里巴巴开源,同时支持服务发现和配置管理 |
| Spring Cloud Gateway | - | API网关 | 基于WebFlux,响应式编程,性能优秀 |
| Feign | - | 声明式REST客户端 | 简化服务间调用,与Spring Cloud无缝集成 |
| Sa-Token | - | 权限认证框架 | 轻量级,API友好,功能丰富 |
| XXL-JOB | - | 分布式任务调度 | 开源、轻量级、易扩展 |
| Caffeine | - | 本地缓存 | 高性能Java缓存库,比Guava Cache性能更好 |
4. 核心微服务模块详解
4.1 网关服务 (xiaohashu-gateway)
网关服务作为系统的统一入口,负责请求路由、权限校验、限流熔断等功能。
核心功能:
- 请求路由:根据URL路径将请求转发到对应的微服务
- 负载均衡:整合Ribbon,提供客户端负载均衡能力
- 认证授权:前置校验请求的合法性
- 请求过滤:通过StripPrefix等过滤器处理请求路径
路由配置示例:
spring:
cloud:
gateway:
routes:
- id: auth
uri: lb://xiaohashu-auth
predicates:
- Path=/auth/**
filters:
- StripPrefix=1
- id: user
uri: lb://xiaohashu-user
predicates:
- Path=/user/**
filters:
- StripPrefix=1
4.2 认证服务 (xiaohashu-auth)
认证服务负责用户身份认证相关功能,是整个系统的安全入口。
核心功能:
- 用户登录/注册:支持手机号+验证码登录,自动完成注册
- 密码管理:密码修改、找回密码等
- 短信验证码:集成阿里云短信服务发送验证码
- Token生成与管理:基于Sa-Token实现
认证流程:
- 用户通过手机号和验证码请求登录
- 验证手机号和验证码的合法性
- 调用用户服务检查用户是否存在,不存在则自动注册
- 生成Token并返回给客户端
4.3 用户服务 (xiaohashu-user)
用户服务管理用户的基础信息和个人资料。
核心功能:
- 用户信息管理:创建、查询、更新用户信息
- 个人主页:展示用户发布的内容、关注/粉丝信息
- 权限管理:用户角色和权限分配
数据模型:
- 用户基本信息:手机号、昵称、头像、个性签名等
- 用户账号信息:密码、状态等
- 用户角色关联:用户与角色的多对多关系
4.4 笔记服务 (xiaohashu-note)
笔记服务是系统的核心内容服务,负责笔记的创建、管理和展示。
核心功能:
- 笔记发布:支持文字、图片等多媒体内容
- 笔记管理:更新、删除、置顶等操作
- 互动功能:点赞、收藏、分享等
- 发现页:推荐热门笔记和内容
内容存储设计:
- 笔记元数据(标题、话题、发布时间等)存储在MySQL中
- 笔记正文内容存储在KV服务中,提高读写性能
- 图片等媒体资源存储在OSS对象存储服务中
4.5 搜索服务 (xiaohashu-search)
搜索服务提供全文检索能力,支持笔记和用户的快速查找。
核心功能:
- 笔记搜索:支持关键词搜索、类型筛选、时间范围过滤、排序等
- 用户搜索:支持按昵称、用户ID搜索
- 搜索高亮:关键词高亮显示
- 文档重建:支持数据同步和重建索引
技术实现:
- 基于Elasticsearch实现全文检索
- 采用Multi-match查询,支持多字段搜索和权重设置
- 结合HighlightBuilder实现搜索结果高亮
// 搜索笔记核心实现
@Override
public PageResponse<SearchNoteRspVO> searchNote(SearchNoteReqVO searchNoteReqVO) {
// 构建查询条件
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery().must(
QueryBuilders.multiMatchQuery(keyword)
.field(NoteIndex.FIELD_NOTE_TITLE, 2.0f) // 设置标题权重
.field(NoteIndex.FIELD_NOTE_TOPIC) // 默认权重
);
// 构建排序、分页、高亮等
// ...
// 执行搜索并处理结果
// ...
}
4.6 分布式ID生成服务 (xiaohashu-distributed-id-generator)
提供全局唯一ID生成能力,解决分布式系统中的ID一致性问题。
核心功能:
- 基于Leaf号段模式生成各类业务ID
- 支持多个业务标识(bizTag)的ID生成
- 高可用设计,支持故障转移
应用场景:
- 用户ID生成
- 笔记ID生成
- 小哈书号(类似小红书号)生成
5. 关键技术实现
5.1 微服务间用户信息传递机制
系统实现了一套完善的用户信息在微服务间透明传递的机制,基于ThreadLocal和TransmittableThreadLocal实现。
核心组件:
HeaderUserId2ContextFilter:从请求头提取用户ID并设置到ThreadLocal中LoginUserContextHolder:提供获取和设置当前用户ID的静态方法FeignRequestInterceptor:在Feign调用时自动将用户ID添加到请求头
技术流程:
- 网关层通过
AddUserId2HeaderFilter将用户ID添加到请求头 - 各微服务通过
HeaderUserId2ContextFilter从请求头提取用户ID并设置到ThreadLocal - 服务内部通过
LoginUserContextHolder.getUserId()获取当前用户ID - 微服务间调用时,
FeignRequestInterceptor自动将用户ID添加到请求头
代码实现:
// ThreadLocal管理用户上下文
public class LoginUserContextHolder {
private static final ThreadLocal<Map<String, Object>> THREAD_LOCAL = new TransmittableThreadLocal<>();
public static void setUserId(Long userId) {
// 设置用户ID到ThreadLocal
}
public static Long getUserId() {
// 从ThreadLocal获取用户ID
}
public static void remove() {
// 清理ThreadLocal,防止内存泄漏
}
}
5.2 分布式事务处理
系统采用多种策略处理分布式事务问题,确保数据一致性:
- 本地事务 + 最终一致性:对于非核心业务,采用本地事务保证数据一致性,通过异步消息实现最终一致性
- TCC事务:对于核心业务,采用Try-Confirm-Cancel模式确保数据一致性
- 幂等设计:所有接口都进行幂等设计,防止重复操作
- 分布式锁:使用Redis分布式锁解决并发更新问题
5.3 缓存策略
系统采用多级缓存策略,提高系统性能:
- 本地缓存:使用Caffeine实现本地缓存,减少热点数据的数据库访问
- 分布式缓存:使用Redis作为分布式缓存,缓存共享数据和会话信息
- 缓存更新策略:采用失效策略和主动更新相结合的方式
- 缓存预热:关键业务数据在系统启动时进行预热
6. 服务治理
6.1 服务注册与发现
基于Nacos实现服务注册与发现,提供高可用的服务注册中心。
核心特性:
- 自动注册:服务启动时自动注册到Nacos
- 健康检查:定期检查服务健康状态
- 服务发现:支持根据服务名动态发现服务实例
- 配置管理:支持动态配置更新
6.2 配置管理
统一使用Nacos配置中心管理各环境的配置文件。
配置隔离:
- 命名空间(Namespace):隔离不同环境(开发、测试、生产)
- 配置分组(Group):隔离不同业务线或应用
- 配置集(Data ID):具体的配置文件
6.3 监控与日志
系统集成了完善的监控和日志系统:
- 业务日志:通过自定义注解
@ApiOperationLog实现接口操作日志的自动记录 - 系统监控:集成Spring Boot Actuator提供健康检查、指标监控等功能
- 分布式链路追踪:预留了链路追踪接口,可集成SkyWalking等组件
7. 扩展性设计
7.1 模块化设计
项目采用严格的模块化设计,每个微服务都分为API层和业务层:
- API层:定义服务接口和数据模型,供其他服务调用
- 业务层:实现具体的业务逻辑,依赖API层
这种设计使得服务之间通过API解耦,便于独立开发和部署。
7.2 水平扩展
各微服务均支持水平扩展,通过Nacos服务发现和Gateway负载均衡实现:
- 无状态设计:服务本身不存储状态,状态数据存储在Redis或数据库中
- 弹性伸缩:支持根据负载动态调整服务实例数量
8. 安全机制
系统实现了多层次的安全防护机制:
- 身份认证:基于Sa-Token实现统一的身份认证
- 权限控制:基于角色的访问控制(RBAC)
- 接口防护:防SQL注入、XSS攻击、CSRF攻击等
- 敏感数据加密:用户密码等敏感数据加密存储
- 接口限流:防止恶意请求和流量攻击
9. 总结与展望
小哈书项目采用现代化的微服务架构,通过合理的模块划分和技术选型,构建了一个高性能、可扩展、易维护的社交分享平台。
项目充分利用了Spring Cloud Alibaba生态的优势,结合各类中间件,实现了丰富的业务功能和良好的系统性能。