价格

架构总览

相关源文件

本页面内容基于以下源文件生成:

本项目是一个基于 Spring Boot 3.5.11 构建的论坛系统,采用 Maven 多模块架构和 Dubbo 微服务通信机制。系统通过分层架构设计实现了业务逻辑与数据访问的解耦,支持 MySQL、MongoDB、Redis 等多数据源,适用于中小型社区场景。

项目整体结构

项目采用标准的 Maven 多模块结构,顶层 POM 定义了四个核心模块:bbs-restbbs-commonbbs-userbbs-articlepom.xml:17-22)。其中 bbs-userbbs-article 业务模块进一步细分为三层子模块:facade(接口层)、persistence(持久层)、service(业务层),形成清晰的职责边界。

正在加载图表渲染器...

架构要点说明

  1. 模块边界清晰bbs-userbbs-article 各自独立演进,通过 facade 层暴露接口(bbs-user/pom.xml:17-21bbs-article/pom.xml:17-21
  2. 公共能力下沉bbs-common 提供跨模块的通用工具类和基础依赖(bbs-common/pom.xml:16-29
  3. 依赖方向控制:rest 层仅依赖 facade 接口,不直接依赖 service 实现,实现编译期隔离
  4. 跨域接口调用: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 Boot3.5.11基础框架企业级稳定性,生态完善
Dubbo3.3.2微服务RPC高性能通信,服务治理能力强
Zookeeper5.x Curator服务注册Dubbo官方推荐,成熟稳定
MySQL9.6.0关系型存储事务支持,复杂查询
MongoDBSpring Data文档存储灵活schema,适合内容管理
RedisRedisson缓存高性能,分布式锁支持
Druid1.2.24连接池监控能力强,防SQL注入
MyBatis3.5.19ORM灵活SQL控制,性能优化

依赖管理策略

根 POM 通过 dependencyManagement 统一管理所有依赖版本(pom.xml:79-306),子模块只需声明依赖而不指定版本号。这种设计确保了版本一致性,避免依赖冲突。特别地,项目使用 ${revision} 占位符统一模块版本(pom.xml:27),配合 flatten-maven-plugin 实现多模块版本同步(pom.xml:312-337)。

多数据源配置

分层架构设计

系统采用严格的分层架构,每个业务域(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(跨域调用)。

关键配置类

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-facadebbs-user-facadebbs-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 端点

关键依赖配置

xml
1<!-- 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 接口处理
  • ❌ 不直接操作数据库连接

关键配置实现

java
1// 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 监控配置

java
1// 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:缓存热门文章、阅读计数

依赖关系

xml
1<!-- 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 模块

职责边界

  • ✅ 通用工具类(日期、字符串、加密)
  • ✅ 统一响应格式封装
  • ✅ 基础配置常量
  • ❌ 不包含业务逻辑
  • ❌ 不依赖其他业务模块

依赖结构

xml
1<!-- 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>

数据流与调用链

用户登录流程

正在加载图表渲染器...

流程要点说明

  1. 请求入口:rest 层接收 HTTP 请求,进行参数校验(bbs-rest/pom.xml:28-30
  2. Dubbo 调用:通过 @DubboReference 注入 user-facade 接口代理
  3. 缓存策略:user-service 先查 Redis 缓存,未命中再查数据库(需要确认具体实现)
  4. 会话管理:登录成功后生成 token 存入 Redis,设置过期时间
  5. 异常处理:密码错误、用户不存在等异常通过 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 连接池监控

选择理由

安全配置

  • 白名单限制:仅允许特定 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

模块依赖关系

正在加载图表渲染器...

依赖规则说明

  1. 单向依赖:依赖关系从上到下,不允许循环依赖
  2. 接口隔离:rest 层只能依赖 facade 层,不能直接依赖 service 层(bbs-rest/pom.xml:15-25
  3. 跨域调用:article 通过 user-facade 调用用户服务,不直接访问 user 数据库(bbs-article/bbs-article-service/pom.xml:26-29
  4. 公共下沉:所有模块都可以依赖 bbs-common,但 common 不能依赖业务模块

关键配置与启动流程

Maven 构建配置

项目使用 flatten-maven-plugin 处理 ${revision} 占位符(pom.xml:312-337),确保子模块版本号统一。构建命令:

bash
1# 完整构建
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 插件。启动流程:

  1. 加载 application.yml 配置文件
  2. 初始化 Dubbo 配置,连接 Zookeeper
  3. 注册 Dubbo 服务引用(@DubboReference
  4. 启动 Tomcat 容器,监听 HTTP 请求

service 模块配置了 maven.deploy.skip=truebbs-user/bbs-user-service/pom.xml:173-176),表示不发布到私服,仅作为本地模块依赖。

数据源配置要点

MySQL 连接池

Redis 配置

MongoDB 配置

Dubbo 服务配置

两个 service 模块均包含 DubboConfig 配置类(bbs-article/bbs-article-service/src/main/java/com/liang/bbs/article/service/config/DubboConfig.java:14-15bbs-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
  • 负载均衡:随机策略