iam-tenant 服务

根据项目分析,这是一个包含 47个微服务 的企业级
ERP 系统。以下是部署和开发顺序:

部署顺序
```
第0层:基础设施

PostgreSQL → Redis → Vault → Etcd → Kafka →
ClickHouse

第1层:核心 IAM 服务(必须最先部署)
顺序: 1
服务: iam-tenant
说明: 租户管理(多租户基础)
────────────────────────────────────────
顺序: 2
服务: iam-identity
说明: 身份认证(用户、OAuth、2FA)
────────────────────────────────────────
顺序: 3
服务: iam-access
说明: 访问控制(RBAC、权限策略)
第2层:系统服务
┌──────┬────────────────┬────────────────────┐
│ 顺序 │ 服务 │ 说明 │
├──────┼────────────────┼────────────────────┤
│ 4 │ sys-core │ 编号范围、配置管理 │
├──────┼────────────────┼────────────────────┤
│ 5 │ sys-notify │ 通知服务 │
├──────┼────────────────┼────────────────────┤
│ 6 │ org-enterprise │ 组织架构 │
└──────┴────────────────┴────────────────────┘
第3层:主数据服务
┌──────┬──────────────┬────────────────┐
│ 顺序 │ 服务 │ 说明 │
├──────┼──────────────┼────────────────┤
│ 7 │ mdm-bp │ 业务伙伴主数据 │
├──────┼──────────────┼────────────────┤
│ 8 │ mdm-material │ 物料主数据 │
└──────┴──────────────┴────────────────┘
第4层:业务服务(可并行部署)
模块: 财务 FI
服务: fi-gl, fi-coa, fi-ap, fi-ar, fi-co, fi-tr
────────────────────────────────────────
模块: 采购 PM
服务: pm-po, pm-ct, pm-se, pm-vs, pm-sa, pm-iv
────────────────────────────────────────
模块: 销售 SD
服务: sd-so, sd-pe, sd-rr, sd-an
────────────────────────────────────────
模块: 供应链 SC
服务: sc-wm, sc-im, sc-tp, sc-df, sc-vs, sc-bt
────────────────────────────────────────
模块: 制造 MF
服务: mf-pp, mf-om, mf-kb, mf-qi, mf-sf, mf-eng
────────────────────────────────────────
模块: 人力 HR
服务: hr-ta, hr-ex
────────────────────────────────────────
模块: 客服 CS
服务: cs-cb, cs-fd, cs-wc
────────────────────────────────────────
模块: 资产 AM
服务: am-pm, am-gs, am-ah, am-eh
────────────────────────────────────────
模块: 研发 RD
服务: rd-pl, rd-ps
第5层:网关
顺序: 最后
服务: gateway
说明: API 网关(路由、认证、限流)

开发顺序

阶段1:基础框架(已完成)

crates/common → crates/errors → crates/config →
crates/telemetry
→ crates/auth-core → crates/domain-core →
crates/cqrs-core
→ crates/event-core → crates/bootstrap

阶段2:适配器层(已完成)

adapter-postgres → adapter-redis → adapter-vault
→ adapter-etcd
→ adapter-kafka → adapter-clickhouse →
adapter-elasticsearch
→ adapter-minio → adapter-email →
adapter-rabbitmq

阶段3:核心服务开发

  1. iam-tenant ← 当前分支正在开发
  2. iam-identity ← 已有24个迁移文件
  3. iam-access ← 已有7个迁移文件

阶段4:系统与主数据

sys-core → sys-notify → org-enterprise → mdm-bp
→ mdm-material

阶段5:业务模块(可并行开发)

按业务优先级选择模块并行开发。


依赖关系图

                  ┌─────────────────┐         
                  │  基础设施       │         
                  │ PG/Redis/Vault  │         
                  │ Kafka/ClickHouse│         
                  └────────┬────────┘         
                           │                  
                  ┌────────▼────────┐         
                  │   iam-tenant    │         
                  └────────┬────────┘         
                           │                  
                  ┌────────▼────────┐         
                  │  iam-identity   │         
                  └────────┬────────┘         
                           │                  
                  ┌────────▼────────┐         
                  │   iam-access    │         
                  └────────┬────────┘         
                           │                  

┌──────────────────┼──────────────────┐
│ │

┌──────▼──────┐ ┌───────▼───────┐
┌──────▼──────┐
│ sys-core │ │ sys-notify │
│org-enterprise│
└──────┬──────┘ └───────────────┘
└─────────────┘

┌──────▼──────┐
│ mdm-bp │
│ mdm-material│
└──────┬──────┘

┌──────▼─────────────────────────────────────
─────┐
│ 业务服务层

│ FI / PM / SD / SC / MF / HR / CS / AM / RD

└────────────────────────────────────────────
─────┘

当前 iam-tenant
分支正在开发租户服务,这是正确的开发顺序起点。
```

