Abel'Blog

我干了什么?究竟拿了时间换了什么?

0%

go-zero

概述

go-zero 包含极简的 API 定义和生成工具 goctl,可以根据定义的 api 文件一键生成 Go, iOS, Android, Kotlin, Dart, TypeScript, JavaScript 代码,并可直接运行。

使用 go-zero 的好处:

  • 轻松获得支撑千万日活服务的稳定性
  • 内建级联超时控制、限流、自适应熔断、自适应降载等微服务治理能力,无需配置和额外代码
  • 微服务治理中间件可无缝集成到其它现有框架使用
  • 极简的 API 描述,一键生成各端代码
  • 自动校验客户端请求参数合法性
  • 大量微服务治理和并发工具包

快速上手

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 安装 goct 软件
go install github.com/zeromicro/go-zero/tools/goctl@latest

# 安装插件
goctl env check --install --verbose --force

# 检查是否已经安装完成
goctl env check --verbose
[goctl-env]: preparing to check env

[goctl-env]: looking up "protoc"
[goctl-env]: "protoc" is installed

[goctl-env]: looking up "protoc-gen-go"
[goctl-env]: "protoc-gen-go" is installed

[goctl-env]: looking up "protoc-gen-go-grpc"
[goctl-env]: "protoc-gen-go-grpc" is installed

[goctl-env]: congratulations! your goctl environment is ready!

$ mkdir <project name> && cd <project name> # project name 为具体值
$ go mod init <module name> # module name 为具体值
$ go get -u github.com/zeromicro/go-zero@latest

DSL 语言

在 Go Zero 框架中,DSL(Domain-Specific Language)通常用于定义 API 接口、数据库模型等。Go Zero 提供了 apimodel 等工具,可以通过简洁的 DSL 来生成对应的代码。

1. API DSL

在 Go Zero 中,API 的 DSL 文件通常以 .api 结尾,定义了 HTTP 路由、请求和响应结构。下面是一个简单的 API DSL 示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
info(
title: "User API"
desc: "This is a simple user API"
author: "Your Name"
version: "1.0.0"
)

type (
UserRequest {
UserId int `json:"userId"`
}

UserResponse {
Name string `json:"name"`
Email string `json:"email"`
}
)

service user-api {
@handler GetUser
get /user/:userId(UserRequest) returns (UserResponse)
}

解释:

  • info: 定义了 API 的元信息,比如标题、描述、作者、版本等。
  • type: 定义了请求和响应的结构体。
  • service: 定义了服务,user-api 是服务名。
  • @handler GetUser: 指定了处理这个请求的处理函数。
  • get /user/:userId: 定义了一个 GET 请求,路径参数为 userId,请求体使用 UserRequest,响应体使用 UserResponse

2. Model DSL

Go Zero 的 model 工具用于生成数据库模型。可以通过定义 DSL 文件,自动生成 CRUD 操作的代码。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
type (
User struct {
Id int64 `db:"id"`
Name string `db:"name"`
Email string `db:"email"`
CreatedAt time.Time `db:"created_at"`
}
)

method (
FindOne(id int64) (*User, error)
Insert(data *User) error
Update(data *User) error
Delete(id int64) error
)

解释:

  • type: 定义了数据库表结构,这里的 User 对应数据库中的 user 表。
  • method: 定义了自动生成的数据库操作方法,比如 FindOneInsertUpdateDelete

3. 如何生成代码

在定义好 .api 文件或模型的 DSL 文件后,可以使用 Go Zero 提供的工具生成对应的代码。

  • 生成 API 代码:

    1
    goctl api go -api user.api -dir .
  • 生成 Model 代码:

    1
    goctl model mysql ddl -src user.sql -dir .

通过这些 DSL,Go Zero 可以帮助开发者快速生成标准化的代码,减少手动编写的工作量。

使用gRpc方式来制作

1
2
3
4
# 单个 rpc 服务生成示例指令
$ goctl rpc protoc greet.proto --go_out=./pb --go-grpc_out=./pb --zrpc_out=. --client=true
# 多个 rpc 服务生成示例指令
$ goctl rpc protoc greet.proto --go_out=./pb --go-grpc_out=./pb --zrpc_out=. --client=true -m

model 导出数据

1
goctl model pg datasource --url "postgres://postgres:123456@127.0.0.1:5432/postgres?sslmode=disable" -table="tb_kline_config,tb_kline_data,tb_kline_rpc,tb_token_quote"

引用