Kratos
Kratos 是一个把应用生命周期、HTTP/gRPC 传输、中间件、服务注册发现、配置和日志组合起来的 Go 微服务框架。本册沿着“应用启动、服务器运行、请求进入、客户端发现、配置变更、优雅退出”的主线阅读源码。
本册问题地图
Section titled “本册问题地图”Kratos 适合按“应用生命周期包住请求生命周期”来读:
- App 启动时谁先准备? 配置、日志、注册中心和服务器需要在 Run 前完成初始化,组件之间通过生命周期接口统一启动和停止。
- HTTP 与 gRPC 为什么共享中间件思想? 请求都可被包装成前后置链,认证、日志、恢复和元数据处理可以复用,但协议错误模型不同。
- 服务发现返回的地址如何变成一次调用? Resolver 更新节点,Selector 选择节点,客户端连接管理负责复用和重连;发现到调用之间存在缓存和状态机。
- 配置热更新的边界是什么? 新配置可以通知监听者,但已经创建的连接、线程池和 handler 不一定自动重建。
- 优雅退出解决什么? 先停止接收新请求,再等待在途请求和注销实例,避免进程消失后注册中心仍认为它可用。
| 项 | 值 |
|---|---|
| 仓库 | go-kratos/kratos |
| 本地路径 | E:\source\go\kratos |
| 分支 | main |
| Commit | 668db92c(2026-06-26) |
| 最近 tag | v3.0.0 |
本册源码坐标均基于该 commit;上游演进后行号可能漂移。
它解决什么问题
Section titled “它解决什么问题”- 用
App统一服务器启动、注册、信号处理和优雅停止。 - 用统一
transport.Server抽象承载 HTTP 与 gRPC。 - 用
middleware.Handler把鉴权、日志、恢复、限流等横切逻辑串成调用链。 - 用
Registrar、Discovery和 resolver 把服务治理适配器隔离在框架外。 - 用可组合的 config source、watcher 和 slog handler 支撑动态配置与结构化日志。
| 模块 | 职责 | 关键入口 |
|---|---|---|
| 根包 | 应用元数据、生命周期和 hooks | New、Run、Stop |
transport |
server、endpoint、请求上下文 | Server、Transporter |
transport/http |
HTTP server/client、路由和编解码 | NewServer、NewClient |
transport/grpc |
gRPC server/client、拦截器和 resolver | NewServer、NewClient |
middleware |
通用 handler 链和按 operation 选择 | Chain、selector.Build |
registry、selector |
注册发现和节点选择 | Registrar、Discovery、Selector |
config、log |
配置合并/watch 和 slog 装饰器 | config.New、log.NewHandler |
- 整体架构:App、transport 和依赖边界
- App 生命周期:启动、注册、信号与优雅停止
- HTTP 传输:路由、Context、编解码与客户端
- gRPC 传输:拦截器、健康检查、反射与客户端
- Middleware 链:handler 组合、selector 与上下文
- 注册发现与负载选择:watch、resolver、subset 与 WRR
- Config 与 Log:动态配置、slog handler 与上下文属性
- 错误、Metadata 与编码:跨 HTTP/gRPC 的错误和元数据模型
- 面试专题:源码级高频题与排障场景