406 lines
16 KiB
Markdown
406 lines
16 KiB
Markdown
|
# 域与服务的关系及目录架构设计
|
||
|
|
||
|
## 🤔 域 vs 服务的关系
|
||
|
|
||
|
### 核心概念
|
||
|
|
||
|
- **域 (Domain)** = **业务边界**,是逻辑概念
|
||
|
- **服务 (Service)** = **技术实现**,是物理部署单元
|
||
|
|
||
|
### 关系图解
|
||
|
|
||
|
```
|
||
|
Domain (域)
|
||
|
├── Service A (微服务A)
|
||
|
├── Service B (微服务B)
|
||
|
└── Service C (微服务C)
|
||
|
```
|
||
|
|
||
|
**一个域可以包含多个微服务,也可以是一个微服务。**
|
||
|
|
||
|
## 🏗️ 具体的域-服务映射
|
||
|
|
||
|
### 方案一:一域一服务 (推荐给中小型项目)
|
||
|
|
||
|
```
|
||
|
├── user-domain/ # 用户域
|
||
|
│ └── user-service/ # 用户服务 (包含用户+企业+认证)
|
||
|
├── security-domain/ # 安全域
|
||
|
│ └── security-service/ # 安全服务 (加密+白名单+密钥)
|
||
|
├── product-domain/ # 产品域
|
||
|
│ └── product-service/ # 产品服务 (产品管理+权限控制)
|
||
|
├── data-domain/ # 数据服务域
|
||
|
│ └── data-service/ # 数据服务 (统一数据网关)
|
||
|
├── billing-domain/ # 计费域
|
||
|
│ └── billing-service/ # 计费服务 (钱包+扣费+账单)
|
||
|
├── audit-domain/ # 审计域
|
||
|
│ └── audit-service/ # 审计服务 (日志+记录)
|
||
|
└── gateway-domain/ # 网关域
|
||
|
└── gateway-service/ # 网关服务
|
||
|
```
|
||
|
|
||
|
### 方案二:一域多服务 (适合大型项目)
|
||
|
|
||
|
```
|
||
|
├── user-domain/ # 用户域
|
||
|
│ ├── user-service/ # 用户管理服务
|
||
|
│ ├── enterprise-service/ # 企业认证服务
|
||
|
│ └── auth-service/ # 认证授权服务
|
||
|
├── security-domain/ # 安全域
|
||
|
│ ├── encryption-service/ # 加密解密服务
|
||
|
│ ├── whitelist-service/ # 白名单服务
|
||
|
│ └── key-management-service/ # 密钥管理服务
|
||
|
├── data-domain/ # 数据服务域
|
||
|
│ ├── data-gateway-service/ # 数据网关服务
|
||
|
│ ├── risk-service/ # 风险评估服务 (原FLXG)
|
||
|
│ ├── credit-service/ # 征信服务 (原JRZQ)
|
||
|
│ ├── company-service/ # 企业信息服务 (原QYGL)
|
||
|
│ └── query-service/ # 数据查询服务 (原IVYZ)
|
||
|
└── ...
|
||
|
```
|
||
|
|
||
|
## 📁 推荐的目录架构设计
|
||
|
|
||
|
### 整体项目结构 (基于你的项目)
|
||
|
|
||
|
```
|
||
|
tianyuan-api-platform/
|
||
|
├── domains/ # 业务域目录
|
||
|
│ ├── user-domain/ # 用户域
|
||
|
│ │ └── user-service/ # 用户服务
|
||
|
│ │ ├── cmd/ # 应用入口
|
||
|
│ │ │ ├── server/main.go # 服务器入口
|
||
|
│ │ │ ├── cli/main.go # CLI工具
|
||
|
│ │ │ └── migrator/main.go # 数据库迁移
|
||
|
│ │ ├── api/ # API定义
|
||
|
│ │ │ ├── grpc/ # gRPC定义
|
||
|
│ │ │ │ └── user.proto
|
||
|
│ │ │ └── http/ # HTTP API定义
|
||
|
│ │ │ └── user.api
|
||
|
│ │ ├── internal/ # 内部实现
|
||
|
│ │ │ ├── domain/ # 领域层
|
||
|
│ │ │ │ ├── entity/ # 实体
|
||
|
│ │ │ │ │ ├── user.go
|
||
|
│ │ │ │ │ └── enterprise.go
|
||
|
│ │ │ │ ├── valueobject/ # 值对象
|
||
|
│ │ │ │ ├── repository/ # 仓储接口
|
||
|
│ │ │ │ │ └── user_repository.go
|
||
|
│ │ │ │ └── service/ # 领域服务
|
||
|
│ │ │ │ └── user_domain_service.go
|
||
|
│ │ │ ├── application/ # 应用层
|
||
|
│ │ │ │ ├── service/ # 应用服务
|
||
|
│ │ │ │ │ └── user_app_service.go
|
||
|
│ │ │ │ ├── dto/ # 数据传输对象
|
||
|
│ │ │ │ └── command/ # 命令处理
|
||
|
│ │ │ ├── infrastructure/ # 基础设施层
|
||
|
│ │ │ │ ├── persistence/ # 持久化
|
||
|
│ │ │ │ │ ├── mysql/
|
||
|
│ │ │ │ │ │ └── user_repository_impl.go
|
||
|
│ │ │ │ │ └── redis/
|
||
|
│ │ │ │ ├── messaging/ # 消息队列
|
||
|
│ │ │ │ └── external/ # 外部服务
|
||
|
│ │ │ └── interfaces/ # 接口适配器
|
||
|
│ │ │ ├── grpc/ # gRPC适配器
|
||
|
│ │ │ │ └── user_grpc_handler.go
|
||
|
│ │ │ ├── http/ # HTTP适配器
|
||
|
│ │ │ │ └── user_http_handler.go
|
||
|
│ │ │ └── event/ # 事件处理
|
||
|
│ │ ├── configs/ # 配置文件
|
||
|
│ │ │ ├── config.yaml
|
||
|
│ │ │ └── config.dev.yaml
|
||
|
│ │ ├── deployments/ # 部署配置
|
||
|
│ │ │ ├── Dockerfile
|
||
|
│ │ │ └── k8s/
|
||
|
│ │ ├── docs/ # 文档
|
||
|
│ │ ├── test/ # 测试
|
||
|
│ │ └── go.mod
|
||
|
│ │
|
||
|
│ ├── data-domain/ # 数据服务域
|
||
|
│ │ └── data-service/ # 数据服务 (主要协调者)
|
||
|
│ │ ├── cmd/
|
||
|
│ │ │ └── server/main.go
|
||
|
│ │ ├── api/
|
||
|
│ │ │ └── http/
|
||
|
│ │ │ └── data.api
|
||
|
│ │ ├── internal/
|
||
|
│ │ │ ├── domain/
|
||
|
│ │ │ │ └── service/
|
||
|
│ │ │ │ ├── risk_assessment_service.go # 原FLXG逻辑
|
||
|
│ │ │ │ ├── credit_check_service.go # 原JRZQ逻辑
|
||
|
│ │ │ │ ├── company_info_service.go # 原QYGL逻辑
|
||
|
│ │ │ │ ├── data_query_service.go # 原IVYZ逻辑
|
||
|
│ │ │ │ └── app_system_service.go # 原YYSY逻辑
|
||
|
│ │ │ ├── application/
|
||
|
│ │ │ │ └── service/
|
||
|
│ │ │ │ └── data_orchestrator_service.go # 主协调器
|
||
|
│ │ │ ├── infrastructure/
|
||
|
│ │ │ │ └── external/
|
||
|
│ │ │ │ ├── westdex_client.go # 西部数据源客户端
|
||
|
│ │ │ │ ├── baidu_client.go # 百度API客户端
|
||
|
│ │ │ │ └── aliyun_client.go # 阿里云API客户端
|
||
|
│ │ │ └── interfaces/
|
||
|
│ │ │ └── http/
|
||
|
│ │ │ ├── risk_handler.go # /api/v1/data/risk-assessment
|
||
|
│ │ │ ├── credit_handler.go # /api/v1/data/credit-check
|
||
|
│ │ │ ├── company_handler.go # /api/v1/data/company-info
|
||
|
│ │ │ └── query_handler.go # /api/v1/data/query
|
||
|
│ │ └── ...
|
||
|
│ │
|
||
|
│ ├── security-domain/ # 安全域
|
||
|
│ │ └── security-service/
|
||
|
│ │ ├── cmd/
|
||
|
│ │ ├── api/grpc/
|
||
|
│ │ │ └── security.proto
|
||
|
│ │ ├── internal/
|
||
|
│ │ │ ├── domain/
|
||
|
│ │ │ │ └── service/
|
||
|
│ │ │ │ ├── encryption_service.go # 加密解密
|
||
|
│ │ │ │ ├── whitelist_service.go # 白名单管理
|
||
|
│ │ │ │ └── key_management_service.go # 密钥管理
|
||
|
│ │ │ └── ...
|
||
|
│ │ └── ...
|
||
|
│ │
|
||
|
│ ├── billing-domain/ # 计费域
|
||
|
│ │ └── billing-service/
|
||
|
│ │ ├── cmd/
|
||
|
│ │ ├── api/grpc/
|
||
|
│ │ │ └── billing.proto
|
||
|
│ │ ├── internal/
|
||
|
│ │ │ ├── domain/
|
||
|
│ │ │ │ ├── entity/
|
||
|
│ │ │ │ │ ├── wallet.go
|
||
|
│ │ │ │ │ ├── transaction.go
|
||
|
│ │ │ │ │ └── billing_record.go
|
||
|
│ │ │ │ └── service/
|
||
|
│ │ │ │ ├── wallet_service.go
|
||
|
│ │ │ │ ├── charging_service.go
|
||
|
│ │ │ │ └── billing_service.go
|
||
|
│ │ │ └── ...
|
||
|
│ │ └── ...
|
||
|
│ │
|
||
|
│ ├── product-domain/ # 产品域
|
||
|
│ │ └── product-service/
|
||
|
│ │ └── ... (类似结构)
|
||
|
│ │
|
||
|
│ ├── audit-domain/ # 审计域
|
||
|
│ │ └── audit-service/
|
||
|
│ │ └── ... (类似结构)
|
||
|
│ │
|
||
|
│ └── gateway-domain/ # 网关域
|
||
|
│ └── gateway-service/
|
||
|
│ ├── cmd/
|
||
|
│ │ └── server/main.go
|
||
|
│ ├── internal/
|
||
|
│ │ ├── middleware/ # 中间件
|
||
|
│ │ │ ├── auth.go
|
||
|
│ │ │ ├── rate_limit.go
|
||
|
│ │ │ └── audit.go
|
||
|
│ │ ├── router/ # 路由器
|
||
|
│ │ │ └── gateway_router.go
|
||
|
│ │ └── proxy/ # 代理
|
||
|
│ │ └── service_proxy.go
|
||
|
│ └── configs/
|
||
|
│ └── gateway.yaml
|
||
|
│
|
||
|
├── shared/ # 共享库
|
||
|
│ ├── pkg/ # 通用包
|
||
|
│ │ ├── crypto/ # 加密工具
|
||
|
│ │ ├── jwt/ # JWT工具
|
||
|
│ │ ├── response/ # 响应格式
|
||
|
│ │ ├── errors/ # 错误定义
|
||
|
│ │ ├── logger/ # 日志工具
|
||
|
│ │ └── utils/ # 工具函数
|
||
|
│ ├── events/ # 领域事件定义
|
||
|
│ │ ├── user_events.go
|
||
|
│ │ ├── billing_events.go
|
||
|
│ │ └── audit_events.go
|
||
|
│ └── proto/ # 公共protobuf定义
|
||
|
│ └── common.proto
|
||
|
│
|
||
|
├── infrastructure/ # 基础设施
|
||
|
│ ├── docker-compose.yaml # 本地开发环境
|
||
|
│ ├── kubernetes/ # K8s部署文件
|
||
|
│ │ ├── user-service.yaml
|
||
|
│ │ ├── data-service.yaml
|
||
|
│ │ └── gateway-service.yaml
|
||
|
│ ├── terraform/ # 基础设施即代码
|
||
|
│ └── monitoring/ # 监控配置
|
||
|
│ ├── prometheus/
|
||
|
│ └── grafana/
|
||
|
│
|
||
|
├── tools/ # 工具和脚本
|
||
|
│ ├── generate/ # 代码生成器
|
||
|
│ ├── migration/ # 数据迁移脚本
|
||
|
│ └── deploy/ # 部署脚本
|
||
|
│
|
||
|
├── docs/ # 项目文档
|
||
|
│ ├── architecture/ # 架构文档
|
||
|
│ ├── api/ # API文档
|
||
|
│ └── deployment/ # 部署文档
|
||
|
│
|
||
|
├── scripts/ # 构建和部署脚本
|
||
|
│ ├── build.sh
|
||
|
│ ├── deploy.sh
|
||
|
│ └── test.sh
|
||
|
│
|
||
|
├── .github/ # GitHub Actions
|
||
|
│ └── workflows/
|
||
|
│ ├── user-service.yml
|
||
|
│ ├── data-service.yml
|
||
|
│ └── gateway-service.yml
|
||
|
│
|
||
|
├── Makefile # 统一构建脚本
|
||
|
├── docker-compose.yml # 整体服务编排
|
||
|
└── README.md # 项目说明
|
||
|
```
|
||
|
|
||
|
## 🔄 从当前项目的迁移策略
|
||
|
|
||
|
### 当前项目映射关系
|
||
|
|
||
|
```
|
||
|
当前结构 → 新结构
|
||
|
|
||
|
apps/api/ → domains/data-domain/data-service/
|
||
|
├── FLXG/ → internal/domain/service/risk_assessment_service.go
|
||
|
├── JRZQ/ → internal/domain/service/credit_check_service.go
|
||
|
├── QYGL/ → internal/domain/service/company_info_service.go
|
||
|
├── IVYZ/ → internal/domain/service/data_query_service.go
|
||
|
└── YYSY/ → internal/domain/service/app_system_service.go
|
||
|
|
||
|
apps/user/ → domains/user-domain/user-service/
|
||
|
apps/sentinel/ → domains/product-domain/product-service/
|
||
|
apps/gateway/ → domains/gateway-domain/gateway-service/
|
||
|
apps/admin/ → domains/admin-domain/admin-service/
|
||
|
apps/mqs/ → domains/audit-domain/audit-service/
|
||
|
|
||
|
pkg/ → shared/pkg/
|
||
|
westDex/ → domains/data-domain/data-service/internal/infrastructure/external/
|
||
|
```
|
||
|
|
||
|
### 逐步迁移计划
|
||
|
|
||
|
#### 阶段 1: 创建新的目录结构 (1 周)
|
||
|
|
||
|
```bash
|
||
|
# 创建新的目录结构
|
||
|
mkdir -p domains/{user,data,security,billing,product,audit,gateway}-domain
|
||
|
mkdir -p shared/{pkg,events,proto}
|
||
|
mkdir -p infrastructure/{kubernetes,terraform,monitoring}
|
||
|
```
|
||
|
|
||
|
#### 阶段 2: 迁移共享包 (1 周)
|
||
|
|
||
|
```bash
|
||
|
# 迁移共享代码
|
||
|
mv pkg/ shared/pkg/
|
||
|
mv westDex/ domains/data-domain/data-service/internal/infrastructure/external/westdex/
|
||
|
```
|
||
|
|
||
|
#### 阶段 3: 重构数据服务域 (2-3 周)
|
||
|
|
||
|
```go
|
||
|
// 创建数据服务协调器
|
||
|
// domains/data-domain/data-service/internal/application/service/data_orchestrator.go
|
||
|
|
||
|
type DataOrchestrator struct {
|
||
|
riskService *RiskAssessmentService // 原FLXG
|
||
|
creditService *CreditCheckService // 原JRZQ
|
||
|
companyService *CompanyInfoService // 原QYGL
|
||
|
queryService *DataQueryService // 原IVYZ
|
||
|
appService *AppSystemService // 原YYSY
|
||
|
|
||
|
// 依赖的其他域服务
|
||
|
securityService SecurityServiceClient // gRPC客户端
|
||
|
userService UserServiceClient // gRPC客户端
|
||
|
productService ProductServiceClient // gRPC客户端
|
||
|
billingService BillingServiceClient // gRPC客户端
|
||
|
auditService AuditServiceClient // gRPC客户端
|
||
|
}
|
||
|
|
||
|
func (d *DataOrchestrator) ProcessAPIRequest(ctx context.Context, req *APIRequest) (*APIResponse, error) {
|
||
|
// 之前分析的完整流程代码
|
||
|
}
|
||
|
```
|
||
|
|
||
|
#### 阶段 4: 拆分其他域服务 (3-4 周)
|
||
|
|
||
|
逐个创建和迁移其他域服务
|
||
|
|
||
|
#### 阶段 5: 完善基础设施 (2 周)
|
||
|
|
||
|
添加监控、CI/CD、部署等
|
||
|
|
||
|
## 🚀 实际开发工作流
|
||
|
|
||
|
### 1. 单个服务开发
|
||
|
|
||
|
```bash
|
||
|
cd domains/user-domain/user-service
|
||
|
|
||
|
# 开发
|
||
|
go run cmd/server/main.go
|
||
|
|
||
|
# 测试
|
||
|
go test ./...
|
||
|
|
||
|
# 构建
|
||
|
go build -o bin/user-service cmd/server/main.go
|
||
|
|
||
|
# 部署
|
||
|
docker build -t user-service .
|
||
|
```
|
||
|
|
||
|
### 2. 跨域开发
|
||
|
|
||
|
```bash
|
||
|
# 启动依赖服务
|
||
|
docker-compose up mysql redis kafka
|
||
|
|
||
|
# 启动相关服务
|
||
|
make start-user-service
|
||
|
make start-security-service
|
||
|
make start-data-service
|
||
|
|
||
|
# 集成测试
|
||
|
make test-integration
|
||
|
```
|
||
|
|
||
|
### 3. 统一管理
|
||
|
|
||
|
```makefile
|
||
|
# Makefile
|
||
|
.PHONY: build-all start-all test-all
|
||
|
|
||
|
build-all:
|
||
|
cd domains/user-domain/user-service && go build -o ../../../bin/user-service cmd/server/main.go
|
||
|
cd domains/data-domain/data-service && go build -o ../../../bin/data-service cmd/server/main.go
|
||
|
cd domains/gateway-domain/gateway-service && go build -o ../../../bin/gateway-service cmd/server/main.go
|
||
|
|
||
|
start-all:
|
||
|
docker-compose up -d
|
||
|
|
||
|
test-all:
|
||
|
cd domains/user-domain/user-service && go test ./...
|
||
|
cd domains/data-domain/data-service && go test ./...
|
||
|
cd domains/gateway-domain/gateway-service && go test ./...
|
||
|
```
|
||
|
|
||
|
## 🎯 总结
|
||
|
|
||
|
### 域与服务的关系:
|
||
|
|
||
|
- **域 = 业务边界** (逻辑概念)
|
||
|
- **服务 = 部署单元** (物理实现)
|
||
|
- **推荐:一域一服务** (对于你的项目规模)
|
||
|
|
||
|
### 目录架构核心原则:
|
||
|
|
||
|
1. **按域组织** - 顶层按业务域划分
|
||
|
2. **标准结构** - 每个服务内部结构一致
|
||
|
3. **清晰分层** - 领域层、应用层、基础设施层、接口层
|
||
|
4. **共享复用** - 公共代码放在 shared 目录
|
||
|
5. **独立部署** - 每个服务都可以独立构建部署
|
||
|
|
||
|
这种架构既保持了逻辑上的清晰性,又确保了技术实现的可操作性!
|