api的概述
api 是 go-zero 自研的领域特性语言(下文称 api 语言 或 api 描述语言),旨在实现人性化的基础描述语言,作为生成 HTTP 服务最基本的描述语言。
使用之前我们需要提前安装配置好Goctl。goctl 是 go-zero 的内置脚手架。
api 领域特性语言包含语法版本,info 块,结构体声明,服务描述等几大块语法组成。类似于Goland的结构体写法,只是移除了struct关键字。
syntax
syntax 语句用于标记 api 语言的版本,不同的版本可能语法结构有所不同,随着版本的提升会做不断的优化,当前版本为 v1。
syntax = "v1"
info()
info 语句是 api 语言的 meta 信息,仅仅对当前的api文档进行说明描述,不进行代码生成。
// 包含 key-value 的 info 块
info (
foo: "bar"
bar: ""
)
type()
type可以用于定义请求体和响应体,type 可以定义多个。
type(
// 定义获取用户信息的JSON请求体
loginReq{
username string `json:"username"`
password string `json:"password"`
}
// 定义获取用户信息的JSON响应体
loginResp{
Id int `json:"id"`
Name string `json:"name"`
Token string `json:"token"`
}
)
@server()
@server()用于定义HTTP服务,主要的功能有,路由分组、路由前缀、中间件声明、超时配置、jwt鉴权开关。
@server(
// 设置服务分组,代码生成在login目录下
group: login
// 定义路由前缀为'v1'
prefix: /v1
// 定义一个鉴权控制的中间件
// 多个中间件以英文逗号,分割,
// 如 Middleware1,Middleware2
// 中间件按声明顺序执行
middleware: AuthInterceptor
// jwt 鉴权开关
jwt: Auth
// 定义一个超时时长为 3 秒的超时配置
timeout: 3s
)
service 定义一个自己的服务
// 定义 user 服务
service user {
// 定义 handfunc转换的go文件名称及方法
@handle login
// 定义接口
// 定义一个POST请求
// 请求地址是/user/login
// 请求体式Request, 响应体式Response
post /user/login(Request) returns (Response)
}
一个简单多的api文件只需要包含
syntax ="v1"
service(
get /ping
)
即可。 在shorturl.api目录下执行以下终端命令,即可生成代码
goctl api go -api shorturl.api -dir ./
最终生成的代码结构如下:
个人观点:go-zero是一个很好的微服务框架,可以轻松支撑起千万级别的服务请求,并具有高并发、高可用、易扩展等的特性。我们可以使用简单的api语法搭建一个可运行go-zero项目。