# springcloud-multi-module-demo **Repository Path**: byref/springcloud-multi-module-demo ## Basic Information - **Project Name**: springcloud-multi-module-demo - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-04-14 - **Last Updated**: 2026-04-14 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Spring Boot 多模块微服务项目 这是一个基于 Spring Boot 和 Spring Cloud Alibaba 的多模块微服务示例项目,展示了微服务架构下的模块划分、服务通信和配置管理。 ## 项目结构 ``` . ├── common/ # 公共模块(共享 DTO) ├── app-service/ # 应用服务模块(JPA + MySQL) ├── demo/ # 演示模块(Feign 客户端 + Actuator) └── README.md ``` ### 模块说明 | 模块 | 描述 | 端口 | |------|------|------| | **common** | 共享的 DTO(数据传输对象),如 `ResultDto`、`PageObject`、`UserInfoDto` 等 | - | | **app-service** | 提供用户数据服务的模块,使用 Spring Data JPA 操作 MySQL 数据库 | 8083 | | **demo** | 消费 `app-service` 的演示模块,通过 OpenFeign 调用远程服务,集成 Spring Boot Actuator | 8081 | ## 技术栈 - **Java 21** - **Spring Boot 4.0.5** - **Spring Cloud 2025.1.0** - **Spring Cloud Alibaba 2025.1.0.0** - **MySQL 8.0+** - **Nacos 2.x**(服务发现与配置中心) - **Spring Data JPA** - **OpenFeign**(服务间调用) - **Spring Boot Actuator**(应用监控) - **Lombok**(减少样板代码) - **Apache HttpClient 5**(HTTP 客户端) ## 快速开始 ### 环境准备 1. **Java 21**:确保已安装 JDK 21 2. **MySQL**:运行 MySQL 实例(默认配置在 `app-service/src/main/resources/application.yaml`) 3. **Nacos**:启动 Nacos Server(默认地址 `localhost:8848`) 4. **Maven**:或使用模块内自带的 Maven Wrapper ### 构建项目 在项目根目录执行: ```bash mvn clean install ``` ### 运行服务 #### 1. 启动应用服务(app-service) ```bash cd app-service ./mvnw spring-boot:run # 或使用 mvn spring-boot:run ``` 服务启动后,访问 `http://localhost:8083` #### 2. 启动演示服务(demo) ```bash cd demo ./mvnw spring-boot:run ``` 服务启动后,访问 `http://localhost:8081` ## 服务间通信 ### Feign 客户端 `demo` 模块通过 Feign 客户端调用 `app-service` 的服务: ```java // AppFeignClient.java @FeignClient(name = "app-service") public interface AppFeignClient { @GetMapping("/user/find-age-by-account") ResultDto findUserAgeByAccount(@RequestParam("account") String account); @GetMapping("/user/find-by-account") ResultDto findUserByAccount(@RequestParam("account") String account); } ``` ### 调用示例 通过 `demo` 服务间接调用 `app-service`: ```bash # 通过 demo 服务查询用户年龄(demo 通过 Feign 调用 app-service) curl "http://localhost:8081/test/findUserAgeByAccount?account=testUser" # 直接调用 app-service 的分页接口 curl "http://localhost:8083/user/paged-list?pageNum=0&pageSize=10" ``` ## 配置说明 ### 应用服务配置(app-service) ```yaml # app-service/src/main/resources/application.yaml server: port: 8083 spring: application: name: app-service datasource: url: jdbc:mysql://localhost:3306/test3?serverTimezone=Asia/Shanghai username: root password: 123456 jpa: show-sql: true cloud: nacos: server-addr: localhost:8848 discovery: namespace: ${NACOS_NAMESPACE:} group: ${NACOS_GROUP:DEFAULT_GROUP} ``` ### 演示服务配置(demo) ```yaml # demo/src/main/resources/application.yaml server: port: 8081 spring: application: name: demo-app cloud: openfeign: client: config: app-service: connectTimeout: 300 # 连接超时 300ms readTimeout: 3000 # 读取超时 3000ms nacos: server-addr: localhost:8848 management: endpoints: web: base-path: /my-actuator # Actuator 端点前缀 exposure: include: '*' ``` ## 监控与健康检查 ### Spring Boot Actuator `demo` 模块集成了 Spring Boot Actuator,提供应用监控端点: - **应用健康**:`http://localhost:8081/my-actuator/health` - **应用信息**:`http://localhost:8081/my-actuator/info` - **Prometheus 指标**:`http://localhost:8081/my-actuator/prometheus` - **所有端点列表**:`http://localhost:8081/my-actuator` ### 自定义指标 `TestController` 中包含了自定义的指标计数: ```java @GetMapping("/ping") public ResultDto ping() { meterRegistry.counter("test.count", "ping", "pong").increment(); return ResultDto.success("pong11111"); } ``` ## 数据库 ### 数据表结构 `app-service` 使用以下表结构: ```sql CREATE TABLE user_info ( id INT PRIMARY KEY AUTO_INCREMENT, username VARCHAR(100), account VARCHAR(100), avatar VARCHAR(255), age INT, company_code VARCHAR(50), is_del BOOLEAN DEFAULT FALSE ); ``` ### JPA 实体 ```java @Entity @Table(name = "user_info") @Data public class UserInfo { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Integer id; private String username; private String account; private String avatar; private Integer age; private String companyCode; private Boolean isDel; } ``` ## 公共 DTO ### 统一响应格式 所有 REST 接口返回 `ResultDto` 格式: ```java public class ResultDto { private T data; // 响应数据 private String msg; // 消息 private Boolean success; // 是否成功 public static ResultDto success(T data) { ... } public static ResultDto fail(String msg) { ... } } ``` ### 分页响应 ```java public class PageObject { private Integer pageNum; // 当前页码 private Integer pageSize; // 每页大小 private Long total; // 总记录数 private Integer totalPage; // 总页数 private List data; // 数据列表 } ``` ## HTTP 客户端配置 `demo` 模块配置了高性能的 HTTP 客户端: - 使用 **Apache HttpClient 5** - 连接池配置:最大连接数 200,每个路由 50 - SSL 证书信任策略(开发环境) - 连接超时:30秒,Socket 超时:30秒 ## Docker 支持 项目包含 Dockerfile,用于构建 `demo` 模块的镜像: ```bash # 构建镜像 docker build -t demo-app . # 运行容器 docker run -p 8081:8081 demo-app ``` ## 开发说明 ### 代码规范 - 使用 **Lombok** 减少 Getter/Setter 样板代码 - 统一异常处理:`@ControllerAdvice` 捕获所有异常并返回 `ResultDto.fail()` - 包名规范: - `app-service`: `sdfcom.byref.appservice.*` - `demo`: `com.example.demo.*` - `common`: `com.example.demo.common.*` ### 测试 每个模块包含 Spring Boot 测试: ```bash # 运行 app-service 测试 mvn test -pl app-service # 运行 demo 测试 mvn test -pl demo ``` ## 常见问题 ### 1. Nacos 连接失败 确保 Nacos Server 正在运行,地址为 `localhost:8848`。 ### 2. MySQL 连接失败 - 检查 MySQL 服务是否运行 - 确认数据库 `test3` 存在 - 检查 `application.yaml` 中的用户名和密码 ### 3. Feign 调用超时 - 检查 `app-service` 是否已注册到 Nacos - 调整 `connectTimeout` 和 `readTimeout` 配置 ### 4. SSL 证书问题 开发环境中 `RestTemplate` 配置为信任所有证书,生产环境需要修改此配置。 ## 许可证 本项目仅用于学习和演示目的。 ## 联系方式 如有问题或建议,请通过项目 Issue 反馈。