tianyuan-api-server/域与服务的关系及目录架构.md
2025-07-13 20:37:12 +08:00

16 KiB

域与服务的关系及目录架构设计

🤔 域 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 周)

# 创建新的目录结构
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 周)

# 迁移共享代码
mv pkg/ shared/pkg/
mv westDex/ domains/data-domain/data-service/internal/infrastructure/external/westdex/

阶段 3: 重构数据服务域 (2-3 周)

// 创建数据服务协调器
// 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. 单个服务开发

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. 跨域开发

# 启动依赖服务
docker-compose up mysql redis kafka

# 启动相关服务
make start-user-service
make start-security-service
make start-data-service

# 集成测试
make test-integration

3. 统一管理

# 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. 独立部署 - 每个服务都可以独立构建部署

这种架构既保持了逻辑上的清晰性,又确保了技术实现的可操作性!