总结

关键发现:项目中没有使用 Envoy 配置                                                                   
                                                                                                      
虽然 README.md 提到使用 Envoy 作为服务网格代理,但实际上 项目中没有 Envoy 配置文件。服务间通信采用    
直连模式。                                                                                            
                                                                                                      
实际的访问方式                                                                                        
                                                                                                      
1. 网关到 iam-tenant 的连接配置                                                                       
┌──────────┬────────────────────────┐                                                                 
│  配置项  │           值           │                                                                 
├──────────┼────────────────────────┤                                                                 
│ 环境变量 │ TENANT_ENDPOINT        │                                                                 
├──────────┼────────────────────────┤                                                                 
│ 默认端点 │ http://127.0.0.1:50053 │                                                                 
├──────────┼────────────────────────┤                                                                 
│ 协议     │ gRPC (HTTP/2)          │                                                                 
├──────────┼────────────────────────┤                                                                 
│ 连接超时 │ 10秒                   │                                                                 
├──────────┼────────────────────────┤                                                                 
│ 请求超时 │ 30秒                   │                                                                 
└──────────┴────────────────────────┘                                                                 
2. 配置文件位置                                                                                       
- 网关配置: gateway/src/config.rs:8 - tenant_endpoint 字段                                            
- gRPC 客户端: gateway/src/grpc/mod.rs:18 - TenantServiceClient                                       
                                                                                                      
3. 服务启动                                                                                           
- iam-tenant 使用 bootstrap crate 统一启动                                                            
- 配置通过环境变量和 Vault 管理                                                                       
- services/iam-tenant/config/ 目录为空                                                                
                                                                                                      
当前状态                                                                                              
                                                                                                      
- REST API 路由已实现 (gateway/src/tenant.rs) 但被注释掉                                              
- gRPC 直连已配置并可用                                                                               
- 没有 Envoy sidecar 或 bootstrap 配置                                                                
                                                                                                      
如果你需要添加 Envoy 配置,需要创建相应的 envoy.yaml 文件并配置服务发现(Consul)集成。               
                                                                                                      
✻ Baked for 2m 5s                                                                                       
                                                                                                      
❯ 是要使用dokcer吗 我不打算使用docker                                                                   
                                                                                                      
⏺ 根据探索结果,不需要使用 Docker。                                                                     
                                                                                                      
当前架构                                                                                              
                                                                                                      
项目采用的是 直连模式,不依赖 Envoy 或 Docker:                                                       
                                                                                                      
Gateway (网关)  --gRPC-->  iam-tenant 服务                                                            
     |                          |                                                                     
     |                          |                                                                     
  端口: 配置中指定            端口: 50053                                                             
                                                                                                      
配置方式                                                                                              
                                                                                                      
只需设置环境变量即可:                                                                                
                                                                                                      
# 网关连接 iam-tenant                                                                                 
export TENANT_ENDPOINT="http://127.0.0.1:50053"                                                       
                                                                                                      
# 网关连接 iam-access                                                                                 
export IAM_ENDPOINT="http://127.0.0.1:50051"                                                          
                                                                                                      
本地开发启动                                                                                          
                                                                                                      
直接运行 Rust 服务:                                                                                  
                                                                                                      
# 终端 1: 启动 iam-tenant 服务                                                                        
cd services/iam-tenant                                                                                
cargo run                                                                                             
                                                                                                      
# 终端 2: 启动网关                                                                                    
cd gateway                                                                                            
cargo run                                                                                             
                                                                                                      
