go-kratos/kratos · 上手攻略
- 仓库:go-kratos/kratos
- 链接:https://github.com/go-kratos/kratos
- 分类:Go 微服务框架 · 云原生
- 作者:Jay
- 更新:2026-07-14
这是什么
Kratos 是 Go 语言的微服务框架,专为云原生时代设计。它提供了一套轻量、显式(explicit)的 API,涵盖传输层、中间件、服务注册发现、配置、日志、编解码和代码生成等环节,让开发者专注于业务逻辑而非基础设施搭建。
v3 是当前主要版本(README 标注需 Go 1.25+),相比 v2 大幅精简了核心依赖,并将原来隐式的行为显式化,详见官方 v2 → v3 迁移指南。
核心特性一览:
- API First:用 Protobuf 定义接口,自动生成 HTTP/gRPC 代码
- 统一传输层:同一服务同时暴露 HTTP 和 gRPC,无需两套实现
- 可组合中间件:恢复、日志、验证、追踪、指标、认证等开箱即用,可按需替换
- 插件化组件:注册中心、配置源、编解码器均支持插拔
- 标准日志:基于标准库 log/slog,contrib 包提供 OpenTelemetry 扩展
- 一站式代码生成:Kratos CLI 全流程覆盖项目创建、Proto 生成、Wire 依赖注入、OpenAPI 文档
解决什么问题
在 Go 生态里,从零搭建微服务门槛不低:要选 HTTP 框架、比选 gRPC 库、设计项目结构、串联依赖注入、配置追踪/指标……Kratos 的目标是把这些最佳实践打包成统一方案,让团队从第一天起就站在同一个规范上。
它的设计思路深受 go-kit、go-micro、google/go-cloud、go-zero 和 beego 影响,取各家之长并统一了 API 风格。
快速安装
前置依赖
| 工具 | 版本要求 | 安装方式 |
|---|---|---|
| Go | ≥ 1.25 | golang.org/dl |
| protoc | 最新稳定 | github.com/protocolbuffers/protobuf |
| protoc-gen-go | v2+ | go install github.com/protocolbuffers/protobuf-go/cmd/protoc-gen-go@latest |
| Kratos CLI | v3 最新 | go install github.com/go-kratos/kratos/cmd/kratos/v3@latest |
⚠️ 国内用户注意:若遇到网络问题,建议提前配置 GOPROXY:
bash go env -w GOPROXY=https://goproxy.cn,direct
安装 Kratos CLI 并升级
go install github.com/go-kratos/kratos/cmd/kratos/v3@latest
kratos upgrade # 升级到最新版本
核心用法
1. 创建项目(脚手架)
kratos new helloworld
cd helloworld
go mod download
这会从 GitHub 拉取 kratos-layout 模板,生成一套完整项目结构。
⚠️ 若拉取失败,可手动 git clone 模板后本地创建项目:
bash git clone https://github.com/go-kratos/kratos-layout.git helloworld cd helloworld go mod edit -module github.com/your-org/your-service
2. 生成依赖注入代码(Wire)
go get github.com/google/wire/cmd/wire@latest
go generate ./...
3. 运行服务
kratos run
# 访问 http://localhost:8000/helloworld/kratos
# 期望返回: { "message": "Hello kratos" }
4. 定义新的 Proto API
kratos proto add api/helloworld/helloworld.proto
kratos proto client api/helloworld/helloworld.proto
kratos proto server api/helloworld/helloworld.proto -t internal/service
go generate ./...
kratos run
5. 标准项目结构(来自 kratos-layout)
api/ # Protobuf API 定义及生成的 Go 代码
cmd/ # 应用入口
configs/ # 本地配置文件(YAML)
internal/
server/ # HTTP/gRPC Server 的构造逻辑
service/ # 传输层面的服务方法(暴露给 HTTP/gRPC)
biz/ # 业务用例、实体、错误定义、仓库接口
data/ # 仓库的具体实现(数据库、外部服务等)
third_party/ # Protobuf 依赖
openapi.yaml # 生成的 OpenAPI 文档
6. 手动编写服务入口(不依赖脚手架时)
package main
import (
"log"
"github.com/go-kratos/kratos/v3"
"github.com/go-kratos/kratos/v3/transport/grpc"
"github.com/go-kratos/kratos/v3/transport/http"
pb "github.com/your-org/your-service/api/helloworld/v1"
)
func main() {
httpSrv := http.NewServer(http.Address(":8000"))
grpcSrv := grpc.NewServer(grpc.Address(":9000"))
// 注册服务实现
// v1.RegisterGreeterServer(grpcSrv, &greeterServer{})
// v1.RegisterGreeterHTTPServer(httpSrv, &greeterServer{})
app := kratos.New(
kratos.Name("kratos-app"),
kratos.Version("v1.0.0"),
kratos.Server(httpSrv, grpcSrv),
)
if err := app.Run(); err != nil {
log.Fatal(err)
}
}
7. 代码生成命令速查
| 命令 | 作用 |
|---|---|
kratos new <name> |
创建新项目(拉取 layout 模板) |
kratos proto add <path> |
新增 Proto 文件 |
kratos proto client <path> |
生成 gRPC 客户端桩 |
kratos proto server <path> -t <package> |
生成服务端骨架 |
make init |
安装所有代码生成器(需在 layout 项目内) |
make all |
执行全量生成:API、Config、Wire |
make api |
仅重新生成 API Protobuf 代码 |
make build |
编译项目 |
go test ./... |
运行测试 |
典型适用场景
- 中大型微服务项目:需要统一项目结构、强制分层(service/biz/data)的团队
- API First 开发:先定义 Protobuf,再用自动生成代码,减少手写 REST 或 gRPC 样板
- 需要同时暴露 HTTP 和 gRPC:移动端用 HTTP,前端/内部服务用 gRPC,同一实现双端支持
- 需要强依赖注入治理:Wire 强制声明式注入,适合大型项目的依赖管理
- 云原生部署:自带 Docker 支持,config.yaml 与 Kubernetes 配置天然对齐
坑与注意
-
Go 版本要求高:v3 要求 Go ≥ 1.25,线上项目升级前务必确认版本。(v2 要求 Go ≥ 1.16)
-
v2 → v3 迁移成本:v3 做了不少 breaking change,已有项目迁移前必读官方迁移文档,不要直接
kratos upgrade。 -
protoc 必须安装:没有 protoc,代码生成会静默失败。Linux/macOS 下推荐
brew install protobuf,或从 releases 下载对应平台的二进制。 -
layout 模板依赖 GitHub:在国内网络环境下
kratos new可能超时,建议提前配置代理或手动 clone kratos-layout。 -
Wire 生成失败:若
go generate ./...报错,先确认wire工具链已安装且$GOPATH/bin或$GOBIN在 PATH 中。 -
contrib 包版本同步:Kratos 核心与各 contrib 包的版本需对应,混用可能导致运行时 panic。推荐在
go.mod中锁定具体版本。 -
生产环境不要裸用 layout:layout 里的 in-memory 存储只是示例,生产需替换为真实数据库(建议搭配 gorm、ent 或 sqlx)。
与同类对比
| 框架 | 定位 | 优势 | 劣势 |
|---|---|---|---|
| Kratos | API-first + Protobuf + 分层 | 统一传输层、代码生成完整、适合大团队 | 学习曲线陡、Go 版本要求高 |
| go-zero | 国产、社区活跃 | 文档中文友好、CRUD 生成强 | 传输层不如 Kratos 统一 |
| go-micro | 微服务框架元老 | 生态成熟、插件丰富 | v4 大改版,生态碎片化 |
| go-kit | RPC + 业务抽象 | 极度灵活、不绑架架构 | 大量手写样板,上手成本高 |
| gin | HTTP 框架 | 轻量、生态极广 | 仅 HTTP,缺乏微服务整体方案 |
一句话推荐:如果你团队使用 Go、需要规范的分层架构、同时对外提供 HTTP 和 gRPC 接口,Kratos 是目前最完整的开箱即用方案;如果只是做轻量 HTTP API,直接用 Gin 更简单。
一句话推荐结论
Kratos 是 Go 生态里把微服务工程化做到极致的框架——Protobuf 定义一切、CLI 生成一切、分层约束一切,适合追求规范与效率平衡的中大型团队。