RRuna

认识 Runa

了解 Runa 的微内核模型和适用场景

Runa 是一个适用于业务开发的 Go Web 框架,它把应用启动、依赖注入、配置、命令和生命周期放在内核里,路由、缓存、队列、数据库、存储等能力按需接入,业务代码通过 Module 组织。

Runa 解决什么问题

很多 Go Web 项目一开始只是几个 HTTP handler,后来会不断加配置、数据库、缓存、队列、定时任务、命令行、后台 worker、权限和监控,真正变乱的通常不是某个 handler,而是这些能力各自初始化、各自读配置、各自注册全局变量、各自处理关闭。

这些问题会让 main.go 越写越重,业务包之间互相拉依赖,测试时很难替换组件,生产关闭时也不知道先停 HTTP、队列、数据库还是后台任务。

Runa 解决的是应用编排问题:应用从哪里启动,能力按什么顺序接入,业务模块在哪里注册,命令和 worker 怎么复用同一套配置和依赖,资源关闭由谁统一处理。

同时,Runa 也解决接口开发体验问题,业务接口不只是“能注册一个 handler”,还需要结构化路由、清晰的输入输出、显式验证、统一错误、OpenAPI 文档、资源路由和 CRUD 组合能力,这些都是面向业务开发时真正会反复用到的东西。

Runa 提供哪些真实优点

方向 Runa 提供什么 解决什么问题
微内核 应用入口、DI、配置、命令、生命周期 让启动、接入、关闭有统一路径
按需能力 路由、缓存、队列、数据库、存储、认证等能力按需安装 不用的能力不进入依赖图
业务模块 Module 组织业务域 业务注册不堆在 main.go
结构化路由 Group、Domain、路由命名、Meta、Summary、Tags、Security 路由不只是路径,还能承载权限、文档和业务语义
强类型接口 Input / Output handler 自动绑定输入和渲染输出 handler 签名更清楚,接口结构更容易维护
显式验证 validate 用代码声明字段规则和回调 验证逻辑可读、可测试,不靠隐式 tag 猜行为
OpenAPI 从路由元数据和 schema 生成文档,可挂载 UI 或命令导出 文档跟着代码走,减少手写接口文档
资源路由 resource 统一组织 list、show、create、edit、store、delete 等动作 后台、管理端、REST 风格接口更规整
CRUD 组合 crud 基于 Resource 和 Store 生成常见数据接口 重复列表、详情、保存、删除逻辑不用每次从零写
运维能力 审计、观测、集群、控制台 业务系统上线后需要的运行时能力有入口

哪些项目适合用 Runa

Runa 更适合这些项目:

  • 从一个小 API 开始,但后面可能接入数据库、队列、缓存、权限、后台任务
  • 希望业务能力按需安装,不想一开始背全家桶依赖
  • 希望业务模块和框架能力都走同一套生命周期
  • 希望应用启动和关闭顺序清楚,方便做企业级应用编排
  • 希望接口开发有结构化约定,而不是只靠手写 handler 和散落的注释维护文档

Runa 可以从一个微项目开始,也可以支撑复杂业务系统,小项目只接入 route 就能写 HTTP 服务,后面需要配置、命令、业务模块、缓存、队列、数据库和运维能力时,不需要重写应用骨架。

如果你的目标只是替换一个路由器,并且更看重框架专属中间件生态或纯 HTTP benchmark,Gin、Echo、Fiber 这类 router 会更直接。

Runa 的微内核怎么组织

Runa 的文档按四层理解:

层级 作用 示例
内核 应用骨架、DI、配置、命令、生命周期 runaconfigcommand
传输 应用入口和 Host routewsjsonrpc
能力 业务通用能力 cachequeuedatabasestorage
驱动 具体外部依赖适配 rediss3oronats

依赖方向只向下,内核不反向依赖传输、能力或驱动。

和常见 Go Web 框架有什么不同

很多 Go Web 框架以 HTTP router 为中心,适合快速写 API,Runa 以应用入口、业务 Module 和生命周期为中心,HTTP 只是一个可安装的传输能力。

这带来三个结果:

  • 不接入的能力不会进入你的应用依赖图
  • 所有能力用统一方式启动、配置、关闭
  • 写业务接口时可以从路由、验证、文档、资源动作到 CRUD 都使用同一套结构化模型

更详细的客观对比见 框架对比

名字代表什么

Runa 来自 Run App 的语感,代表的是把一个 Go 应用作为整体运行起来:能启动,能组合能力,能注册业务模块,也能按顺序关闭。

它不是强调“再造一个路由器”,而是强调“把业务应用跑稳”。

接下来怎么读

编辑此页