Kratos 整体架构
This content is not available in your language yet.
Kratos 的核心不是一个大型运行时,而是一组围绕统一接口拼装的基础模块。根包只负责应用生命周期,具体协议交给 transport,治理能力通过 registry、selector 和 middleware 注入。
先给答案:Kratos 的核心不是一个大型运行时,而是一组围绕统一接口拼装的基础模块
Section titled “先给答案:Kratos 的核心不是一个大型运行时,而是一组围绕统一接口拼装的基础模块”Kratos 的核心不是一个大型运行时,而是一组围绕统一接口拼装的基础模块。根包只负责应用生命周期,具体协议交给 transport,治理能力通过 registry、selector 和 middleware 注入。 正文沿“主链路 -> 依赖方向 -> 关键取舍”展开:先确认入口和状态归属,再跟踪控制流或数据流的推进,最后落到对外可观察的结果。
主要失效边界集中在“未提供 Endpoint、server 启动失败、自定义 registry”这些场景。它们破坏的是容量、顺序、并发或生命周期前提;排查时应先确认状态是否仍由正确对象持有,再核对推进条件和清理路径。
kratos.New(options) | vbuild ServiceInstance <- server.Endpoint() | vserver.Start(ctx) -> HTTP/gRPC request -> middleware -> endpoint | | +-> Registrar.Register +-> client transport | signal / Stop -> Deregister -> server.StopApp 的字段把 context、servers、registrar、hooks 和 instance 集中在 app.go:29-36;构造和默认信号位于 app.go:38-59、options.go:17-39。底层服务只需要实现 transport.Server:transport/transport.go:16-24。
application code | +--> kratos.App +--> transport/http or transport/grpc +--> middleware +--> registry adapter +--> config/log框架通过接口反向依赖应用适配器:注册中心实现 registry.Registrar/Discovery,配置源实现 config.Source,日志输出只需要提供 slog handler 或 writer。这样业务代码不必绑定某一个注册中心或配置中心。
替代方案:把注册、配置、RPC 和生命周期全部做成一个中心容器。
问题:测试和替换成本高,协议细节会污染应用生命周期。
设计:用小接口组合能力,App 只编排,不持有 HTTP/gRPC 实现细节。
| 场景 | 风险 | 处理 |
|---|---|---|
| 未提供 Endpoint | 注册信息为空 | 从实现 Endpointer 的 server 推导 |
| server 启动失败 | 应用仍可能尝试注册 | Run 通过 errgroup 汇总错误 |
| 自定义 registry | 生命周期遗漏 | 同时实现 Register、Deregister |
| 混用 HTTP/gRPC | operation 语义不同 | 通过 Transporter.Kind 区分 |
框架的扩展性主要来自“稳定的生命周期接口 + 可替换的边缘适配器”,而不是来自更多全局配置。
面试锚点
- Kratos 的 App 为什么不直接管理 HTTP/gRPC 细节?
Transporter在 middleware 中解决了什么问题?- 注册发现和负载选择为什么拆成两个包?