Agent X-Ray
RuntimeNotesAbout
Notes/代码工程/Encore/研究摘要

Encore 研究摘要

8 分钟 · 更新于 2026-09-02

文档定位 基于 encore.dev 官方站点、GitHub encoredev/encore 主仓库与官方博客的结构化研究摘要。 与 Pi、DeepAgents 系列研究保持同一调性,但讨论的是后端基础设施层而非 Agent Harness 层;用于内部技术选型与架构思想参考。 实操教程(20 章,含 LLM Rules / Agent Skills / MCP 详解)见 Encore.ts 深度教程

原始资料:资料索引 抓取日期:2026-04-28 项目主页:https://encore.dev/ 源码:https://github.com/encoredev/encore (License:MPL-2.0,最新版本 v1.56.7 / 2026-04-23)


一、Encore 是什么

Encore 一句话定位:

"Open source framework for building robust type-safe distributed systems with declarative infrastructure."

"Batteries included TypeScript framework for building distributed systems."

不是 Web 框架,也不是 IaC 工具,而是把"应用代码 + 基础设施"合并成同一份类型安全的声明式资产——一个由 TypeScript / Go 静态分析器驱动、Rust 运行时承载、可选托管控制平面编排的全栈后端框架

Encore 提供两个语言变体,共享同一套基础设施抽象:

变体语言运行时
Encore.tsTypeScript(Node.js / Bun)Rust core + NAPI bindings(67k LOC)
Encore.goGoGo runtime(42k LOC)

部署模型同样有两个层次:

形态说明
开源框架自托管encore build docker → 标准镜像,丢到任何 K8s/Cloud Run/Fargate
Encore Cloud托管控制面 + BYOC可选 SaaS,把应用解析后自动开通到用户自己的 AWS/GCP

二、核心机制:Application Model

Encore 的根机制是 静态分析 → 应用模型 → 多产物驱动

"Encore works by using static analysis to understand your application."

"Any deviation is caught as a compilation error."

解析器扫描源码,提取以下对象构成一张依赖图

  • Services(每个目录的 encore.service.ts
  • APIsapi(...) 包装的导出函数)
  • Databasesnew SQLDatabase(...)
  • Pub/Sub Topics & Subscriptions
  • Cron Jobs
  • Object Storage Buckets
  • Secrets

这张图同时驱动:

text
                           Application Model
                                  │
        ┌─────────────┬───────────┼───────────┬─────────────┐
        ▼             ▼           ▼           ▼             ▼
   Type-safe     Infrastructure  API Docs   Distributed  Architecture
   Client SDK    Provisioning    +Catalog   Tracing      Diagram
                 (AWS/GCP/Local)                          (Encore Flow)

设计哲学引用:

"When every stack looks different, all tools have to be general purpose."

Encore 的对策是强制收敛技术栈——框架、解析器、运行时协同设计,故能保证模型 100% 准确。代价是丢掉一些"想怎么写就怎么写"的自由。


三、五大原语(Primitives)

所有原语都以"package-level 变量声明"形式表达,由静态分析器识别,由 Rust 运行时实现。

3.1 Service & API

typescript
// hello/encore.service.ts
import { Service } from "encore.dev/service";
export default new Service("hello");

// hello/hello.ts
import { api } from "encore.dev/api";

export const ping = api(
  { expose: true, method: "POST", path: "/ping" },
  async (p: { name: string }): Promise<{ message: string }> => {
    return { message: `Hello ${p.name}!` };
  },
);
  • expose: false(默认)→ 私有 API,仅服务间 / cron 可调
  • expose: true → 公网
  • 路径占位符 :id、通配 *path
  • 类型 Query<T> / Header<"Name"> / Cookie<"Name"> 显式区分参数来源
  • auth: true 调用 auth handler;sensitive: true 自动脱敏 trace
  • 跨服务调用即普通函数调用("Microservices without boilerplate: Call APIs in other services like regular functions.")

3.2 SQL Database

typescript
import { SQLDatabase } from "encore.dev/storage/sqldb";

const db = new SQLDatabase("todo", { migrations: "./migrations" });

await db.exec`INSERT INTO todo_item (title, done) VALUES (${title}, false)`;
const row = await db.queryRow`SELECT title FROM todo_item WHERE id = ${id}`;