结论                                                                                                  
                                                                                                      
- 不需要 Docker                                                                                       
- 不需要 Envoy                                                                                        
- README 中提到的 Envoy/Consul 是规划中的生产架构,但代码中并未实现                                   
- 本地开发直接用 cargo run 启动各服务,通过环境变量配置端点地址即可
问题总结                                                                                              
                                                                                                      
iam-tenant 服务缺少配置文件,services/iam-tenant/config/ 目录是空的。                                 
                                                                                                      
这意味着:                                                                                            
1. 服务启动时 AppConfig::load("config") 会失败(找不到 default.toml)                                 
2. 没有定义 server.port,无法知道服务监听哪个端口                                                     
3. 网关配置的 TENANT_ENDPOINT=http://127.0.0.1:50053 是硬编码的默认值,但 iam-tenant                  
服务本身没有配置监听 50053                                                                            
                                                                                                      
生产环境的灾难点:                                                                                    
- 服务端口没有统一管理                                                                                
- 网关用硬编码默认值连接后端服务                                                                      
- 没有服务发现机制                                                                                    
- 配置分散在代码和环境变量中                                                                          
                                                                                                      
需要我为 iam-tenant 创建配置文件吗?参考其他服务的模式,需要创建:                                    
- services/iam-tenant/config/default.toml - 基础配置                                                  
- services/iam-tenant/config/development.toml - 开发环境                                              
- services/iam-tenant/config/production.toml - 生产环境                 

当前架构分析                                                                                          
                                                                                                      
现状:                                                                                                
1. 每个服务都有自己的 config/ 目录,存放 default.toml、development.toml、production.toml              
2. bootstrap 调用 AppConfig::load(config_dir) 从本地文件加载配置                                      
3. Vault 用于敏感信息(数据库密码、JWT secret 等),但服务端口、主机等仍在本地 toml 文件              
                                                                                                      
问题:                                                                                                
- 配置分散在几十个服务的 config/ 目录中                                                               
- 服务端口硬编码在各自的 toml 文件里                                                                  
- 网关用硬编码默认值连接后端(灾难)                                                                  
- 没有服务注册/发现机制                                                                               
                                                                                                      
统一配置方案                                                                                          
                                                                                                      
有几种选择:                                                                                          
┌────────────────────┬─────────────────────────────────────────────┬────────┐                         
│        方案        │                    描述                     │ 复杂度 │                         
├────────────────────┼─────────────────────────────────────────────┼────────┤                         
│ A. Vault 集中配置  │ 把所有服务配置(包括端口)存入 Vault        │ 中     │                         
├────────────────────┼─────────────────────────────────────────────┼────────┤                         
│ B. etcd 配置中心   │ 用 etcd 做配置中心 + 服务发现               │ 中高   │                         
├────────────────────┼─────────────────────────────────────────────┼────────┤                         
│ C. 根目录统一配置  │ 创建 /config/services.toml 统一管理所有服务 │ 低     │                         
├────────────────────┼─────────────────────────────────────────────┼────────┤                         
│ D. Consul 服务发现 │ 用 Consul 做服务注册/发现                   │ 高     │                         
└────────────────────┴─────────────────────────────────────────────┴────────┘                         
你倾向哪种方案?                                                                                      
                                                                                                      
考虑到你已经有 Vault 和 etcd 的适配器,方案 A 或 B 可能更适合:                                       
- Vault: 已经用于敏感配置,可以扩展存储服务端点                                                       
- etcd: 更适合做配置中心和服务发现,支持 watch 变更              

当前状态分析                                                                                          
                                                                                                      
已有组件                                                                                              
┌────────┬───────────────────┬─────────────────────────────────────┐                                  
│  组件  │       状态        │                用途                 │                                  
├────────┼───────────────────┼─────────────────────────────────────┤                                  
│ Vault  │ ✅ 已实现         │ 敏感配置(JWT密钥、数据库密码等)   │                                  
├────────┼───────────────────┼─────────────────────────────────────┤                                  
│ etcd   │ ✅ 已实现         │ KV存储、Watch、分布式锁、租约、事务 │                                  
├────────┼───────────────────┼─────────────────────────────────────┤                                  
│ Consul │ ❌ 仅在README提及 │ 未实现                              │                                  
├────────┼───────────────────┼─────────────────────────────────────┤                                  
│ Envoy  │ ❌ 仅在README提及 │ 未实现                              │                                  
└────────┴───────────────────┴─────────────────────────────────────┘                                  
当前问题                                                                                              
                                                                                                      
