kratos 是 bilibili 内部微服务实践沉淀的 go 框架,非为开源而设计;默认用 protobuf 因其契约严格、兼容性强、序列化高效,适配百亿级 rpc;项目结构强制 cmd 入口与业务分离,依赖注入避免全局变量;http 中间件需适配 kratos 接口以保障上下文透传。

Kratos 并不是 Bilibili 为“开源架构理念”专门设计的框架,它是一个由 Bilibili 工程师在内部微服务实践中沉淀出来的 Go 微服务框架,开源是结果,不是出发点。它的设计选择(比如 Protocol Buffer 优先、无侵入中间件、依赖注入容器)全部来自真实业务场景里对可维护性、可观测性和部署效率的反复权衡。
为什么 Kratos 默认用 protobuf 而不是 JSON 做通信协议
不是为了“高大上”,是因为 B 站核心服务间调用量极大,且强依赖接口契约稳定性。protobuf 提供严格的 schema 约束、向后兼容保障、更小的序列化体积和更快的编解码速度——这些在日均百亿级 RPC 调用量下直接反映为 CPU 和带宽节省。
- 不写
.proto文件就无法生成 server/client 代码,天然阻止“字段随意增删改”的接口滥用 -
jsonpb是可选兼容层,但生产环境建议关掉;开启后会丢失oneof、enum name映射等语义 - HTTP 接口默认也走
protobuf序列化(通过Content-Type: application/proto),不是 JSON —— 这点容易被文档误导
kratos new 生成的项目结构为什么没看到 main.go 在根目录
因为 Kratos 把启动逻辑收进 cmd 目录,强制分离“构建入口”和“业务模块”。这是为多服务复用同一套 infra(如 config、logger、tracer)做的结构约束。
Destoon B2B网站管理系统是一套完善的B2B(电子商务)行业门户解决方案。系统基于PHP+MySQL开发,采用B/S架构,模板与程序分离,源码开放。模型化的开发思路,可扩展或删除任何功能;创新的缓存技术与数据库设计,可负载千万级别数据容量及访问。 系统特性1、跨平台。支持Linux/Unix/Windows服务器,支持Apache/IIS/Zeus等2、跨浏览器。基于最新Web标准构建,在
-
cmd/{service-name}/main.go是唯一构建入口,里面只做初始化和启动,不写业务逻辑 - 所有 service、data、biz 层都通过
di.Provider注入,避免全局变量或手动 New 实例 - 误把业务代码写进
main.go会导致单元测试难 mock、模块复用困难——这是新手最常破防的点
为什么 transport/http 的中间件不能直接用 net/http 原生中间件
Kratos 的 http.Server 是封装层,其 Handler 类型是 http.HandlerFunc 的包装,但上下文传递、错误处理、日志埋点都走 Kratos 自己的 transport.ServerOption 和 middleware.Middleware 接口。
- 直接传
func(http.Handler) http.Handler会绕过 Kratos 的 context 透传机制,导致traceID、userID等元信息丢失 - 正确做法是用
transport.WithMiddleware()注册符合middleware.Middleware签名的函数,例如:func(handler middleware.Handler) middleware.Handler - 已有
net/http中间件(如cors)需用transport.HTTPMW包装器转换,否则 panic
真正卡住人的地方往往不是语法,而是 Kratos 把“服务生命周期管理”、“配置加载时机”、“context 传播边界”这些隐性契约全写进了结构和接口里。跳过 kratos run 启动流程直接改 main.go,或者把 config 读取逻辑塞进 service 层,都会让后续加监控、切流量、做灰度变得异常脆弱。