// 事务(AsyncDisposable,未 commit 自动回滚)
await using tx = await db.begin();
await db.exec`...`;
await tx.commit();
  • 本地:encore run 自动用 Docker 拉起 encoredotdev/postgres(含 pgvector + PostGIS)。
  • 云:AWS RDS / GCP Cloud SQL。
  • 兼容 Prisma / Drizzle(只要其迁移生成纯 SQL)。

3.3 Pub/Sub

typescript
export const signups = new Topic<SignupEvent>("signups", {
  deliveryGuarantee: "at-least-once",
});

await signups.publish({ userID: id });

new Subscription(signups, "send-welcome-email", {
  handler: async (event) => { /* ... */ },
});
  • 投递:at-least-once(默认)/ exactly-once
  • 有序:orderingAttribute: "shoppingCartID"
  • 失败重试 → DLQ
  • 实现:本地 NSQ / AWS SNS+SQS / GCP Pub/Sub —— 代码不变

3.4 Cron Job

typescript
new CronJob("welcome-email", {
  every: "2h",                  // 必须能整除 24h
  // 或: schedule: "0 4 15 * *"
  endpoint: sendWelcomeEmail,
});
  • 不在本地 / preview 跑,仅生产
  • endpoint 必须幂等且无参

3.5 其它

Object Storage(Bucket)、Caching、Secrets 模式相似——都通过 new XXX(...) 声明,由运行时映射到对应云服务。


四、Rust 运行时:性能与"零 NPM 依赖"的底气

Encore 最反直觉的卖点:TypeScript 框架,但底层是 Rust。架构来自 官方博客:

text
┌─────────────────────────────────────────────────────┐
│  你的 TypeScript 业务代码(不 import express/zod)   │
├─────────────────────────────────────────────────────┤
│  runtimes/js(NAPI bindings)                       │
├─────────────────────────────────────────────────────┤
│  runtimes/core(Rust,67k LOC,Tokio + Hyper)       │
│   ├── HTTP 路由 / 解析 / 校验 / 序列化               │
│   ├── DB 连接池                                      │
│   ├── Pub/Sub(NSQ / SNS+SQS / GCP Pub/Sub)         │
│   ├── 分布式追踪(自定义 varint 二进制协议)         │
│   ├── 指标 / 对象存储 / 缓存                          │
│   └── API Gateway(嵌入 Cloudflare Pingora)         │
├─────────────────────────────────────────────────────┤
│  tsparser(Rust) → 静态分析 → Application Model    │
└─────────────────────────────────────────────────────┘

性能基准(150 并发,5 次取最优)

框架req/sP99
Encore.ts121,0052.3 ms
Bun + Zod101,6113.7 ms
Elysia + TypeBox82,617
Fastify + Ajv62,2074.1 ms
Express + Zod15,70711.9 ms

"9x the throughput of Express.js with 80% less latency"

为什么快

  1. 多线程异步事件循环(Tokio + Hyper),不被 Node 单线程瓶颈卡住
  2. 请求校验在 Rust 层执行——非法请求根本不进 JS(顺带缓解 DoS)
  3. API 网关 Pingora 直接嵌入运行时,TS auth handler 同步执行,免去独立代理 + 序列化
  4. 零 NPM 依赖:业务代码不导入 express / zod / pg / amqplib,缩小 install 时间与攻击面

五、本地开发体验

encore run 启动后:

  • 自动拉起 Postgres / NSQ Docker 容器
  • 自动注册所有 service / cron / topic / subscription
  • http://localhost:9400/<app> 打开 Local Dev Dashboard
    • Service Catalog + 自动生成的 API 文档
    • API Explorer(直接调用 API)
    • Distributed Tracing(无需埋点)
    • Encore Flow(实时架构图)
  • 修改代码 → 热重载 + 模型重建

对比传统体验:传统的 "docker-compose up + 自己写 OpenAPI + 自己接 OpenTelemetry" 在 Encore 里被压缩成"什么也不做"。


六、Encore Cloud(可选托管层)

"...a development platform for running production applications in your own AWS or GCP environment. It automates infrastructure provisioning, deployments, and operations, while providing built-in observability including distributed tracing, metrics, and logs."

BYOC 模型

应用不在 Encore 自家机器上跑,而是托管在用户自己的 AWS / GCP,Encore Cloud 通过 IAM 角色帮你开通:RDS / SQS+SNS / Fargate / Cloud SQL / Pub/Sub / Cloud Run / GCS / Memorystore / Secrets Manager…

平台能力

  • Preview Environments:每个 PR 一个完整临时环境
  • CI/CD:自动构建部署
  • Tracing / Metrics / Logs
  • IAM / RBAC
  • Cost Insights
  • Encore Flow(架构图随代码自动更新)