1. 服务发现:网关通过硬编码环境变量连接后端服务                                                       
2. 配置管理:分散在环境变量中,缺乏统一管理                                                           
3. 健康检查:没有服务级别的健康检查机制                                                               
4. 负载均衡:单点直连,无负载均衡                                                                     
                                                                                                      
推荐方案:etcd + Envoy                                                                                
                                                                                                      
考虑到项目已经有完善的 etcd 适配器,推荐使用 etcd 作为配置中心和服务注册中心,配合 Envoy 做服务代理。 
                                                                                                      
架构设计                                                                                              
                                                                                                      
┌─────────────────────────────────────────────────────────────────┐                                   
│                        客户端请求                                │                                  
└─────────────────────────────────────────────────────────────────┘                                   
                                │                                                                     
                                ▼                                                                     
┌─────────────────────────────────────────────────────────────────┐                                   
│                     Envoy Front Proxy                           │                                   
│  (HTTP/gRPC 路由、负载均衡、熔断、限流、TLS终止)                   │                                
└─────────────────────────────────────────────────────────────────┘                                   
                                │                                                                     
        ┌───────────────────────┼───────────────────────┐                                             
        ▼                       ▼                       ▼                                             
┌───────────────┐      ┌───────────────┐       ┌───────────────┐                                      
│   Gateway     │      │  iam-access   │       │  iam-tenant   │                                      
│  (REST→gRPC)  │      │   :50051      │       │    :50053     │                                      
└───────────────┘      └───────────────┘       └───────────────┘                                      
        │                       │                       │                                             
        └───────────────────────┼───────────────────────┘                                             
                                ▼                                                                     
┌─────────────────────────────────────────────────────────────────┐                                   
│                          etcd                                   │                                   
│  - 服务注册 (/services/iam-tenant/instances/xxx)                │                                   
│  - 配置管理 (/config/iam-tenant/...)                            │                                   
│  - 领导选举 (/election/...)                                     │                                   
└─────────────────────────────────────────────────────────────────┘                                   
                                │                                                                     
                                ▼                                                                     
┌─────────────────────────────────────────────────────────────────┐                                   
│                         Vault                                   │                                   
│              (敏感配置:JWT密钥、数据库密码等)                     │                                
└─────────────────────────────────────────────────────────────────┘                                   
                                                                                                      
让我先查看 bootstrap 的实现,了解服务启动流程。      

最佳方案:etcd 服务注册/发现 + Vault 敏感配置                                                         
                                                                                                      
为什么选择 etcd 而不是 Consul?                                                                       
┌─────────────┬────────────────────────────────────────────────┬─────────────────┐                    
│   对比项    │                      etcd                      │     Consul      │                    
├─────────────┼────────────────────────────────────────────────┼─────────────────┤                    
│ 当前状态    │ ✅ 已有完整适配器(KV、Watch、锁、租约、事务) │ ❌ 需要从零开发 │                    
├─────────────┼────────────────────────────────────────────────┼─────────────────┤                    
│ 配置管理    │ ✅ 原生支持                                    │ ✅ 支持         │                    
├─────────────┼────────────────────────────────────────────────┼─────────────────┤                    
│ 服务发现    │ ✅ 通过租约+Watch实现                          │ ✅ 原生支持     │                    
├─────────────┼────────────────────────────────────────────────┼─────────────────┤                    
│ 健康检查    │ 需要自己实现(但 bootstrap 已有)              │ 原生支持        │                    
├─────────────┼────────────────────────────────────────────────┼─────────────────┤                    
│ 复杂度      │ 中等                                           │ 较高            │                    
├─────────────┼────────────────────────────────────────────────┼─────────────────┤                    
│ 与 K8s 集成 │ ✅ 原生(K8s 就用 etcd)                       │ 需要额外配置    │                    
└─────────────┴────────────────────────────────────────────────┴─────────────────┘                    
结论:etcd 已经具备所有能力,且适配器完善,是最佳选择。                                               
                                                                                                      
