优先选Gin,因其两分钟内即可curl通;Kratos适合HTTP/gRPC混用场景,Go-Zero适用于需开箱即用监控限流的项目,三者应按MVP验证、模块膨胀、上线压测阶段动态切换。

你需要在三天内让新成员写出可部署、可调试、可加监控的最小微服务,但面对 Gin、Kratos、Go-Zero 三个框架不知从哪下手——选错意味着卡在配置路径、手写胶水代码或被 DDD 概念绕晕。
先看团队能不能跑通第一个服务
打开终端,执行第一条命令前就决定成败:Kratos 要求你先写 .proto 文件→用 protoc 生成代码→再 wire 注入依赖→最后 go run ./cmd -conf ./configs;路径错一个斜杠,报错直接指向 conf/ 目录不存在。Gin 则是 r := gin.Default() → r.GET("/ping", func(c *gin.Context) { c.JSON(200, "ok") }) → r.Run(),【两分钟内就能 curl 通】。Go-Zero 需要先装 goctl → goctl api new userapi → goctl api go -api userapi.api -dir .,生成完立刻有 HTTP server、路由、DTO、validator 全套骨架,但若团队没接触过模板变量(如 {{.serviceName}}),得翻文档改三处才能启动。
HTTP 和 gRPC 是否混用
方法一:纯对外 RESTful API,不涉及内部服务调用
选 Gin 最轻快。它不内置注册中心、不强制分层、不生成 proto,所有中间件自己拼——JWT 校验用 github.com/appleboy/gin-jwt/v2,限流用 github.com/ulule/limiter,链路追踪自己接 OpenTelemetry SDK。自由度高,但三个月后项目里 middleware 套 middleware,debug 时得顺着 c.Next() 一层层扒。
方法二:HTTP 入口 + 内部 gRPC 调用其他服务
选 Kratos。同一个 greet.proto 定义,go generate 后自动产出 HTTP handler(自动绑定 query/path 参数到 struct)和 gRPC server(暴露 stream 方法)。不用维护两套路由、两套参数校验、两套错误码映射。Gin 做不到这点,你得自己写 grpc.Dial + context.WithTimeout + 连接池管理,这些 Kratos 已封装进 data 层的 NewGreeterClient 工厂函数里。
方法三:既要快速出接口,又要带熔断限流监控
选 Go-Zero。goctl api 生成的代码默认开启 sentinel 限流,支持按 QPS/并发数/响应时间多维度控制;Prometheus metrics 端点开箱即用,curl :8080/metrics 直接返回指标;日志自动打 trace_id,无需手动注入 context。Gin 手动集成 gobreaker + promhttp + zap,至少多写 200 行 glue code。
按项目阶段动态切换框架
第一步:验证业务逻辑,MVP 阶段
用 Gin。接口写完就跑,连数据库都不用配,mock 数据返回 JSON 即可。这时候谈 DDD 分层、proto 约束、服务发现全是干扰项。
第二步:模块膨胀,接口超 50 个,跨团队协作变多
迁移到 Kratos。把已有 Gin 接口按领域重构成 API 层 + Service 层 + Biz 层 + Data 层,用 proto 强制统一错误码和参数结构。B站实践显示,协议标准化使跨团队协作的协议理解偏差率下降 85%。
第三步:上线压测发现限流不准、监控缺失、部署脚本重复写
切 Go-Zero。用 goctl rpc 生成内部 RPC 服务,用 goctl kube 生成 K8s 部署 YAML,限流策略写在 yaml 里,改个数字就生效。它不解决架构设计问题,但把工程重复劳动压缩到最低。











