go-zero 微服务入门

定位

go-zero 是国内的微服务框架,核心不是「写 HTTP 接口」,而是用代码生成把一套微服务骨架搭起来:.api 文件描述接口,goctl 生成 handler / logic / model 三层代码,配套限流、熔断、缓存、链路追踪。

它不是 Web 框架,是工程脚手架。

安装

# 安装 goctl(代码生成工具)
go install github.com/zeromicro/go-zero/tools/goctl@latest

1. 验证
goctl --version

从 .api 到可运行服务

1. 写接口描述

user.api:

syntax = "v1"

type UserReq {
    Id int64 `path:"id"`
}

type UserResp {
    Id   int64  `json:"id"`
    Name string `json:"name"`
}

service user-api {
    @handler GetUser
    get /users/:id (UserReq) returns (UserResp)
}

2. 生成代码

goctl api go -api user.api -dir .

生成的结构:

.
├── etc/user-api.yaml          # 配置文件
├── internal/
│   ├── config/config.go       # 配置结构体
│   ├── handler/getuserhandler.go   # HTTP 层,只做参数解析
│   ├── logic/getuserlogic.go       # 业务逻辑,你在这里写代码
│   ├── svc/servicecontext.go       # 依赖注入容器
│   └── types/types.go         # 请求响应结构
└── user.go                    # 入口

关键:handler 和 types 是生成物,重新生成会覆盖;logic 不会覆盖,业务代码安全。

3. 写业务逻辑

// internal/logic/getuserlogic.go
func (l *GetUserLogic) GetUser(req *types.UserReq) (*types.UserResp, error) {
    user, err := l.svcCtx.UserModel.FindOne(l.ctx, req.Id)
    if err != nil {
        return nil, err
    }
    return &types.UserResp{Id: user.Id, Name: user.Name}, nil
}

4. 生成 Model

goctl model mysql datasource 
  -url "user:pass@tcp(127.0.0.1:3306)/demo" 
  -table "user" -dir ./internal/model

生成带缓存的 CRUD(FindOne 会自动走 Redis,如果配置了的话)。

核心概念

1. 三层结构强制分离

handler(协议转换)→ logic(业务)→ model(数据)。不许跨层调用,这是 go-zero 的硬约定。

好处是职责清晰、好测试。坏处是你不能按自己的方式组织代码。

2. 内置服务治理

配置里加上就能用:

Name: user-api
Host: 0.0.0.0
Port: 8888

1. 限流
Middlewares:
  Breaker: true        # 熔断
  Shedding: true       # 自适应降载
  Timeout: true

1. 链路追踪
Telemetry:
  Name: user-api
  Endpoint: http://jaeger:14268/api/traces

这些在 Spring Cloud 里要装好几个组件,go-zero 是配置项。

3. RPC 与 API 分离

go-zero 区分两种服务:

  • api 服务:对外 HTTP
  • rpc 服务:内部 gRPC(.proto 描述,goctl rpc protoc 生成)

微服务之间走 RPC,对外走 HTTP。这是它和 Gin/Echo 最本质的区别。

常见坑

① 单机项目别用

go-zero 的默认架构假设你有注册中心、配置中心。一个人写个小服务,会被 .api 文件、代码生成、目录约定拖慢。

② 生成的 model 缓存有默认行为

配置了 Redis 后,FindOne 会自动缓存。改了数据库但没清缓存,会读到旧数据——这不是 bug,但很坑。

③ 升级 goctl 要重新生成

模板会变。升级后重新生成的代码可能和之前差异很大,要 review。

什么时候选它

  • 团队做微服务,需要统一的工程结构
  • 需要快速产出大量服务(代码生成的效率优势明显)
  • 国内团队,中文文档和社区能帮上忙

不选它的场景:单体应用、小项目、需要高度自定义架构。

一个现实判断

go-zero 的学习成本不低,但它的成本主要不在框架本身,而在微服务这套东西——服务拆分、注册发现、链路追踪、配置管理,这些不管你用哪个框架都要学。

如果项目根本不需要微服务,go-zero 带来的只有复杂度。

暂无评论

发送评论 编辑评论

|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