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.ts | TypeScript(Node.js / Bun) | Rust core + NAPI bindings(67k LOC) |
| Encore.go | Go | Go 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)
- APIs(api(...) 包装的导出函数)
- Databases(new 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/s | P99 |
|---|
| Encore.ts | 121,005 | 2.3 ms |
| Bun + Zod | 101,611 | 3.7 ms |
| Elysia + TypeBox | 82,617 | — |
| Fastify + Ajv | 62,207 | 4.1 ms |
| Express + Zod | 15,707 | 11.9 ms |
"9x the throughput of Express.js with 80% less latency"
为什么快
- 多线程异步事件循环(Tokio + Hyper),不被 Node 单线程瓶颈卡住
- 请求校验在 Rust 层执行——非法请求根本不进 JS(顺带缓解 DoS)
- API 网关 Pingora 直接嵌入运行时,TS auth handler 同步执行,免去独立代理 + 序列化
- 零 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 同框比较;但放回它该比的赛道:
| 维度 | Encore | NestJS / Express | Terraform / Pulumi | tRPC | Cloudflare Workers |
|---|
| 范式 | 框架 + 运行时 + 声明式 IaC | Web 框架 | 纯 IaC | RPC SDK | Edge 框架 |
| 基础设施抽象 | ✅ 内置(DB / PubSub / Cron / Bucket) | ❌ | ✅(但与代码分离) | ❌ | 部分(KV/Queues) |
| 类型安全 RPC | ✅ 自动生成 client | ❌ | — | ✅ | 部分 |
| 自动追踪 / 文档 | ✅ 全部内置 | ❌ 手动 | ❌ | ❌ | 部分 |
| 运行时 | Rust(TS)/ Go | Node | — | Node | V8 isolate |
| 多语言 | TS + Go | Node | 任意 | TS | TS(主) |
| 云无关 | ✅ AWS / GCP / 自托管 | ✅ | ✅ | ✅ | ❌(CF 锁定) |
| 代码即唯一源 | ✅ | ❌ | ❌ | 部分 | 部分 |
| License | MPL-2.0 | MIT | MPL-2.0 | MIT | 部分开源 |
Encore 的独特价值
- "应用代码即基础设施 IaC":传统是"代码 + Terraform"两份资产、两份漂移;Encore 让代码成为唯一来源(这一点也是和 Pi 的"Adapt pi to your workflows" 哲学一脉相承的——少配置、多声明)。
- 静态分析 + 协同设计的运行时:模型 100% 准确不是营销词,是因为框架/解析器/运行时是同一团队整体设计。
- 跨语言原语等价:Encore.ts 与 Encore.go 暴露完全相同的抽象,跨语言团队可同库协作。
- Rust 运行时不溢价:开发者完全感知不到 Rust 的存在,但白拿性能 + 安全 + 校验下沉。
- 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 体系:
- Application Model 思路:在现有代码库里加 lint 工具,从注解 / 装饰器抽出"服务-API-DB-Topic"四元组依赖图,喂给文档与监控——这是"从代码生成架构图",不是"画完架构图再写代码"。
- expose: false 默认:所有内部 API 默认不出网,必须显式 expose: true——这条放进我们现有 Spring Boot 也立刻能减少误暴露事故。
- sensitive: true 自动脱敏:支付域的请求体里凡涉及卡号 / CVV / 身份证号都打上敏感标记,trace 自动过滤——比靠 reviewer 肉眼检查靠谱。
- 本地 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工程方案