商业关系

是否开源是否必选
框架 + Rust 运行时 + CLI + tsparser✅ MPL-2.0
Encore Cloud SaaS❌ 商业——可纯自托管

七、与同类技术的对比

Encore 不是 Agent Harness,所以不能直接和 Pi / DeepAgents 同框比较;但放回它该比的赛道:

维度EncoreNestJS / ExpressTerraform / PulumitRPCCloudflare Workers
范式框架 + 运行时 + 声明式 IaCWeb 框架纯 IaCRPC SDKEdge 框架
基础设施抽象✅ 内置(DB / PubSub / Cron / Bucket)✅(但与代码分离)部分(KV/Queues)
类型安全 RPC✅ 自动生成 client部分
自动追踪 / 文档✅ 全部内置❌ 手动部分
运行时Rust(TS)/ GoNodeNodeV8 isolate
多语言TS + GoNode任意TSTS(主)
云无关✅ AWS / GCP / 自托管❌(CF 锁定)
代码即唯一源部分部分
LicenseMPL-2.0MITMPL-2.0MIT部分开源

Encore 的独特价值

  1. "应用代码即基础设施 IaC":传统是"代码 + Terraform"两份资产、两份漂移;Encore 让代码成为唯一来源(这一点也是和 Pi 的"Adapt pi to your workflows" 哲学一脉相承的——少配置、多声明)。
  2. 静态分析 + 协同设计的运行时:模型 100% 准确不是营销词,是因为框架/解析器/运行时是同一团队整体设计
  3. 跨语言原语等价:Encore.ts 与 Encore.go 暴露完全相同的抽象,跨语言团队可同库协作。
  4. Rust 运行时不溢价:开发者完全感知不到 Rust 的存在,但白拿性能 + 安全 + 校验下沉。
  5. BYOC + 开源:既不是 Vercel 那样把应用强绑到平台,也不是 Terraform 那样让你自己拼装一切,中间的甜区

Encore 的代价

  • 强约束:必须按它定义的"服务即目录 + encore.service.ts + api() 包装"组织代码——和 NestJS 装饰器一样有"框架税"。
  • 生态深度有限:相比 Express / NestJS 的庞大社区,Encore 的中间件 / 插件不多(也部分由"什么都内置"减轻了需求)。
  • Cron 不在本地跑expose: false 默认私有等约束,刚上手会被绊一下。
  • 跨云迁移仍需考虑一些云服务行为差异(如 AWS 300 msg/s vs GCP 3000+ msg/s 的 exactly-once 上限)。
  • 托管平台为商业:完整体验依赖 Encore Cloud;纯自托管能跑,但 Preview Env / RBAC / Cost Insights 等需要自建替代。

八、设计哲学映射:和 Pi / DeepAgents 的同与异

虽然 Encore 不是 Agent Harness,但它在**"框架要不要替你做决定"这个问题上,正好处于 Pi 与 DeepAgents 之间的一个第三种位置**:

哲学位代表代价
最小内核 + 激进扩展(什么都不预设)Pi用户需自建工作流,团队协作成本高
Batteries-included Agent(一组合理默认)DeepAgents灵活性下降,得吃掉所有默认
Batteries-included Backend + 强收敛(连"怎么组织代码"都规定)Encore框架税最重,但确定性最高

一个有趣的对照:Pi 的口号 "Adapt pi to your workflows, not the other way around" 与 Encore 的潜台词 "Adapt your workflow to ours, and we'll do everything else" 在哲学上几乎是镜像的。

放进 Framework / Runtime / Harness 三层架构 的视角:

Encore 对应
Framework(核心抽象)encore.dev/api encore.dev/service encore.dev/storage/sqldb encore.dev/pubsub
Runtime(执行 + 流式 + 状态)runtimes/core(Rust) + tsparser
Harness(工作流表达 + 控制面)encore CLI + Local Dev Dashboard + Encore Cloud

也就是说,Encore 同时是一个 Framework + 一个 Runtime + 一个 Harness——三层都自己做了,但每层都强对齐。


九、对我们项目的启发

9.1 直接候选场景