---                                                                                                   
架构设计                                                                                              
                                                                                                      
┌─────────────────────────────────────────────────────────────────────┐                               
│                           架构总览                                   │                              
├─────────────────────────────────────────────────────────────────────┤                               
│                                                                     │                               
│   ┌─────────────┐                                                   │                               
│   │   Client    │                                                   │                               
│   └──────┬──────┘                                                   │                               
│          │ HTTP/gRPC                                                │                               
│          ▼                                                          │                               
│   ┌─────────────┐      服务发现        ┌─────────────┐              │                               
│   │   Gateway   │◄────────────────────►│    etcd     │              │                               
│   │   :8080     │      (Watch)         │  配置中心   │              │                               
│   └──────┬──────┘                      │  服务注册   │              │                               
│          │                             └──────┬──────┘              │                               
│          │ gRPC (动态端点)                    │                     │                               
│          ▼                                    │                     │                               
│   ┌─────────────────────────────────────┐    │                     │                                
│   │         微服务集群                   │    │                     │                               
│   │  ┌───────────┐  ┌───────────┐       │    │                     │                                
│   │  │iam-access │  │iam-tenant │  ...  │◄───┘ 服务注册            │                                
│   │  │  :50051   │  │  :50053   │       │      (租约+心跳)          │                               
│   │  └───────────┘  └───────────┘       │                          │                                
│   └                                                                     
当前网关的问题                                                                                        
                                                                                                      
gateway/src/config.rs:                                                                                
  iam_endpoint: env::var("IAM_ENDPOINT").unwrap_or_else(|_| "http://127.0.0.1:50051".to_string())     
  tenant_endpoint: env::var("TENANT_ENDPOINT").unwrap_or_else(|_|                                     
"http://127.0.0.1:50053".to_string())                                                                 
                                                                                                      
gateway/src/main.rs:103-108:                                                                          
  let grpc_clients = grpc::GrpcClients::new_multi(                                                    
      config.iam_endpoint.clone(),                                                                    
      config.tenant_endpoint.clone()                                                                  
  ).await.expect("Failed to connect to services");                                                    
                                                                                                      
问题:                                                                                                
1. 服务端点是硬编码的环境变量默认值                                                                   
2. 启动时一次性连接,没有动态发现                                                                     
3. 服务挂了或迁移了,网关不知道                                                                       
4. 新增服务需要改代码添加新的 endpoint 配置                                                           
                                                                                                      
---                                                                                                   
最佳方案:etcd 服务注册/发现                                                                          
                                                                                                      
架构图                                                                                                
                                                                                                      
