【OpenClaw 架构解析 03】Gateway 网关层:消息路由的核心枢纽
·
前言
Gateway 是 OpenClaw 的核心枢纽,承担着连接管理、会话路由、认证授权等关键职责。本篇文章将深入剖析 Gateway 的设计与实现。
1. Gateway 核心职责
Gateway 作为 OpenClaw 的中央调度器,主要负责:
┌─────────────────────────────────────────────────────────────────┐
│ Gateway 核心职责 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ ┌───────────────────────────────────────────────────────────┐ │
│ │ 🔌 连接管理 │ │
│ │ • 客户端连接建立与维护 │ │
│ │ • WebSocket 握手处理 │ │
│ │ • 心跳检测与断线重连 │ │
│ └───────────────────────────────────────────────────────────┘ │
│ │
│ ┌───────────────────────────────────────────────────────────┐ │
│ │ 💬 会话管理 │ │
│ │ • Session 创建、维护、销毁 │ │
│ │ • 上下文加载与保存 │ │
│ │ • 多会话并发处理 │ │
│ └───────────────────────────────────────────────────────────┘ │
│ │
│ ┌───────────────────────────────────────────────────────────┐ │
│ │ 🔐 认证授权 │ │
│ │ • 设备配对码验证 │ │
│ │ • OAuth 令牌管理 │ │
│ │ • 基于能力的访问控制 │ │
│ └───────────────────────────────────────────────────────────┘ │
│ │
│ ┌───────────────────────────────────────────────────────────┐ │
│ │ ✅ 执行审批 │ │
│ │ • 高风险操作审批流程 │ │
│ │ • 白名单/黑名单管理 │ │
│ │ • SSRF 防护 │ │
│ └───────────────────────────────────────────────────────────┘ │
│ │
│ ┌───────────────────────────────────────────────────────────┐ │
│ │ ⏰ 定时任务 │ │
│ │ • Cron 任务调度 │ │
│ │ • 周期性提醒 │ │
│ │ • 延迟任务处理 │ │
│ └───────────────────────────────────────────────────────────┘ │
│ │
│ ┌───────────────────────────────────────────────────────────┐ │
│ │ 🎨 控制面板 │ │
│ │ • Web UI 服务 │ │
│ │ • 实时状态监控 │ │
│ │ • 配置管理界面 │ │
│ └───────────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────┘
2. Gateway 目录结构
src/gateway/
├── boot.ts # 启动引导逻辑
├── server-chat.ts # 聊天核心服务
├── server-control.ts # 控制面板服务
├── server-cron.ts # Cron 调度服务
├── auth.ts # 认证授权
├── hooks.ts # 钩子系统
├── delivery.ts # 消息投递
├── session.ts # 会话管理
├── pairing.ts # 设备配对
├── config.ts # 配置管理
│
├── handlers/ # 请求处理器
│ ├── chat-handler.ts
│ ├── control-handler.ts
│ └── cron-handler.ts
│
├── middleware/ # 中间件
│ ├── auth-middleware.ts
│ ├── rate-limit.ts
│ └── logging.ts
│
└── builtin-hooks/ # 内置钩子
├── auto-reply.ts
└── ...
3. 启动流程
Gateway 的启动流程如下:
┌─────────────────────────────────────────────────────────────────┐
│ Gateway 启动流程 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ 1. 加载配置 │
│ └── openclaw.yaml → 配置验证 (Zod Schema) │
│ │ │
│ ▼ │
│ 2. 初始化存储 │
│ └── Session Store / Memory Store / Config │
│ │ │
│ ▼ │
│ 3. 加载插件 │
│ └── extensions/ → manifest.json5 → 安全扫描 → 注册 │
│ │ │
│ ▼ │
│ 4. 初始化通道 │
│ └── 连接各消息平台 Webhook / WebSocket │
│ │ │
│ ▼ │
│ 5. 启动服务 │
│ └── HTTP Server │ WebSocket Server │ Control UI │
│ │ │
│ ▼ │
│ 6. 任务调度 │
│ └── Cron 定时任务启动 │
│ │
└─────────────────────────────────────────────────────────────────┘
3.1 核心代码 - 启动引导
// src/gateway/boot.ts (简化版)
export async function boot(config: OpenClawConfig) {
// 1. 配置验证
const validatedConfig = await validateConfig(config);
// 2. 初始化存储
const stores = await initStores(validatedConfig);
// 3. 加载插件
const plugins = await loadPlugins({
extensionsDir: validatedConfig.extensionsDir,
security: validatedConfig.security,
});
// 4. 初始化 Agent
const agent = await initAgent({
plugins,
config: validatedConfig.agent,
});
// 5. 初始化 Gateway
const gateway = await initGateway({
agent,
stores,
plugins,
config: validatedConfig.gateway,
});
// 6. 启动服务
await gateway.start();
return gateway;
}
4. 会话管理
4.1 Session 数据结构
// 会话结构定义
interface Session {
id: string; // 会话唯一 ID
agentId: string; // Agent ID
channelId: string; // 渠道 ID
accountId: string; // 账户 ID
// 上下文
context: {
messages: Message[]; // 消息历史
files: FileRef[]; // 关联文件
metadata: Record<string, unknown>;
};
// 状态
state: "active" | "paused" | "closed";
// 时间戳
createdAt: Date;
updatedAt: Date;
lastActivityAt: Date;
}
4.2 Session 生命周期
┌─────────────────────────────────────────────────────────────────┐
│ Session 生命周期 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ create() ───────────────────────────────────────────► [active]│
│ │ │
│ │ │◄──── 用户发消息 ────┤ │
│ │ │ │ │
│ │ ▼ ▼ │
│ │ [active] ────── 用户长时间不活动 ──────► [paused] │
│ │ │ │ │
│ │ │◄──── 用户恢复 ───────┘ │ │
│ │ │ │ │
│ │ ▼ │ │
│ │ [active] ──── 显式关闭 / 超时 ────► [closed] │
│ │ │ │
│ └────────────────────────────────────────────────────────┘ │
│ │
│ ● [active] : 正常处理消息 │
│ ● [paused] : 等待恢复,可快速激活 │
│ ● [closed] : 释放资源,可重新创建 │
│ │
└─────────────────────────────────────────────────────────────────┘
5. 消息处理流程
5.1 完整处理链路
用户消息 (Telegram/Discord/Slack/...)
│
▼
┌─────────────────────────────────────────────────────────────────┐
│ 1. Channel Transport │
│ └── 接收并解析平台特定消息格式 │
└─────────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────┐
│ 2. Inbound Processor │
│ ├── 消息验证 │
│ ├── 反垃圾处理 │
│ └── 速率限制检查 │
└─────────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────┐
│ 3. Authentication │
│ ├── 设备验证 │
│ ├── 权限检查 │
│ └── 白名单验证 │
└─────────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────┐
│ 4. Session Manager │
│ ├── 加载/创建 Session │
│ ├── 上下文恢复 │
│ └── 消息路由 │
└─────────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────┐
│ 5. Pre-Processing Hooks │
│ └── before-agent-start: 消息预处理 │
└─────────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────┐
│ 6. Agent Processing │
│ ├── 上下文构建 │
│ ├── AI 模型调用 │
│ └── 工具执行 │
└─────────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────┐
│ 7. Post-Processing Hooks │
│ └── before-agent-reply: 响应后处理 │
└─────────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────┐
│ 8. Approval Flow (高风险操作) │
│ └── 请求审批 / 执行 / 返回结果 │
└─────────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────┐
│ 9. Outbound Dispatcher │
│ ├── 响应格式化 │
│ ├── 多平台适配 │
│ └── 投递确认 │
└─────────────────────────────────────────────────────────────────┘
│
▼
响应发送 (原路返回)
6. 认证授权
6.1 认证流程
┌─────────────────────────────────────────────────────────────────┐
│ 认证流程 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ [客户端请求] │
│ │ │
│ ▼ │
│ ┌─────────────┐ │
│ │ Token 验证 │ ◄── Bearer Token / API Key │
│ └──────┬──────┘ │
│ │ │
│ ▼ │
│ ┌─────────────┐ │
│ │ 设备配对 │ ◄── Pairing Code │
│ └──────┬──────┘ │
│ │ │
│ ▼ │
│ ┌─────────────┐ │
│ │ 权限检查 │ ◄── Capability-based Access │
│ └──────┬──────┘ │
│ │ │
│ ▼ │
│ ┌─────────────┐ │
│ │ 请求放行 │ │
│ └─────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────┘
6.2 Capability 访问控制
// 能力定义示例
const capabilities = {
"telegram:read": "读取 Telegram 消息",
"telegram:send": "发送 Telegram 消息",
"file:read": "读取文件",
"file:write": "写入文件",
"shell:exec": "执行 Shell 命令",
"browser:control": "控制浏览器",
};
// 权限检查
async function checkCapability(
session: Session,
capability: string
): Promise<boolean> {
const userCaps = await getUserCapabilities(session.userId);
return userCaps.includes(capability);
}
7. 控制面板
Gateway 内置 Web 控制面板,提供:
┌─────────────────────────────────────────────────────────────────┐
│ 控制面板功能 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ 📊 Dashboard │
│ ├── 系统状态概览 │
│ ├── 活跃会话统计 │
│ ├── API 使用量 │
│ └── 最近活动 │
│ │
│ 💬 会话管理 │
│ ├── 会话列表 │
│ ├── 会话详情 │
│ └── 历史记录搜索 │
│ │
│ 🔌 插件管理 │
│ ├── 已安装插件 │
│ ├── 插件市场 │
│ └── 插件配置 │
│ │
│ ⚙️ 系统配置 │
│ ├── 模型配置 │
│ ├── 安全设置 │
│ └── 渠道配置 │
│ │
│ 📜 日志查看 │
│ ├── 操作日志 │
│ └── 错误日志 │
│ │
└─────────────────────────────────────────────────────────────────┘
8. 本章小结
┌─────────────────────────────────────────────────────────────────┐
│ 本章要点 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ 🎯 Gateway 核心职责 │
│ ├── 连接管理: 客户端连接、WebSocket、心跳检测 │
│ ├── 会话管理: Session CRUD、上下文、生命周期 │
│ ├── 认证授权: Token、设备配对、能力访问控制 │
│ ├── 执行审批: 高风险操作审批、白名单管理 │
│ └── 控制面板: Web UI、监控、配置管理 │
│ │
│ 🔄 消息处理链路 │
│ └── 接收 → 验证 → 认证 → 路由 → Hooks → Agent → 响应 │
│ │
│ 📁 关键文件 │
│ ├── boot.ts: 启动引导 │
│ ├── server-chat.ts: 聊天服务 │
│ └── auth.ts: 认证授权 │
│ │
└─────────────────────────────────────────────────────────────────┘
系列导航
| 章节 | 标题 | 状态 |
|---|---|---|
| 01 | OpenClaw 是什么? | ✅ 已发布 |
| 02 | 系统架构全景图 | ✅ 已发布 |
| 03 | Gateway 网关层(本文) | ✅ 已发布 |
| 04 | Agents 模块:AI 大脑的构建之道 | 🔜 下一章 |
| … | … | … |
如有问题欢迎在评论区留言!
更多推荐




所有评论(0)