p2p-parent
├── pom.xml
├── common
│ ├── pom.xml
│ └── src/main/java
│ └── com/p2p/common
│ ├── dto
│ │ ├── loan
│ │ │ ├── LoanCreateDTO.java
│ │ │ ├── LoanAuditDTO.java
│ │ │ └── LoanQueryDTO.java
│ │ ├── invest
│ │ │ └── CreateInvestDTO.java
│ │ └── user
│ │ └── UserDTO.java
│ ├── vo
│ │ ├── loan/LoanVO.java
│ │ └── invest/InvestVO.java
│ ├── result
│ │ └── Result.java
│ └── feign ✅ Feign Client 统一放这里
│ ├── UserFeignClient.java
│ ├── LoanFeignClient.java
│ ├── InvestFeignClient.java
│ ├── BankFeignClient.java
│ ├── RiskFeignClient.java
│ └── NotifyFeignClient.java
├── p2p-user
│ ├── pom.xml
│ └── src/main
│ ├── java/com/p2p/p2puser
│ │ ├── P2pUserApplication.java
│ │ ├── controller/UserController.java
│ │ ├── service/UserService.java
│ │ └── entity/User.java
│ └── resources/application.yml
├── p2p-loan
│ ├── pom.xml
│ └── src/main
│ ├── java/com/p2p/p2ploan
│ │ ├── P2pLoanApplication.java
│ │ ├── controller/LoanController.java
│ │ ├── service/LoanService.java
│ │ └── entity/Loan.java
│ └── resources/application.yml
├── p2p-invest
│ ├── pom.xml
│ └── src/main
│ ├── java/com/p2p/p2pinvest
│ │ ├── P2pInvestApplication.java
│ │ ├── controller/InvestController.java
│ │ ├── service/InvestService.java
│ │ └── entity/Invest.java
│ └── resources/application.yml
├── p2p-risk
├── p2p-bank
└── p2p-notify
这是我最近在开发金融项目时候,顺便学习微服务架构的总结。我未参考任何金融项目,都是自己设计接口,设计服务架构。我的项目已经改版了好多次,从单体,到另一种多服务架构,再到这一种,我记录一下我的项目目录,下面和AI聊天设计出来的一种,我只供自己学习,以免以后忘记了。
一、整体架构说明
1. 项目类型
- Maven 多模块项目 :
opp2p-parent是父工程,统一管理依赖版本 - 微服务拆分 :按业务域垂直拆分(用户、借款、投资、风控、银行、通知)
- 技术栈:SpringCloud + OpenFeign + SpringBoot + MVC 分层
2. 模块职责
| 模块 | 职责 |
|---|---|
| common | 公共模块:DTO/VO/ 统一返回值 / Feign 接口,所有服务依赖 |
| p2p-user | 用户服务:注册、登录、用户信息 |
| p2p-loan | 借款服务:借款申请、审核、管理 |
| p2p-invest | 投资服务:投资创建、订单管理 |
| p2p-risk | 风控服务:信用审核、风险校验 |
| p2p-bank | 银行接口服务:资金托管、代扣、代付 |
| p2p-notify | 通知服务:短信、站内信、推送 |
二、目录规范深度解读
1. common 公共模块(核心)
你这个设计非常标准,是微服务最佳实践:
- dto:服务之间传输的数据对象(Feign 调用用)
- vo:返回给前端的视图对象
- result :全局统一返回结果
Result<T> - feign :所有 Feign 接口统一存放(解耦、复用、维护方便)
✅ 优点:
- 服务 A 调用服务 B,直接引入 common,不用写重复接口
- 统一 DTO、VO、返回值,无冗余代码
三、父工程 pom.xml 核心配置(必备)
XML
<!-- 父工程:packaging = pom -->
<packaging>pom</packaging>
<modules>
<module>common</module>
<module>p2p-user</module>
<module>p2p-loan</module>
<module>p2p-invest</module>
<module>p2p-risk</module>
<module>p2p-bank</module>
<module>p2p-notify</module>
</modules>
<!-- 统一版本管理 -->
<properties>
<spring.boot.version>2.7.18</spring.boot.version>
<spring.cloud.version>2021.0.5</spring.cloud.version>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
四、业务服务 pom.xml 依赖(以 p2p-loan 为例)
XML
<!-- 继承父工程 -->
<parent>
<groupId>com.p2p</groupId>
<artifactId>opp2p-parent</artifactId>
<version>1.0.0</version>
</parent>
<artifactId>p2p-loan</artifactId>
<!-- 依赖公共模块 -->
<dependencies>
<dependency>
<groupId>com.p2p</groupId>
<artifactId>common</artifactId>
<version>1.0.0</version>
</dependency>
<!-- SpringCloud Feign -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<!-- Nacos/注册中心 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
</dependencies>
五、微服务调用示例(Loan 服务调用 User 服务)
1. common/feign/UserFeignClient.java
java
@FeignClient(name = "p2p-user") // 服务名
public interface UserFeignClient {
@GetMapping("/user/info/{id}")
Result<UserDTO> getUserInfo(@PathVariable("id") Long id);
}
2. p2p-loan/service/LoanService.java
java
@Service
public class LoanService {
@Autowired
private UserFeignClient userFeignClient;
public void createLoan(LoanCreateDTO dto){
// 调用用户服务获取用户信息
Result<UserDTO> result = userFeignClient.getUserInfo(dto.getUserId());
UserDTO user = result.getData();
// 业务逻辑...
}
}
六、项目启动类规范
每个服务都需要:
@SpringBootApplication@EnableDiscoveryClient(服务注册发现)@EnableFeignClients(开启 Feign 调用)
java
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients(basePackages = "com.p2p.common.feign") // 扫描公共Feign
public class P2pLoanApplication {
public static void main(String[] args) {
SpringApplication.run(P2pLoanApplication.class, args);
}
}
七、你的架构优化建议(可直接升级)
1. 建议增加的公共包
java
common
├── util 工具类:DateUtil、StringUtil、AssertUtil
├── constant 常量类:Status、ErrorCode
├── config 全局配置:Feign配置、序列化配置
└── exception 全局异常:BusinessException
2. 建议统一返回值 Result.java
java
@Data
public class Result<T> {
private int code;
private String msg;
private T data;
// 成功
public static <T> Result<T> success(T data)
// 失败
public static <T> Result<T> fail(String msg)
}
3. 微服务必备组件(建议集成)
- Nacos:服务注册发现 + 配置中心
- Sentinel:服务限流、熔断
- Seata:分布式事务(P2P 金融必须)
- RabbitMQ:异步通知、解耦
八、架构总结
你的结构 非常标准、专业、可直接用于生产:
- 按业务域拆分微服务
- common 统一管理公共资源(DTO/VO/Feign)
- 职责清晰、耦合度低、易于扩展
总结
- 父工程:统一依赖、版本管理
- common:公共代码 + Feign 接口定义,所有服务依赖
- 业务服务:独立部署、独立数据库、通过 Feign 调用
- 调用方式:Loan → Feign → User,完全解耦