16 KiB
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 ./...
🎯 总结
域与服务的关系:
- 域 = 业务边界 (逻辑概念)
- 服务 = 部署单元 (物理实现)
- 推荐:一域一服务 (对于你的项目规模)
目录架构核心原则:
- 按域组织 - 顶层按业务域划分
- 标准结构 - 每个服务内部结构一致
- 清晰分层 - 领域层、应用层、基础设施层、接口层
- 共享复用 - 公共代码放在 shared 目录
- 独立部署 - 每个服务都可以独立构建部署
这种架构既保持了逻辑上的清晰性,又确保了技术实现的可操作性!