Encore.go 全面指南:在 Go 代码中声明云基础设施的开源 SDK
【免费下载链接】encoreThe infrastructure platform for the intelligence era项目地址: https://gitcode.com/GitHub_Trending/encor/encore
Encore.go(本仓库即其开源实现)是一个开源基础设施 SDK,允许开发者直接在 Go 代码中声明应用所需的云基础设施——SQL 数据库、Pub/Sub 主题、对象存储、缓存、Cron 任务与密钥(secrets),由编译器与运行时自动完成资源接线。本文以 docs/go/overview.md 为核心骨架,结合仓库源码(CLI daemon、运行管理器、本地基础设施组件)深入讲解其核心模型、本地开发循环与生产部署路径,读完你不仅能理解其设计理念,还能掌握encore run的完整参数、本地基础设施的启动机制,以及从本地到生产的两种部署方式。
核心主张:基础设施即 Go 代码
Encore.go 要解决的核心痛点是传统云开发中基础设施与业务代码的割裂:开发者通常需要同时维护 Terraform 脚本、YAML 清单和云控制台的手工配置,才能把数据库、消息队列、存储桶等资源"接"进应用。Encore.go 的做法与此截然不同——你把这些资源声明为类型化的 Go 值,并通过 SDK 方法直接使用它们:
import ( "encore.dev/storage/sqldb" // SQL 数据库 "encore.dev/pubsub" // Pub/Sub "encore.dev/storage/objects" // 对象存储 ) // 一个数据库、一个主题、一个存储桶,全部以 Go 值的形式声明 var db = sqldb.NewDatabase("users", sqldb.DatabaseConfig{}) var topic = pubsub.NewTopic*OrderCreated var bucket = objects.NewBucket("assets", objects.BucketConfig{})声明之后,Encore 会在本地开发时自动运行与之匹配的基础设施,并在部署时(配合 Encore Cloud)在你的 AWS 或 GCP 账号中预置真实的云资源。这一设计贯穿整个仓库:encore.dev运行时(runtimes/go)提供了sqldb、pubsub、storage、cache等 SDK 包;v2/parser负责从源码中解析出资源使用图;cli/daemon/run/infra/infra.go则在本地为解析结果启动对应的真实或模拟服务。
可声明的资源一览
原文档列出的核心原语,对应仓库中 docs/go/primitives 下的完整指南:
| 基础设施原语 | 声明方式(SDK 包) | 深入指南 |
|---|---|---|
| SQL 数据库 | encore.dev/storage/sqldb | databases.md |
| Pub/Sub 主题与订阅 | encore.dev/pubsub | pubsub.md |
| 对象存储桶 | encore.dev/storage/objects | object-storage.md |
| 缓存 | encore.dev/storage/cache | caching.md |
| Cron 任务 | encore.dev/cron | cron-jobs.md |
| 密钥 | encore.dev/config/ secrets 机制 | secrets.md |
Encore 会理解这些资源在代码中的实际使用方式,并自动生成运行时接线(runtime wiring)。从源码结构看,这一过程的核心链路是:v2/parser解析出meta.Data(proto/encore/parser/meta/v1 中定义的应用元数据,包含数据库、Pub/Sub 主题、存储桶、服务、网关等全部声明),然后由cli/daemon/run/infra/infra.go的ResourceManager依据这份元数据按需启动本地资源。
本地基础设施自动启动:encore run 的魔力
原文档强调:运行encore run,Encore 会启动一个镜像生产环境的本地环境——真实的 Postgres、本地的 Pub/Sub 代理、本地对象存储等,无需维护任何 Docker Compose 文件。
encore run 的完整命令参数
encore run的 CLI 定义位于 cli/cmd/encore/run.go,通过 Cobra 注册,完整参数如下:
encore run [--debug] [--watch=true] [--level=TRACE] [--port=4000] [--listen=<listen-addr>]| 参数 | 默认值 | 说明 |
|---|---|---|
--watch, -w | true | 监听文件变化并热重载 |
--listen | 空 | 监听地址(例如0.0.0.0:4000);未指定时默认监听127.0.0.1:<port>,以避免触发 macOS 防火墙对全接口监听的权限询问 |
--port, -p | 4000 | 监听端口;若--listen已含端口则忽略 |
--json | false | 以 JSON 格式输出日志 |
--namespace, -n | 当前激活命名空间 | 使用的命名空间 |
--color | 终端检测结果 | 是否彩色输出 |
--redact | false | 本地运行 trace 时脱敏敏感数据 |
--level, -l | 空 | 最低日志级别,可选trace、debug、info、warn、error |
--debug | 空 | 以调试模式编译(可选enabled、break),会关闭部分优化 |
--browser | auto | 启动时是否在浏览器打开本地开发仪表盘,可选auto、never、always |
本地启动的完整链路
从源码看,encore run的执行流程是(cli/daemon/run/run.go 的Run.start/buildAndStart):
- 解析应用:
Builder.Parse构建 "Encore application graph",分析服务拓扑,得出需要哪些基础设施(optracker中对应 "Building Encore application graph"、"Analyzing service topology" 两个操作)。 - 启动所需基础设施:
ResourceManager.StartRequiredServices依据解析出的meta.Data判断应用是否使用了 SQL、Pub/Sub、Redis、对象存储,并按需启动对应服务(cli/daemon/run/infra/infra.go)。 - 编译应用源码:
Builder.Compile将 Go 代码连同生成的运行时接线编译为二进制。 - 拉取密钥:
secrets管理器并行获取应用密钥。 - 启动进程组:
StartProcGroup根据构建输出决定以单进程(isSingleProc)还是"每服务一进程"方式启动,并为每个进程注入运行时配置(含服务发现、网关地址、Auth Key、密钥环境变量等)。 - 对外服务:daemon 用
h2c包装 handler 支持明文 HTTP/2(用于转发 gRPC 等请求),对外提供 HTTP 服务。
本地基础设施的底层实现
Postgres(真实数据库):StartSQLCluster通过sqldb.ClusterManager创建真实 Postgres 集群;非测试环境下会异步执行 "Running database migrations"(cluster.SetupAndMigrate),把md.SqlDatabases中声明的迁移应用到本地数据库。连接信息(Host 为localhost:<dbProxyPort>、用户encore、密码来自集群)被写入运行时配置,且每个数据库按 96 个连接均分上限。
Pub/Sub(NSQ):本地 Pub/Sub 由嵌入的 NSQ daemon 实现(cli/daemon/pubsub/nsq.go)。它绑定127.0.0.1:0(随机空闲端口),数据路径放在临时目录,消息大小上限 10MB;启动后会 Ping 验证就绪。运行时配置中通过config.NSQProvider写入其地址。
Redis 缓存(miniredis):本地缓存使用 miniredis 实现(cli/daemon/redis/redis.go),以 ticker 快进时间并定期清理键,将持久化键控制在约 100 个以内以限制内存占用。每个 Cache 集群在配置中分配KeyPrefix: <集群名>/以避免键冲突。
对象存储(GCS 模拟器):本地对象存储复用仓库自带的gcsemu(pkg/emulators/storage/gcsemu),开发模式使用基于目录的文件存储(objects.NewDirServer),测试模式使用内存存储。启动时Initialize会依据md.Buckets预建所有声明的存储桶,对外暴露 GCS 兼容的 HTTP 端点,公共桶另经PublicBucketServer提供服务。
类型安全的服务间调用
原文档的核心卖点之一:API 就是普通的 Go 函数,调用另一个服务就是一次普通函数调用,Encore 在边界处替你处理序列化、路由与校验。
// 在 greeting 服务中定义 API //encore:api public func Greet(ctx context.Context, name string) (*Response, error) { return &Response{Message: "Hello, " + name}, nil } // 在另一个服务中调用:就是一个普通函数调用 resp, err := greeting.Greet(ctx, "world")本地运行时,服务发现机制由cli/daemon/run/manager.go的generateServiceDiscoveryMap生成:所有服务映射到同一个 API 基地址(daemon 的监听地址),协议为 HTTP,本地服务间认证使用encore-auth方法。也就是说,本地所有服务由 daemon 统一代理与路由,而生产环境则映射到各自的服务 URL。
内置可观测性
Encore.go 自带一个本地开发仪表盘(Local Development Dashboard),包含分布式追踪、日志与数据库浏览器。其服务端实现在 cli/daemon/dash/dash.go:
- 追踪(Tracing):通过
trace2.Store持久化 span,提供traces/list、traces/get、traces/spans/summaries/list、traces/spans/events/list等 JSON-RPC 方法,并可通过 WebSocket 推送新 trace(trace/new)。 - 数据库浏览器:
db/query、db/transaction方法支持在仪表盘内直接查询本地数据库;db-migration-status展示每个数据库的迁移文件与应用状态。 - 对象存储浏览器:
objects/list、objects/search、objects/delete、objects/download-url等方法支持浏览与管理本地存储桶中的对象。 - API 调用:
api-call方法允许从仪表盘直接对运行中的应用发起 API 请求。
此外,OnStart事件监听器会在--browser=always(或auto且尚无客户端连接)时自动打开浏览器访问http://localhost:<dashPort>/<appID>。应用运行期间的编译状态、进程输出与编译错误都会实时推送到仪表盘。相关文档见 dev-dash.md 与 tracing.md。
AI-ready by Design
因为基础设施以代码声明,AI 编码助手可以理解并修改你的全栈代码。Encore.go 为此提供了两项配套能力:
- AI 指令(AI Instructions):仓库根目录即包含 go_llm_instructions.txt 与 ts_llm_instructions.txt,为编码助手提供 Encore 应用开发规则;完整说明见 ai-integration.md。
- MCP 服务器:Encore CLI 内置 MCP 服务器(
encore mcp),源码位于 cli/daemon/mcp,提供api_tools、db_tools、pubsub_tools、bucket_tools、cache_tools、cron_tools、secret_tools、metrics_tools、trace_tools、docs_tools等工具集,让编辑器中的 Agent 能直接读写应用资源。接入方式见 mcp.md。
原文档指出,这让"每个变更都能在本地与云端针对真实基础设施做端到端验证"成为可能——这是 Encore.go 与 AI 编码 Agent 协同特别有效的原因,详见 Development Workflow。
本地到生产的紧密迭代循环
由于 SDK 是基础设施的唯一事实来源(source of truth),同一套模型可以在本地、每个 PR 的预览环境与生产环境间保持一致:
- 本地:
encore run在你的笔记本上启动整个系统,使用真实的 Postgres、真实的 Pub/Sub 语义和真实的追踪。 - 预览环境:打开 PR 时,会在你自己的 VPC 中创建预览环境,使用相同的基础设施模型,并可选择从种子环境分支数据库(见 preview-environments.md 与 neon.md)。
- 生产:见下文部署章节。
部署到生产:两种受支持路径
Encore.go 完全开源,你永远不会被锁定在某一条部署路径上。原文档明确给出两种受支持的生产运行方式。
方式一:Encore Cloud(托管平台,可选)
Encore Cloud 读取你在代码中声明的基础设施,并在你自己的 AWS 或 GCP 账号中预置匹配的真实资源(RDS、Cloud SQL、SNS+SQS、Pub/Sub、S3、GCS 等),在此之上管理部署、环境、密钥与 IAM。关键边界在于:云账号与基础设施归你所有,Encore Cloud 只是从你的代码驱动这些资源的控制平面。平台相关文档位于 docs/platform,部署流程见 deploying.md。
方式二:自托管(Self-hosted)
你可以用encore build docker构建标准 Docker 镜像,然后部署到任何环境。此时基础设施由你自己以任意方式预置(Terraform、Pulumi、CloudFormation 或云控制台),并通过**基础设施配置文件(infrastructure config file)**告诉 Encore 运行时如何连接这些资源。
自托管时你需要运行标准 Docker 镜像并自行预置基础设施,然后通过基础设施配置文件告诉 Encore 运行时如何连接这些资源。相关的配置参考见 configure-infra.md,完整工作流见 self-host.md。
关于encore build docker,从源码看其实现位于 pkg/dockerbuild:它从应用元数据与构建产物出发,生成完整的镜像清单(manifest)、文件系统层(tarcopy)与运行时规范(spec),并支持跨平台特性(features),最终产出可在任何容器运行时启动的标准镜像。这与"构建标准 Docker 镜像、随处运行"的定位一致。
下一步学习路径
原文档给出了清晰的上手路线,按需深入即可:
- 初次接触 Encore?从 quick-start.mdx 开始,构建并运行你的第一个应用。
- 想先理解核心模型?阅读 app-structure.md 与 services.md。
- 查询具体原语?参见 primitives 总览。
- 想了解本地到生产的迭代循环?参见 Development Workflow。
- 准备部署?参见 Encore Cloud 部署,或阅读 self-host.md 走自托管路线。
【免费下载链接】encoreThe infrastructure platform for the intelligence era项目地址: https://gitcode.com/GitHub_Trending/encor/encore
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考