架构总览
相关源文件
本页面内容基于以下源文件生成:
- pom.xml
- bbs-article/pom.xml
- bbs-user/pom.xml
- bbs-rest/pom.xml
- bbs-common/pom.xml
- bbs-article/bbs-article-service/src/main/java/com/liang/bbs/article/service/config/DubboConfig.java
- bbs-user/bbs-user-service/src/main/java/com/liang/bbs/user/service/config/DubboConfig.java
- bbs-user/bbs-user-service/src/main/java/com/liang/bbs/user/service/config/MongoConfig.java
- bbs-user/bbs-user-service/src/main/java/com/liang/bbs/user/service/config/RedisConfig.java
- bbs-user/bbs-user-service/src/main/java/com/liang/bbs/user/service/config/DruidConfig.java
- bbs-user/bbs-user-facade/pom.xml
- bbs-user/bbs-user-service/pom.xml
- bbs-user/bbs-user-persistence/pom.xml
- bbs-article/bbs-article-facade/pom.xml
- bbs-article/bbs-article-service/pom.xml
- bbs-article/bbs-article-persistence/pom.xml
- db/bbs_navicat_mongodb.js
- bbs-rest/src/main/java/com/liang/bbs/rest/RestApplication.java
- bbs-rest/src/test/java/com/liang/bbs/rest/RestApplicationTests.java
- bbs-rest/src/main/java/com/liang/bbs/rest/utils/IpUtil.java
本项目是一个基于 Spring Boot 3.5.11 构建的论坛系统,采用 Maven 多模块架构和 Dubbo 微服务通信机制。系统通过分层架构设计实现了业务逻辑与数据访问的解耦,支持 MySQL、MongoDB、Redis 等多数据源,适用于中小型社区场景。
项目整体结构
项目采用标准的 Maven 多模块结构,顶层 POM 定义了四个核心模块:bbs-rest、bbs-common、bbs-user、bbs-article(pom.xml:17-22)。其中 bbs-user 和 bbs-article 业务模块进一步细分为三层子模块:facade(接口层)、persistence(持久层)、service(业务层),形成清晰的职责边界。
正在加载图表渲染器...
架构要点说明:
- 模块边界清晰:
bbs-user和bbs-article各自独立演进,通过 facade 层暴露接口(bbs-user/pom.xml:17-21、bbs-article/pom.xml:17-21) - 公共能力下沉:
bbs-common提供跨模块的通用工具类和基础依赖(bbs-common/pom.xml:16-29) - 依赖方向控制:rest 层仅依赖 facade 接口,不直接依赖 service 实现,实现编译期隔离
- 跨域接口调用:article 的 facade 层依赖 user 的 facade 层,体现业务域间的接口协作(bbs-article/bbs-article-facade/pom.xml:28-31)
技术栈与依赖管理
项目基于 Spring Boot 3.5.11 构建(pom.xml:6-10),采用 Dubbo 3.3.2 作为微服务通信框架,配合 Zookeeper 实现服务注册与发现。数据层支持多种存储方案:MySQL(Druid 连接池 + MyBatis)、MongoDB(文档存储)、Redis(缓存与会话管理)。
核心技术选型:
| 技术组件 | 版本 | 用途 | 选型理由 |
|---|---|---|---|
| Spring Boot | 3.5.11 | 基础框架 | 企业级稳定性,生态完善 |
| Dubbo | 3.3.2 | 微服务RPC | 高性能通信,服务治理能力强 |
| Zookeeper | 5.x Curator | 服务注册 | Dubbo官方推荐,成熟稳定 |
| MySQL | 9.6.0 | 关系型存储 | 事务支持,复杂查询 |
| MongoDB | Spring Data | 文档存储 | 灵活schema,适合内容管理 |
| Redis | Redisson | 缓存 | 高性能,分布式锁支持 |
| Druid | 1.2.24 | 连接池 | 监控能力强,防SQL注入 |
| MyBatis | 3.5.19 | ORM | 灵活SQL控制,性能优化 |
依赖管理策略:
根 POM 通过 dependencyManagement 统一管理所有依赖版本(pom.xml:79-306),子模块只需声明依赖而不指定版本号。这种设计确保了版本一致性,避免依赖冲突。特别地,项目使用 ${revision} 占位符统一模块版本(pom.xml:27),配合 flatten-maven-plugin 实现多模块版本同步(pom.xml:312-337)。
多数据源配置:
- article-service 引入 MongoDB 依赖,用于存储文章内容、评论等文档型数据(bbs-article/bbs-article-service/pom.xml:81-86)
- user-service 引入 Redis 和连接池依赖,用于用户会话、权限缓存(bbs-user/bbs-user-service/pom.xml:68-81)
- Dubbo通信 两个服务模块均配置 Dubbo + Zookeeper,支持跨服务调用(pom.xml:186-198)
分层架构设计
系统采用严格的分层架构,每个业务域(user/article)均包含三个层次:facade(接口层)、service(业务层)、persistence(持久层)。rest 层作为独立的 Web 入口,通过 Dubbo RPC 调用各业务服务。
facade 接口层
facade 层定义服务接口契约和 DTO 对象,不包含任何实现逻辑。以 bbs-article-facade 为例,该模块依赖 nansheng-common 公共组件和 bbs-common 工具类(bbs-article/bbs-article-facade/pom.xml:17-27),同时引入 PageHelper 分页工具(bbs-article/bbs-article-facade/pom.xml:45-50)。这种设计使得接口层可以独立发布到私服,供其他服务引用。
职责边界:
- ✅ 定义服务接口(Dubbo Service API)
- ✅ 声明 DTO/VO 数据传输对象
- ✅ 定义业务异常类型
- ❌ 不包含业务实现逻辑
- ❌ 不依赖具体持久化技术
service 业务层
service 层是核心业务逻辑的实现载体,依赖 facade 接口层和 persistence 持久层。bbs-article-service 的依赖结构清晰展示了这一关系(bbs-article/bbs-article-service/pom.xml:16-30):它依赖 bbs-article-facade(接口定义)、bbs-article-persistence(数据访问)、bbs-user-facade(跨域调用)。
关键配置类:
- DubboConfig:声明 Dubbo 服务提供者配置(bbs-article/bbs-article-service/src/main/java/com/liang/bbs/article/service/config/DubboConfig.java:14-15)
- RedisConfig:配置 RedisTemplate 序列化策略(bbs-user/bbs-user-service/src/main/java/com/liang/bbs/user/service/config/RedisConfig.java:20-38)
- DruidConfig:配置数据库连接池监控(bbs-user/bbs-user-service/src/main/java/com/liang/bbs/user/service/config/DruidConfig.java:17-55)
persistence 持久层
persistence 层负责数据访问实现,包含 Mapper 接口、Entity 实体类和 XML 映射文件。bbs-user-persistence 依赖 MyBatis 核心库和工具类(bbs-user/bbs-user-persistence/pom.xml:16-36),并配置了 MyBatis Generator 插件用于代码生成(bbs-user/bbs-user-persistence/pom.xml:41-44)。
rest 接口层
bbs-rest 是系统的唯一 Web 入口,暴露 HTTP API 供前端调用。该模块依赖 bbs-article-facade 和 bbs-user-facade(bbs-rest/pom.xml:15-25),通过 Dubbo RPC 调用远程服务,同时集成 Knife4j 和 SpringDoc 生成 API 文档(bbs-rest/pom.xml:41-56)。
核心模块详解
bbs-rest 模块
职责边界:
- ✅ 接收 HTTP 请求,参数校验
- ✅ 调用 Dubbo 服务,组装响应
- ✅ 统一异常处理,API 文档生成
- ❌ 不包含业务逻辑实现
- ❌ 不直接访问数据库
入口与关键 API:
- 主启动类:
RestApplication(需要确认具体路径) - API 文档访问:
/doc.html(Knife4j) - 健康检查:Spring Boot Actuator 端点
关键依赖配置:
xml1<!-- bbs-rest/pom.xml:15-25 --> 2<dependency> 3 <groupId>com.liang</groupId> 4 <artifactId>bbs-article-facade</artifactId> 5</dependency> 6<dependency> 7 <groupId>com.liang</groupId> 8 <artifactId>bbs-user-facade</artifactId> 9</dependency>
数据流特点:rest 层通过 @DubboReference 注解注入远程服务代理,调用时自动经过序列化 → 网络传输 → 反序列化流程。
bbs-user-service 模块
职责边界:
- ✅ 用户注册、登录、权限管理
- ✅ 用户信息缓存
- ✅ 短信验证码发送(阿里云 SDK)
- ❌ 不包含 HTTP 接口处理
- ❌ 不直接操作数据库连接
关键配置实现:
java1// bbs-user/bbs-user-service/src/main/java/com/liang/bbs/user/service/config/RedisConfig.java:20-36 2@Bean 3public RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory) { 4 RedisTemplate redisTemplate = new RedisTemplate(); 5 redisTemplate.setConnectionFactory(redisConnectionFactory); 6 Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = 7 new Jackson2JsonRedisSerializer(Object.class); 8 ObjectMapper om = new ObjectMapper(); 9 om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); 10 om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL); 11 jackson2JsonRedisSerializer.setObjectMapper(om); 12 redisTemplate.setValueSerializer(jackson2JsonRedisSerializer); 13 redisTemplate.setKeySerializer(new StringRedisSerializer()); 14 // ... 15}
Druid 监控配置:
java1// bbs-user/bbs-user-service/src/main/java/com/liang/bbs/user/service/config/DruidConfig.java:24-38 2@Bean 3public ServletRegistrationBean<StatViewServlet> registrationBean() { 4 ServletRegistrationBean<StatViewServlet> bean = 5 new ServletRegistrationBean<>(new StatViewServlet(), "/druid/*"); 6 bean.addInitParameter("allow", "127.0.0.1,47.119.192.69,120.48.100.28"); 7 bean.addInitParameter("deny", "192.168.1.73"); 8 bean.addInitParameter("loginUsername", "admin"); 9 bean.addInitParameter("loginPassword", "admin"); 10 bean.addInitParameter("resetEnable", "false"); 11 return bean; 12}
错误处理策略:
- 数据库连接失败:Druid 自动重连 + 超时降级
- Redis 连接异常:需要确认是否有降级逻辑
- Dubbo 调用超时:需要确认超时配置
bbs-article-service 模块
职责边界:
- ✅ 文章发布、编辑、删除
- ✅ 评论管理(MongoDB 存储)
- ✅ 文章分类、标签管理
- ❌ 不包含用户认证逻辑
- ❌ 不直接操作用户数据
多数据源支持:
- MySQL:存储文章元数据、分类信息
- MongoDB:存储文章内容、评论(大文档)
- Redis:缓存热门文章、阅读计数
依赖关系:
xml1<!-- bbs-article/bbs-article-service/pom.xml:16-30 --> 2<dependency> 3 <groupId>com.liang</groupId> 4 <artifactId>bbs-article-facade</artifactId> 5</dependency> 6<dependency> 7 <groupId>com.liang</groupId> 8 <artifactId>bbs-article-persistence</artifactId> 9</dependency> 10<dependency> 11 <groupId>com.liang</groupId> 12 <artifactId>bbs-user-facade</artifactId> 13 <version>${revision}</version> 14</dependency>
跨域调用场景:article-service 通过 bbs-user-facade 查询用户信息(如文章作者详情),避免直接访问 user 数据库。
bbs-common 模块
职责边界:
- ✅ 通用工具类(日期、字符串、加密)
- ✅ 统一响应格式封装
- ✅ 基础配置常量
- ❌ 不包含业务逻辑
- ❌ 不依赖其他业务模块
依赖结构:
xml1<!-- bbs-common/pom.xml:16-29 --> 2<dependency> 3 <groupId>org.springframework.boot</groupId> 4 <artifactId>spring-boot-starter-web</artifactId> 5</dependency> 6<dependency> 7 <groupId>org.apache.httpcomponents.client5</groupId> 8 <artifactId>httpclient5</artifactId> 9</dependency> 10<dependency> 11 <groupId>org.projectlombok</groupId> 12 <artifactId>lombok</artifactId> 13</dependency>
数据流与调用链
用户登录流程
正在加载图表渲染器...
流程要点说明:
- 请求入口:rest 层接收 HTTP 请求,进行参数校验(bbs-rest/pom.xml:28-30)
- Dubbo 调用:通过
@DubboReference注入 user-facade 接口代理 - 缓存策略:user-service 先查 Redis 缓存,未命中再查数据库(需要确认具体实现)
- 会话管理:登录成功后生成 token 存入 Redis,设置过期时间
- 异常处理:密码错误、用户不存在等异常通过 Dubbo Filter 统一处理
文章发布流程
正在加载图表渲染器...
数据一致性保障:
- MySQL 存储文章元数据(标题、作者、创建时间)
- MongoDB 存储大文本内容(支持富文本、版本管理)
- 通过 article_id 关联两份数据
核心设计决策与取舍
1. Dubbo vs Spring Cloud
选择 Dubbo 的理由:
- 性能优势:基于 Netty 的长连接通信,吞吐量更高
- 服务治理:提供负载均衡、熔断、降级等能力
- 团队熟悉度:国内生态成熟,文档完善
已知限制:
- 协议绑定:需要依赖 Dubbo 协议,跨语言支持较弱
- 运维复杂度:需要独立部署 Zookeeper 集群
2. MongoDB 混合存储
选择理由:
- 文章内容字段长度不固定,MongoDB 的灵活 schema 更适合
- 支持嵌套文档,评论数据可以直接嵌入文章文档
- 水平扩展能力强,适合内容型业务增长
取舍点:
- 事务支持弱于 MySQL,需要通过应用层补偿
- 跨集合查询性能较差,元数据仍用 MySQL
3. facade 层独立设计
选择理由:
- 接口与实现分离,支持多消费者共享接口定义
- 便于服务版本管理,接口变更不影响实现
- 编译隔离,rest 层无法直接依赖 service 实现
代价:
- 模块数量增加,项目结构复杂度提升
- 需要额外维护 facade 模块的发布流程
4. Druid 连接池监控
选择理由:
- 内置 SQL 监控、慢查询分析
- 防SQL注入能力
- 可视化监控界面(bbs-user/bbs-user-service/src/main/java/com/liang/bbs/user/service/config/DruidConfig.java:24-27)
安全配置:
- 白名单限制:仅允许特定 IP 访问监控页面
- 黑名单机制:优先级高于白名单
- 账号密码保护:默认 admin/admin(生产环境需修改)
5. Redis 序列化策略
选择 Jackson 的理由:
- JSON 格式可读性强,便于调试
- 支持复杂对象序列化
- 类型信息保留,反序列化不丢失类型
配置细节(bbs-user/bbs-user-service/src/main/java/com/liang/bbs/user/service/config/RedisConfig.java:25-34):
- Key 使用 StringRedisSerializer
- Value 使用 Jackson2JsonRedisSerializer
- HashKey/StringRedisSerializer,HashValue 用 Jackson
模块依赖关系
正在加载图表渲染器...
依赖规则说明:
- 单向依赖:依赖关系从上到下,不允许循环依赖
- 接口隔离:rest 层只能依赖 facade 层,不能直接依赖 service 层(bbs-rest/pom.xml:15-25)
- 跨域调用:article 通过 user-facade 调用用户服务,不直接访问 user 数据库(bbs-article/bbs-article-service/pom.xml:26-29)
- 公共下沉:所有模块都可以依赖 bbs-common,但 common 不能依赖业务模块
关键配置与启动流程
Maven 构建配置
项目使用 flatten-maven-plugin 处理 ${revision} 占位符(pom.xml:312-337),确保子模块版本号统一。构建命令:
bash1# 完整构建 2mvn clean install 3 4# 跳过测试 5mvn clean install -DskipTests 6 7# 指定模块构建 8mvn clean install -pl bbs-rest -am
Spring Boot 启动配置
rest 模块作为主启动入口(bbs-rest/pom.xml:157-159),配置了 spring-boot-maven-plugin 插件。启动流程:
- 加载
application.yml配置文件 - 初始化 Dubbo 配置,连接 Zookeeper
- 注册 Dubbo 服务引用(
@DubboReference) - 启动 Tomcat 容器,监听 HTTP 请求
service 模块配置了 maven.deploy.skip=true(bbs-user/bbs-user-service/pom.xml:173-176),表示不发布到私服,仅作为本地模块依赖。
数据源配置要点
MySQL 连接池:
- 使用 Druid 连接池,配置监控 Servlet(bbs-user/bbs-user-service/src/main/java/com/liang/bbs/user/service/config/DruidConfig.java:24-38)
- 监控访问路径:
/druid/* - 白名单 IP:127.0.0.1, 47.119.192.69, 120.48.100.28
Redis 配置:
- 使用 Redisson 客户端,支持分布式锁
- 连接池依赖 commons-pool2(bbs-user/bbs-user-service/pom.xml:77-80)
- 序列化配置见 RedisConfig(bbs-user/bbs-user-service/src/main/java/com/liang/bbs/user/service/config/RedisConfig.java:20-38)
MongoDB 配置:
- article-service 模块引入 spring-boot-starter-data-mongodb(bbs-article/bbs-article-service/pom.xml:81-86)
- MongoConfig 类预留了连接超时配置(已注释)(bbs-user/bbs-user-service/src/main/java/com/liang/bbs/user/service/config/MongoConfig.java:12-21)
Dubbo 服务配置
两个 service 模块均包含 DubboConfig 配置类(bbs-article/bbs-article-service/src/main/java/com/liang/bbs/article/service/config/DubboConfig.java:14-15、bbs-user/bbs-user-service/src/main/java/com/liang/bbs/user/service/config/DubboConfig.java:14-15),具体配置项需要确认 application.yml 中的定义。典型配置包括:
- 注册中心地址:zookeeper://127.0.0.1:2181
- 协议配置:dubbo 协议,端口 20880
- 超时时间:默认 1000ms
- 负载均衡:随机策略