┌─────────────────────────────────────────────────────────────────────┐                               
│                                                                     │                               
│    ┌──────────┐         HTTP/gRPC          ┌──────────────────┐    │                                
│    │  Client  │ ──────────────────────────►│     Gateway      │    │                                
│    └──────────┘                            │     :8080        │    │                                
│                                            └────────┬─────────┘    │                                
│                                                     │              │                                
│                              ┌──────────────────────┼──────────────┤                                
│                              │                      │              │                                
│                              │  Watch 服务变更       │ gRPC 调用    │                               
│                              │  /services/*         │ (动态端点)   │                                
│                              ▼                      ▼              │                                
│    ┌─────────────────────────────────────────────────────────────┐ │                                
│    │                         etcd                                │ │                                
│    │                                                             │ │                                
│    │  /services/iam-access/instances/uuid1  = {host, port, ...}  │ │                                
│    │  /services/iam-tenant/instances/uuid2  = {host, port, ...}  │ │                                
│    │  /services/gateway/instances/uuid3     = {host, port, ...}  │ │                                
│    │                                                             │ │                                
│    │  /config/gateway/...                   = {...}              │ │                                
│    │  /config/iam-tenant/...                = {...}              │ │                                
│    │                                                             │ │                                
│    └──────────────────────────────────────▲──────────────────────┘ │                                
│                                           │                        │                                
│         ┌─────────────────────────────────┼─────────────────────┐  │                                
│         │                                 │                     │  │                                
│         │  服务注册 (租约 + 心跳)           │                     │  │                              
│         │                                 │                     │  │                                
│    ┌────┴─────┐    ┌───────────┐    ┌─────┴─────┐               │  │                                
│    │iam-access│    │iam-tenant │    │  其他服务  │               │  │                               
│    │  :50051  │    │  :50053   │    │    ...    │               │  │                                
│    └──────────┘    └───────────┘    └───────────┘               │  │                                
│                                                                     │                               
└─────────────────────────────────────────────────────────────────────┘                               
                                                                                                      
需要实现的组件                                                                                        
┌──────────────────┬───────────────────────────────────────┬────────────────────────┐                 
│       组件       │                 位置                  │          功能          │                 
├──────────────────┼───────────────────────────────────────┼────────────────────────┤                 
│ ServiceRegistry  │ crates/adapters/etcd/src/registry.rs  │ 服务注册(租约+心跳)  │                 
├──────────────────┼───────────────────────────────────────┼────────────────────────┤                 
│ ServiceDiscovery │ crates/adapters/etcd/src/discovery.rs │ 服务发现(Watch+缓存) │                 
├──────────────────┼───────────────────────────────────────┼────────────────────────┤                 
│ bootstrap 集成   │ bootstrap/src/starter.rs              │ 启动时自动注册         │                 
├──────────────────┼───────────────────────────────────────┼────────────────────────┤                 
│ gateway 集成     │ gateway/src/grpc/mod.rs               │ 动态获取服务端点       │                 
└──────────────────┴───────────────────────────────────────┴────────────────────────┘                 
etcd 键结构设计                                                                                       
                                                                                                      
/services/{service_name}/instances/{instance_id}                                                      
  └── JSON: {                                                                                         
        "id": "uuid",                                                                                 
        "name": "iam-tenant",                                                                         
        "host": "192.168.1.10",                                                                       
        "port": 50053,                                                                                
        "health_port": 51053,                                                                         
        "status": "healthy",                                                                          
        "metadata": {                                                                                 
          "version": "1.0.0",                                                                         
          "region": "cn-east"                                                                         
        },                                                                                            
        "registered_at": "2024-01-01T00:00:00Z"                                                       
      }                                                                                               
                                                                                                      
/config/{env}/{service_name}/...                                                                      
  └── 服务配置(非敏感)                                                                              
                                                                                                      
---                                                                                                   
要我开始实现这个方案吗?需要:                                                                        
                                                                                                      
1. 扩展 etcd 适配器 - 添加 ServiceRegistry 和 ServiceDiscovery                                        
2. 修改 bootstrap - 服务启动时自动注册到 etcd                                                         
3. 修改 gateway - 从 etcd 动态获取服务端点,Watch 变更                                                
4. 删除各服务的 config/ 目录 - 统一使用 etcd 配置                                                     
                                                            
完成总结                                                                                              
                                                                                                      
已成功实现 etcd 服务注册/发现 方案,以下是完成的工作:                                                
                                                                                                      
1. 扩展 etcd 适配器                                                                                   
                                                                                                      
新增文件:                                                                                            
- crates/adapters/etcd/src/registry.rs - 服务注册模块                                                 
  - ServiceInstance - 服务实例数据结构                                                                
  - ServiceRegistry - 服务注册器(租约、心跳、注销)                                                  
  - RegistryConfig - 注册配置                                                                         
- crates/adapters/etcd/src/discovery.rs - 服务发现模块                                                
  - ServiceDiscovery - 服务发现器(缓存、Watch、负载均衡)                                            
  - ServiceDiscoveryBuilder - 构建器模式                                                              
  - LoadBalanceStrategy - 轮询/随机/首个                                                              
                                                                                                      
2. 修改 bootstrap                                                                                     
                                                                                                      
新增文件:                                                                                            
- bootstrap/src/service_registry.rs - 服务注册管理器                                                  
                                                                                                      
修改文件:                                                                                            
- bootstrap/src/starter.rs - run() 函数现在会:                                                       
  - 启动时自动注册服务到 etcd                                                                         
  - graceful shutdown 时自动注销                                                                      
                                                                                                      
3. 修改 gateway                                                                                       
                                                                                                      
新增文件:                                                                                            
- gateway/src/discovery.rs - 服务发现管理器                                                           
                                                                                                      
修改文件:                                                                                            
- gateway/src/config.rs - 添加 etcd 配置                                                              
- gateway/src/main.rs - 集成服务发现                                                                  
                                                                                                      
4. iam-tenant 配置                                                                                    
                                                                                                      
新增文件:                                                                                            
- services/iam-tenant/config/default.toml                                                             
- services/iam-tenant/config/development.toml                                                         
- services/iam-tenant/config/production.toml                                                          
- scripts/init-etcd-config.sh                                                                         
                                                                                                      
---                                                                                                   
使用方式                                                                                              
                                                                                                      
本地开发(不使用 etcd):                                                                             
# 直接启动,使用静态配置                                                                              
cargo run -p iam-tenant                                                                               
cargo run -p gateway                                                                                  
                                                                                                      
生产环境(使用 etcd):                                                                               
# 1. 初始化 etcd 配置                                                                                 
./scripts/init-etcd-config.sh prod                                                                    
                                                                                                      
# 2. 启动服务(自动注册到 etcd)                                                                      
ETCD_ENDPOINTS                                                                                        
                                                                                                      
✻ Brewed for 13m 15s                                                                                    
                                                                                                      
❯ 继续                                                                                                  
                                                                                                      
⏺ 好的,让我继续完善说明文档。                                                                          
                                                                                                      
生产环境(使用 etcd):                                                                               
# 1. 初始化 etcd 配置                                                                                 
./scripts/init-etcd-config.sh prod                                                                    
                                                                                                      
# 2. 启动服务(自动注册到 etcd)                                                                      
export ETCD_ENDPOINTS="http://etcd1:2379,http://etcd2:2379,http://etcd3:2379"                         
cargo run -p iam-tenant                                                                               
cargo run -p iam-access                                                                               
                                                                                                      
# 3. 启动网关(自动从 etcd 发现服务)                                                                 
export ETCD_ENDPOINTS="http://etcd1:2379,http://etcd2:2379,http://etcd3:2379"                         
export ENABLE_SERVICE_DISCOVERY=true                                                                  
cargo run -p gateway                                                                                  
                                                                                                      
---                                                                                                   
架构流程                                                                                              
                                                                                                      
服务启动流程:                                                                                         
┌─────────────┐     ┌─────────────┐     ┌─────────────┐                                               
│  bootstrap  │────►│   etcd      │◄────│   gateway   │                                               
│  run()      │     │             │     │             │                                               
└─────────────┘     └─────────────┘     └─────────────┘                                               
      │                   ▲                   │                                                       
      │ 1. 注册服务       │ 3. Watch         │ 2. 发现服务                                            
      │    (租约+心跳)    │    服务变更       │    获取端点                                           
      ▼                   │                   ▼                                                       
┌─────────────┐           │            ┌─────────────┐                                                
│ iam-tenant  │───────────┘            │ gRPC 调用   │                                                
│ :50053      │◄───────────────────────│             │                                                
└─────────────┘                        └─────────────┘                                                
                                                                                                      
etcd 键结构                                                                                           
                                                                                                      
/services/                                                                                            
├── iam-access/                                                                                       
│   └── instances/                                                                                    
│       └── {uuid}  →  {"host":"192.168.1.10","port":50051,"status":"healthy",...}                    
├── iam-tenant/                                                                                       
│   └── instances/                                                                                    
│       └── {uuid}  →  {"host":"192.168.1.11","port":50053,"status":"healthy",...}                    
└── gateway/                                                                                          
    └── instances/                                                                                    
        └── {uuid}  →  {"host":"192.168.1.12","port":8080,"status":"healthy",...}                     
                                                                                                      
环境变量                                                                                              
┌──────────────────────────┬───────────────────────────┬───────────────────────┐                      
│           变量           │           说明            │         示例          │                      
├──────────────────────────┼───────────────────────────┼───────────────────────┤                      
│ ETCD_ENDPOINTS           │ etcd 端点列表(逗号分隔) │ http://localhost:2379 │                      
├──────────────────────────┼───────────────────────────┼───────────────────────┤                      
│ ENABLE_SERVICE_DISCOVERY │ 是否启用服务发现          │ true                  │                      
├──────────────────────────┼───────────────────────────┼───────────────────────┤                      
│ SERVICE_HOST             │ 服务注册时使用的主机地址  │ 192.168.1.10          │                      
├──────────────────────────┼───────────────────────────┼───────────────────────┤                      
│ POD_IP                   │ K8s Pod IP(自动检测)    │ -                     │                      
└──────────────────────────┴───────────────────────────┴───────────────────────┘                      
---                                                                                                   
这个方案的优点:                                                                                      
1. 向后兼容 - 不配置 etcd 时使用静态端点                                                              
2. 自动注册 - 服务启动时自动注册,关闭时自动注销                                                      
3. 心跳续约 - 30秒租约,10秒心跳,服务挂掉自动剔除                                                    
4. 动态发现 - gateway Watch 服务变更,实时更新                                                        
5. 负载均衡 - 支持轮询、随机、首个可用策略    

构建结果                                                                                              
                                                                                                      
✅ bootstrap    - 编译成功                                                                            
✅ gateway      - 编译成功 (7 warnings)                                                               
✅ iam-tenant   - 编译成功 (35 warnings)                                                              
                                                                                                      
所有核心组件都已成功构建。警告主要是:                                                                
- gateway: 一些未使用的导入和方法(预留的功能)                                                       
- iam-tenant: 大量未使用的领域方法和仓库方法(服务还在开发中) 

gRPC 服务实现已经完成了所有 23 个 RPC 方法。让我总结一下当前状态:                                    
                                                                                                      
gRPC 服务实现状态                                                                                     
                                                                                                      
已实现的 23 个 RPC 方法:                                                                             
分类: 租户 CRUD                                                                                       
方法: CreateTenant, GetTenant, UpdateTenant, DeleteTenant, ListTenants                                
状态: ✅                                                                                              
────────────────────────────────────────                                                              
分类: 生命周期                                                                                        
方法: ActivateTenant, SuspendTenant, StartTrial                                                       
状态: ✅                                                                                              
────────────────────────────────────────                                                              
分类: 订阅管理                                                                                        
方法: CreateSubscription, GetSubscription, UpgradeSubscription, DowngradeSubscription                 
状态: ✅                                                                                              
────────────────────────────────────────                                                              
分类: 配额管理                                                                                        
方法: CheckQuota, UpdateQuota, GetQuota, ListQuotas                                                   
状态: ✅                                                                                              
────────────────────────────────────────                                                              
分类: 特性开关                                                                                        
方法: CheckFeatureEnabled, GetFeatureFlag, ToggleFeature                                              
状态: ✅                                                                                              
────────────────────────────────────────                                                              
分类: 租户配置                                                                                        
方法: GetConfig, UpdateConfig                                                                         
状态: ✅                                                                                              
────────────────────────────────────────                                                              
分类: 跨服务集成                                                                                      
方法: GetTenantStatus, BatchGetTenantStatus                                                           
状态: ✅                                                                                              
编译警告分析:                                                                                        
                                                                                                      
警告主要来自领域层中尚未通过 gRPC 暴露的方法:                                                        
- resume() - 恢复租户                                                                                 
- mark_payment_overdue() - 标记付款逾期                                                               
- start_offboarding() - 开始下线流程                                                                  
- archive() - 归档租户                                                                                
- delete() - 删除租户(硬删除)                                                                       
- set_custom_domain() - 设置自定义域名                                                                
- migrate_region() - 迁移区域                                                                         
                                                                                                      
这些是 8 状态状态机的一部分,但尚未有对应的 gRPC 接口。                                               
                                                                                                      
下一步选择:                                                                                          
                                                                                                      
1. 扩展 gRPC 接口 - 为上述领域方法添加 RPC 定义和实现                                                 
2. 清理警告 - 暂时用 #[allow(dead_code)] 标记或移除未使用代码                                         
3. 继续 Gateway 集成 - 当前 gRPC 服务已可用                                                           
4. 添加测试 - 为已实现的方法编写测试      
posted @ 2026-02-05 19:43  eqy  阅读(5)  评论(0)    收藏  举报