Croupier 采用五层分布式架构,实现权限控制、函数路由、边缘代理和 UI 展示的完全分离。
┌────────────────────────────────────────────────────────────┐
│ 第一层:展示层 (Display Layer) │
│ ┌──────────────────────────────────────────────────────┐ │
│ │ Web Dashboard (React + Ant Design + ProComponents)│ │
│ │ - 描述符驱动 UI 自动生成 │ │
│ │ - 实时进度与日志流式展示 │ │
│ │ - 审批流程可视化 │ │
│ └──────────────────────────────────────────────────────┘ │
└────────────────────────────────────────────────────────────┘
▼ HTTPS/TLS (8080)
┌────────────────────────────────────────────────────────────┐
│ 第二层:控制层 (Control Layer) │
│ ┌──────────────────────────────────────────────────────┐ │
│ │ Server (HTTP + gRPC) │ │
│ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ │
│ │ │ RBAC/ABAC │ │ 函数路由 │ │ 审计日志 │ │ │
│ │ │ 权限引擎 │ │ 负载均衡 │ │ 审批流程 │ │ │
│ │ └─────────────┘ └─────────────┘ └─────────────┘ │ │
│ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ │
│ │ │ 描述符管理 │ │ Provider │ │ Pack 管理 │ │ │
│ │ │ │ │ Manifest │ │ │ │ │
│ │ └─────────────┘ └─────────────┘ └─────────────┘ │ │
│ └──────────────────────────────────────────────────────┘ │
└────────────────────────────────────────────────────────────┘
▼ mTLS (8443)
┌────────────────────────────────────────────────────────────┐
│ 第三层:边缘层 (Edge Layer) │
│ ┌──────────────────────────────────────────────────────┐ │
│ │ Edge Proxy (可选,DMZ 部署) │ │
│ │ - 双向隧道转发 │ │
│ │ - 隧道复用 (多路复用) │ │
│ │ - 流量转发 (Server ↔ Agent) │ │
│ │ - 连接管理与故障恢复 │ │
│ └──────────────────────────────────────────────────────┘ │
└────────────────────────────────────────────────────────────┘
▼ mTLS (内部)
┌────────────────────────────────────────────────────────────┐
│ 第四层:代理层 (Agent Layer) │
│ ┌──────────────────────────────────────────────────────┐ │
│ │ Agent (游戏内网部署) │ │
│ │ ┌────────────────────────────────────────────────┐ │ │
│ │ │ Function Registry │ │ │
│ │ │ - 函数注册/注销 │ │ │
│ │ │ - 心跳保活 │ │ │
│ │ │ - 进程管理 (ProcessSession) │ │ │
│ │ └────────────────────────────────────────────────┘ │ │
│ │ ┌────────────────────────────────────────────────┐ │ │
│ │ │ Job Executor │ │ │
│ │ │ - 同步调用 (Invoke) │ │ │
│ │ │ - 异步作业 (StartJob) │ │ │
│ │ │ - 流式事件 (StreamJob) │ │ │
│ │ │ - 作业取消 (CancelJob) │ │ │
│ │ └────────────────────────────────────────────────┘ │ │
│ │ ┌────────────────────────────────────────────────┐ │ │
│ │ │ Local Control Service │ │ │
│ │ │ - SDK 注册 (RegisterService) │ │ │
│ │ │ - 本地服务发现 │ │ │
│ │ └────────────────────────────────────────────────┘ │ │
│ └──────────────────────────────────────────────────────┘ │
└────────────────────────────────────────────────────────────┘
▼ gRPC (19090)
┌────────────────────────────────────────────────────────────┐
│ 第五层:业务层 (Service Layer) │
│ ┌──────────────────────────────────────────────────────┐ │
│ │ Game Server + SDK │ │
│ │ - 函数实现 (业务逻辑) │ │
│ │ - 函数定义 (Proto / 描述符) │ │
│ │ - gRPC 服务端 │ │
│ └──────────────────────────────────────────────────────┘ │
└────────────────────────────────────────────────────────────┘
Dashboard ──HTTPS──> Server ──mTLS──> Agent ──gRPC──> Game Server
Dashboard ──HTTPS──> Server ──mTLS──> Edge ──mTLS──> Agent ──gRPC──> Game Server
↑ ↑
(内网) (DMZ/公网)
| 组件 | 技术栈 | 职责 |
|---|
| Dashboard | React + Ant Design | Web 管理界面 |
| X-Render | FormRender | 表单自动生成 |
| ProTable | Ant Design Pro | 列表自动生成 |
{
"id": "player.ban",
"params": {
"type": "object",
"properties": {
"player_id": {"type": "string", "title": "玩家ID"},
"duration": {"type": "integer", "title": "封禁时长"}
}
}
}
自动生成的 UI:
- 权限控制 (RBAC/ABAC)
- 函数路由与负载均衡
- 审批工作流
- 审计日志记录
func (e *Engine) Check(ctx context.Context, req *CheckRequest) *CheckResponse {
if !e.rbac.HasPermission(ctx.User, req.Permission) {
return Denied("missing permission")
}
if !e.abac.Evaluate(ctx.User, req.Attributes) {
return Denied("abac denied")
}
if e.approval.Required(req) {
return PendingApproval()
}
return Approved()
}
type Router interface {
SelectAgent(functionID string, agents []Agent) (Agent, error)
}
type RoundRobinRouter struct{}
type ConsistentHashRouter struct{}
type LeastConnectionRouter struct{}
type AuditLog struct {
AuditID string
Timestamp time.Time
User UserInfo
Action string
Target string
Result string
Hash string
}
Server
├── HTTP API Server :8080
│ ├── REST API
│ ├── WebSocket
│ └── SSE Events
│
├── gRPC Server :8443
│ ├── ControlService (Agent 管理)
│ ├── FunctionService (函数调用)
│ └── RegistryService (注册中心)
│
├── Auth Engine
│ ├── RBAC
│ ├── ABAC
│ └── JWT/OIDC
│
├── Approval Engine
│ ├── Two-person rule
│ └── Workflow
│
└── Audit Log
├── Events
├── Chain
└── Sensitive masking
当 Server 在内网,需要通过 Edge 暴露到公网时使用。
公网 ──TLS──> Edge ──mTLS──> Server ──mTLS──> Agent
| 功能 | 说明 |
|---|
| 隧道复用 | 多个连接共享隧道 |
| 流量转发 | 请求/响应转发 |
| 连接管理 | 保持长连接池 |
| 安全隔离 | DMZ 部署 |
Agent
├── gRPC Client (出站)
│ └── 连接 Server (mTLS)
│
├── gRPC Server (本地)
│ └── :19090 (LocalControlService)
│
├── Function Registry
│ ├── 注册函数
│ ├── 心跳保活
│ ├── 更新通知
│ └── 进程管理 (ProcessSession)
│
├── Job Executor
│ ├── 同步调用 (Invoke)
│ ├── 异步作业 (StartJob)
│ ├── 流式事件 (StreamJob)
│ └── 作业取消 (CancelJob)
│
└── Downloader
└── 函数包下载
| 特性 | 说明 |
|---|
| 出站连接 | 主动连接 Server,穿透内网 |
| 函数注册 | 向 Server 注册本地函数 |
| 调用转发 | 转发 Server 调用到 Game Server |
| 作业执行 | 支持长时间运行的异步作业 |
| 热重载 | 函数更新无需重启 |
Game Server
└── Croupier SDK
├── 函数定义
├── 函数实现
├── gRPC 客户端
└── 类型安全
- 函数定义:定义函数接口
- 函数实现:实现业务逻辑
- 类型安全:编译时类型检查
- 自动重连:连接断开自动重连
| 层级 | 协议 | 端口 | 安全 |
|---|
| Dashboard → Server | HTTPS (REST) | 8080 | TLS |
| Server ↔ Agent | gRPC | 8443 | mTLS |
| Server ↔ Edge | gRPC | 8443 | mTLS |
| Edge ↔ Agent | gRPC (Tunnel) | 动态 | mTLS |
| Agent → Game Server | gRPC (Local) | 19090 | 可选 mTLS |
| SDK → Agent | gRPC (Local) | 19090 | 可选 mTLS |
message InvokeFunctionRequest {
string game_id = 1;
string env = 2;
string function_id = 3;
google.protobuf.Struct payload = 4;
InvokeOptions options = 5;
}
message InvokeFunctionResponse {
bool success = 1;
google.protobuf.Struct result = 2;
string error = 3;
}
- 展示层专注 UI
- 控制层专注安全和路由
- 业务层专注游戏逻辑
- Dashboard 可独立部署
- Server 可水平扩展
- Agent 随游戏服务器部署
- 各层可使用不同技术
- 接口通过 Protobuf 定义
- 语言无关的集成