国际机票后端架构若做新一轮拆分(例如把 booking / payment / inventory 拆成微服务),Encore 是少数能把"声明 + 部署 + 追踪 + 文档"打通的方案

  • 当前痛点之一是 service 之间的接口约定靠 wiki + 口头同步,Encore 的 api() + 自动 client 生成可以让前端、运营脚本、外部对接(OTA 回调)都拿到强类型 SDK。
  • Pub/Sub 在订票场景天然适合:座位预占超时回收、支付状态广播、行程变更通知——at-least-once + 幂等 handler 就是订票域的标准模式。
  • 数据库迁移的"代码即真相"对支付 / 订单这类审计要求高的领域很有价值。

9.2 借鉴而不全盘采用

即使不引入 Encore 本身,几个设计点可以反哺现有 Java/PHP 体系:

  1. Application Model 思路:在现有代码库里加 lint 工具,从注解 / 装饰器抽出"服务-API-DB-Topic"四元组依赖图,喂给文档与监控——这是"从代码生成架构图",不是"画完架构图再写代码"。
  2. expose: false 默认:所有内部 API 默认不出网,必须显式 expose: true——这条放进我们现有 Spring Boot 也立刻能减少误暴露事故。
  3. sensitive: true 自动脱敏:支付域的请求体里凡涉及卡号 / CVV / 身份证号都打上敏感标记,trace 自动过滤——比靠 reviewer 肉眼检查靠谱。
  4. 本地 vs 云的统一镜像encore build docker --config=infra-config.json 的 "一镜走天下" 思路,可借鉴到我们自己的 CI——同一镜像通过外部 config 切换 DB / Pub/Sub 端点,禁止"本地一份代码、生产一份代码"。

9.3 反向警示:什么不要做

  • 不要把 Encore 当 Web 服务器:它的强项在分布式系统的整体编排,对单体小项目反而是杀鸡用牛刀。
  • 不要绕过框架直连资源:Encore 的可观测 / 校验 / 部署都建立在"通过框架抽象访问资源"的前提上,一旦绕开(比如直接 pg.connect),失去的是整张追踪图。
  • 不要在 Cron 里塞产品逻辑:本地不跑、参数不传、必须幂等——它是给"运维型定时任务"用的,不是业务流程编排器。

9.4 与 AI 订票助手的关系

AI订票助手-Harness工程方案 选 DeepAgents 路线(Python,HITL,长期记忆)。Encore 不替代它,但可以做它的"工具背后的服务层"——AI Agent 调的下层 Booking API / Payment API 完全可以用 Encore.ts 重写,让 Agent 拿到类型安全的 client + 自动 trace + 自动文档。这相当于:

text
[ DeepAgents Harness(业务编排) ]
            │
            ▼
[ Encore.ts services(基础设施) ]
            │
            ▼
[ AWS / GCP / 自托管 ]

Agent 的可解释性在于 trace 全链路可达,Encore 的全链路 trace 与 Agent 的工具调用日志合并后,是一套端到端的合规审计材料


十、快速上手

bash
# 1. 安装
brew install encoredev/tap/encore        # macOS
curl -L https://encore.dev/install.sh | bash   # Linux
iwr https://encore.dev/install.ps1 | iex       # Windows

# 2. 起一个 TypeScript 例子
encore app create --example=ts/hello-world
cd hello-world

# 3. 本地启动(自动开 Postgres / NSQ)
encore run
# → http://localhost:9400/<app>  打开 Dev Dashboard

# 4. 自托管打包
encore build docker myapp:v1 --config=infra-config.json
docker run -p 8080:8080 myapp:v1

最少两个文件:

typescript
// hello/encore.service.ts
import { Service } from "encore.dev/service";
export default new Service("hello");

// hello/hello.ts
import { api } from "encore.dev/api";

export const greet = api(
  { expose: true, method: "GET", path: "/hello/:name" },
  async ({ name }: { name: string }): Promise<{ message: string }> => ({
    message: `Hello ${name}!`,
  }),
);

—— 即可获得 HTTP API + 类型校验 + 自动文档 + 分布式追踪。


  • Encore.ts 深度教程
  • Encore 资料索引
  • Pi 研究摘要
  • DeepAgents 研究摘要
  • Harness Engineering 研究报告
  • AI订票助手-Harness工程方案

本章目录
一、Encore 是什么二、核心机制:Application Model三、五大原语(Primitives)四、Rust 运行时:性能与"零 NPM 依赖"的底气五、本地开发体验六、Encore Cloud(可选托管层)七、与同类技术的对比八、设计哲学映射:和 Pi / DeepAgents 的同与异九、对我们项目的启发十、快速上手Related Documents
苏ICP备2025204887号-2