GoZero微服务个人探究之路(九)api文件编写总结

参考来源go-zero官方文档icon-default.png?t=N7T8https://go-zero.dev/docs/tutorials

前言

go-zero是目前star最多的go语言微服务框架,api 是 go-zero特殊的语言,类型文件,go-zero自带的goctl可以通过.api文件生成http服务代码

api文件内容编写

不可使用关键字

沿用了golang的关键字,这些都不可以使用

break        default      func         interface    select
case         defer        go           map          struct
chan         else         goto         package      switch
const        fallthrough  if           range        type
continue     for          import       return       var

syntax语句

代表了api语言版本,当前就是v1版本

syntax = "v1"

info语句

info对api文件编写描述信息,目前不会参与到goctl代码生成

info语句
info (
foo: "bar"
bar:
)

import语句

用于import其他api文件,支持相对和绝对路径
import "/path/to/file"

import (
"bar"
"relative/to/file"
)

数据类型

数据类型沿用golang数据类型,目前不支持数组,支持切片,不支持别名

不需要声明struct关键字

//单个结构体

type Bar {
Foo int `json:"foo"`
Bar bool `json:"bar"`
Baz []string `json:"baz"`
Qux map[string]string `json:"qux"`
}

//结构体组

type (
Int int
Integer = int
        Bar {
        Foo int `json:"foo"`
        Bar bool `json:"bar"`
        Baz []string `json:"baz"`
        Qux map[string]string `json:"qux"`
        }
)

service语句*

@server描述服务的meta信息

@server (
    // jwt 声明
    // 如果 key 固定为 “jwt:”,则代表开启 jwt 鉴权声明
    // value 则为配置文件的结构体名称
    jwt: Auth

    // 路由前缀
    // 如果 key 固定为 “prefix:”
    // 则代表路由前缀声明,value 则为具体的路由前缀值,字符串中没让必须以 / 开头
    prefix: /v1

    // 路由分组
    // 如果 key 固定为 “group:”,则代表路由分组声明
    // value 则为具体分组名称,在 goctl生成代码后会根据此值进行文件夹分组
    group: Foo

    // 中间件
    // 如果 key 固定为 middleware:”,则代表中间件声明
    // value 则为具体中间件函数名称,在 goctl生成代码后会根据此值进生成对应的中间件函数
    middleware: AuthInterceptor

    // 超时控制
    // 如果 key 固定为  timeout:”,则代表超时配置
    // value 则为具体中duration,在 goctl生成代码后会根据此值进生成对应的超时配置
    timeout: 3s

    // 其他 key-value,除上述几个内置 key 外,其他 key-value
    // 也可以在作为 annotation 信息传递给 goctl 及其插件,但就
    // 目前来看,goctl 并未使用。
    foo: bar
)

写service语句还需了解如下内容

@doc语句

对单个路由的meta信息描述

@doc (
foo: "bar"
bar: "baz"
)

@handler语句

描述单个路由的handler信息

@handler foo

路由语句
// 没有请求体和响应体的写法
get /ping

// 只有请求体的写法
get /foo (foo)

// 只有响应体的写法
post /foo returns (foo)

// 有请求体和响应体的写法
post /foo (foo) returns (bar)

service语句的示例写法

// 带 @server 的写法
@server (
    prefix: /v1
    group: Login
)
service user {
    @doc "登录"
    @handler login
    post /user/login (LoginReq) returns (LoginResp)

    @handler getUserInfo
    get /user/info/:id (GetUserInfoReq) returns (GetUserInfoResp)
}
@server (
    prefix: /v1
    middleware: AuthInterceptor
)
service user {
    @doc "登录"
    @handler login
    post /user/login (LoginReq) returns (LoginResp)

    @handler getUserInfo
    get /user/info/:id (GetUserInfoReq) returns (GetUserInfoResp)
}

补充

路由前缀prefix

可以为同样的路由名指定不同的前缀,v1、v2

在routes.go里面,代码体现如下

服务分组group

指定分组的信息后,生成的代码更加逻辑清晰

签名开关signature

在@server部分可以设置signature为true来开启签名功能

生成routes.go代码示例如下

JWT认证

@server里面设置jwt:Auth开启

goctl生成代码如下

代码生成后的 jwt 认证,框架只做了服务端逻辑,对于 jwt token 的生成及 refresh token 仍需要开发者自行实现

中间件声明

在@server内通过middleware:来指定中间件,多个中间件逗号分隔

生成的目录结构就会有中间件代码

  • 21
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
以下是基于 gozero微服务开发规范: ## 1. 项目结构 ``` - app - api # 对外提供 HTTP/GRPC 接口 - rpc # 对内提供 RPC 接口,如其他微服务调用 - schema # 存放 proto 文件 - configs # 存放配置文件 - internal - config # 配置文件解析 - logic # 业务逻辑处理 - model # 数据库操作相关 - service # 服务注册与发现相关 - pkg # 公共库或工具类 - scripts # 脚本文件 - Dockerfile # 镜像构建 Dockerfile - go.mod # 依赖管理文件 - go.sum # 依赖版本锁定文件 - main.go # 程序入口文件 ``` ## 2. 代码规范 ### 2.1 代码风格 遵循 Go 官方代码风格规范,使用 gofmt 工具自动格式化代码。 ### 2.2 命名规范 - 使用驼峰式命名,首字母小写 - 结构体、接口等公共类型首字母大写 - 常量、变量名使用下划线分割多个单词 - 函数名使用驼峰式命名,首字母大写 ### 2.3 注释规范 - 每个函数、变量都应该有注释 - 函数、结构体、接口等公共类型需要写注释说明其作用和使用方法 - 每个文件应该有版权信息和文件功能说明的注释 ### 2.4 错误处理 - 函数返回错误时必须处理 - 错误信息应该清晰明了,包含错误码和错误信息 - 错误码应该定义在公共库,避免重复定义 ## 3. 日志规范 - 使用 go-zero 提供的日志库 - 日志应该包含时间、级别、文件名、行号,方便定位问题 - 日志级别分为 debug、info、warn、error、fatal - 在开发环境,建议使用 debug 级别,方便调试 - 在生产环境,建议使用 info 级别及以上,不要记录过多调试信息 ## 4. 配置规范 - 使用 go-zero 提供的配置库 - 配置文件应该根据环境分为 dev、test、prod 等不同的文件 - 建议将配置信息定义为结构体,在代码直接使用结构体获取配置信息,避免硬编码 ## 5. 测试规范 - 编写单元测试和集成测试,覆盖代码的不同分支和情况 - 使用 go test 进行测试,并使用 go-coverage 工具查看测试覆盖率 - 在进行集成测试时应该使用真实的依赖,而不是使用 mock 对象 - 使用 docker-compose 进行本地集成测试,保证测试环境的一致性 ## 6. 版本控制 - 使用 git 进行版本控制 - 使用 git-flow 工作流,避免分支混乱 - 统一 Commit Message 格式,方便查看历史记录 - 定期进行代码 review,避免代码风格和规范问题 ## 7. 部署规范 - 使用 Docker 进行部署 - 编写 Dockerfile,并利用 CI/CD 工具进行自动构建和部署 - 部署时应该分离环境,如 dev、test、prod 等 - 在生产环境使用容器编排工具,如 Kubernetes 等,保证高可用性和水平扩展性。 以上是基于 gozero微服务开发规范,希望能对你有所帮助。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夏目艾拉

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值