docs: 补充模块通信方式说明

新增内容:
- 2.3 模块通信方式章节
  - 2.3.1 基础服务 - Maven 依赖方式
  - 2.3.2 业务服务 - OpenFeign 通信方式
  - 2.3.3 通信链路追踪
  - 2.3.4 通信架构图
  - 2.3.5 通信方式选择标准

关键说明:
✓ fund-common 等基础服务采用 Maven 依赖方式
✓ 业务服务间采用 OpenFeign 进行 HTTP 通信
✓ 自动传递租户ID、用户信息、链路追踪ID
✓ 提供完整的代码示例和架构图
✓ 明确反模式,避免错误使用
This commit is contained in:
zhangjf 2026-02-17 09:28:37 +08:00
parent 297ea8e259
commit cf0db27bc5

View File

@ -2309,6 +2309,199 @@ public class PerformanceAspect {
| 报表中心 | fund-report | 统计分析、数据导出 | 8160-8169 |
| 文件中心 | fund-file | 文件上传、存储管理 | 8170-8179 |
### 2.3 模块通信方式
系统采用**分层通信架构**,根据模块职责划分为基础服务和业务服务,采用不同的通信方式:
#### 2.3.1 基础服务 - Maven 依赖方式
**定义**:提供基础能力、不对外暴露 HTTP 接口的模块
| 基础服务 | 说明 | 提供能力 | 依赖方式 |
|---------|------|---------|---------|
| **fund-common** | 公共模块 | 基础实体、工具类、统一响应格式 | Maven 依赖 |
| **fund-gateway** | API 网关 | 路由转发、统一鉴权、限流熔断 | 独立部署 |
**特点**
- ✅ **编译时依赖**:通过 Maven `<dependency>` 直接引入
- ✅ **本地调用**:方法级别直接调用,无网络开销
- ✅ **强类型约束**:编译期类型检查,更安全
- ✅ **版本统一**:通过父 POM 统一管理版本
**示例**
```xml
<!-- 业务模块依赖 fund-common -->
<dependency>
<groupId>com.fundplatform</groupId>
<artifactId>fund-common</artifactId>
<version>${project.version}</version>
</dependency>
```
#### 2.3.2 业务服务 - OpenFeign 通信方式
**定义**:提供 HTTP API 接口、独立部署的业务模块
| 业务服务 | 说明 | 提供 API | 通信方式 |
|---------|------|---------|---------|
| **fund-sys** | 系统服务 | 用户、角色、权限、部门 API | OpenFeign |
| **fund-cust** | 客户中心 | 客户、联系人管理 API | OpenFeign |
| **fund-proj** | 项目中心 | 项目、成员管理 API | OpenFeign |
| **fund-req** | 需求中心 | 需求工单、应收款 API | OpenFeign |
| **fund-exp** | 支出中心 | 支出类型、支出管理 API | OpenFeign |
| **fund-receipt** | 收款中心 | 收款记录、账期管理 API | OpenFeign |
| **fund-report** | 报表中心 | 统计分析、数据导出 API | OpenFeign |
| **fund-file** | 文件中心 | 文件上传、存储管理 API | OpenFeign |
**特点**
- ✅ **松耦合**:服务间独立部署、独立升级
- ✅ **声明式调用**:通过接口注解定义,自动生成实现
- ✅ **负载均衡**:集成 LoadBalancer自动分发请求
- ✅ **服务发现**:通过 Nacos 动态获取服务地址
- ✅ **熔断降级**:集成 Sentinel提供容错能力
- ✅ **链路追踪**:自动传递 TraceId、租户ID、用户信息
**示例**
```java
/**
* 客户服务 Feign 客户端
*/
@FeignClient(
name = "fund-cust", // 服务名Nacos注册名
path = "/api/v1/customer", // 接口路径前缀
fallbackFactory = CustomerFallbackFactory.class // 降级处理
)
public interface CustomerFeignClient {
/**
* 根据客户ID查询客户信息
*/
@GetMapping("/{customerId}")
Result<Customer> getCustomerById(@PathVariable Long customerId);
/**
* 批量查询客户信息
*/
@PostMapping("/batch")
Result<List<Customer>> getCustomersByIds(@RequestBody List<Long> customerIds);
}
```
**调用示例**
```java
@Service
@RequiredArgsConstructor
public class ProjectService {
// 注入 Feign 客户端
private final CustomerFeignClient customerFeignClient;
public ProjectDetail getProjectDetail(Long projectId) {
// 1. 查询项目基本信息
Project project = projectMapper.selectById(projectId);
// 2. 通过 Feign 调用客户服务获取客户信息
Result<Customer> result = customerFeignClient.getCustomerById(project.getCustomerId());
Customer customer = result.getData();
// 3. 组装返回
return ProjectDetail.builder()
.project(project)
.customer(customer)
.build();
}
}
```
#### 2.3.3 通信链路追踪
所有 Feign 调用自动传递以下 Header 信息:
| Header 名称 | 说明 | 来源 | 用途 |
|------------|------|------|------|
| `X-Tenant-Id` | 租户ID | TenantContextHolder | 多租户数据隔离 |
| `X-Uid` | 用户ID | 当前登录用户 | 操作日志记录 |
| `X-Uname` | 用户名 | 当前登录用户 | 操作日志记录 |
| `X-Trace-Id` | 链路追踪ID | MDC.get("traceId") | 全链路日志追踪 |
**实现机制**
```java
/**
* Feign 调用链拦截器
* 自动添加租户、用户、链路追踪信息到请求头
*/
@Component
public class FeignChainInterceptor implements RequestInterceptor {
@Override
public void apply(RequestTemplate template) {
// 1. 传递租户ID
Long tenantId = TenantContextHolder.getTenantId();
if (tenantId != null) {
template.header("X-Tenant-Id", String.valueOf(tenantId));
}
// 2. 传递用户信息
Long uid = GlobalContext.getUid();
String uname = GlobalContext.getUname();
if (uid != null) {
template.header("X-Uid", String.valueOf(uid));
template.header("X-Uname", uname);
}
// 3. 传递链路追踪ID
String traceId = MDC.get("traceId");
if (traceId != null) {
template.header("X-Trace-Id", traceId);
}
}
}
```
#### 2.3.4 通信架构图
```
┌─────────────────────────────────────────────────────────────────────┐
│ 前端应用 │
│ (管理后台 + 移动端) │
└────────────────────────────┬────────────────────────────────────────┘
│ HTTP/HTTPS
┌─────────────────────────────────────────────────────────────────────┐
│ fund-gateway (API网关) │
│ 路由、鉴权、限流、熔断 │
└──┬──────────────┬──────────────┬──────────────┬─────────────────────┘
│ │ │ │
│ HTTP │ HTTP │ HTTP │ HTTP
▼ ▼ ▼ ▼
┌────────┐ ┌────────┐ ┌────────┐ ┌────────┐
│fund-sys│ │fund-cust│ │fund-proj│ │fund-exp│
│系统服务│ │客户中心│ │项目中心│ │支出中心│
└───┬────┘ └───┬────┘ └───┬────┘ └───┬────┘
│ │ │ │
│ Maven依赖 │ OpenFeign ◄──┤ OpenFeign ◄──┤
▼ ▼ ▼ ▼
┌──────────────────────────────────────────────────┐
│ fund-common (公共模块) │
│ (Result、BaseEntity、工具类等) │
└──────────────────────────────────────────────────┘
```
#### 2.3.5 通信方式选择标准
| 场景 | 推荐方式 | 理由 |
|------|---------|------|
| 使用公共实体类 | Maven 依赖 | 编译期检查,无运行时开销 |
| 使用工具类方法 | Maven 依赖 | 直接调用,性能最优 |
| 跨服务调用 API | OpenFeign | 服务解耦,支持独立部署 |
| 查询其他服务数据 | OpenFeign | 通过 HTTP API标准化通信 |
| 调用第三方服务 | OpenFeign | 统一的调用方式和错误处理 |
**反模式**(不推荐):
- ❌ 业务服务间通过 Maven 依赖互相引用(导致强耦合)
- ❌ 直接通过数据库访问其他服务的表(破坏服务边界)
- ❌ 使用 RestTemplate 而非 OpenFeign缺少服务发现和负载均衡
---
## 三、技术架构