goctl 是 go-zero 的内置脚手架,是提升开发效率的一大利器,可以一键生成代码、文档、部署 k8s yaml、dockerfile 等
参考官网安装https://go-zero.dev/docs/tasks/installation/goctl
创建数据库,把业务表设计好,导入数据库
例如:user.sql
参考https://www.w3cschool.cn/gozero/gozero-2fqy3nn7.html
规范参开https://go-zero.dev/docs/tutorials
我们在写api服务代码的时候是先要在usercenter.api中定义好service中的方法,然后在desc/user中写request、response,这样拆分开的好处是不那么臃肿
syntax = "v1"
info(
title: "用户中心服务"
desc: "用户中心服务"
author: "Mikael"
email: "[email protected]"
version: "v1"
)
import (
"user/user.api"
)
//============================> usercenter v1 <============================
//no need login
@server(
prefix: usercenter/v1
group: user
)
service usercenter {
@doc "register"
@handler register
post /user/register (RegisterReq) returns (RegisterResp)
@doc "login"
@handler login
post /user/login (LoginReq) returns (LoginResp)
}
//need login
@server(
prefix: usercenter/v1
group: user
jwt: JwtAuth
)
service usercenter {
@doc "get user info"
@handler detail
post /user/detail (UserInfoReq) returns (UserInfoResp)
@doc "wechat mini auth"
@handler wxMiniAuth
post /user/wxMiniAuth (WXMiniAuthReq) returns (WXMiniAuthResp)
}
syntax = "v1"
info(
title: "用户实例"
desc: "用户实例"
author: "Mikael"
email: "[email protected]"
)
type User {
Id int64 `json:"id"`
Mobile string `json:"mobile"`
Nickname string `json:"nickname"`
Sex int64 `json:"sex"`
Avatar string `json:"avatar"`
Info string `json:"info"`
}
type (
RegisterReq {
Mobile string `json:"mobile"`
Password string `json:"password"`
}
RegisterResp {
AccessToken string `json:"accessToken"`
AccessExpire int64 `json:"accessExpire"`
RefreshAfter int64 `json:"refreshAfter"`
}
)
type (
LoginReq {
Mobile string `json:"mobile"`
Password string `json:"password"`
}
LoginResp {
AccessToken string `json:"accessToken"`
AccessExpire int64 `json:"accessExpire"`
RefreshAfter int64 `json:"refreshAfter"`
}
)
type (
WXMiniAuthReq {
Code string `json:"code"`
IV string `json:"iv"`
EncryptedData string `json:"encryptedData"`
}
WXMiniAuthResp {
AccessToken string `json:"accessToken"`
AccessExpire int64 `json:"accessExpire"`
RefreshAfter int64 `json:"refreshAfter"`
}
)
type (
UserInfoReq {
}
UserInfoResp {
UserInfo User `json:"userInfo"`
}
)
api规则参考https://go-zero.dev/docs/tutorials/cli/api
rpc规则参考https://go-zero.dev/docs/tutorials/cli/rpc
命令行进入service/user/api/desc目录下。执行
goctl api go -api *.api -dir ../
命令行进入service/user/rpc/bp目录下。执行
goctl rpc protoc *.proto --go_out=../ --go-grpc_out=../
参考go-zero数据库章
参考-添加yaml配置(通过etcd连) https://www.w3cschool.cn/gozero/gozero-7xrw3nm1.html
Name: user
Host: 0.0.0.0
Port: 8888
#rpc service 直连配置
UserRpcConf:
Endpoints:
- 127.0.0.1:2004
NonBlock: true
type Config struct {
rest.RestConf
UserRpcConf zrpc.RpcClientConf //RPC配置
}
type ServiceContext struct {
Config config.Config
UserRpc user.UserZrpcClient //RPC配置
}
func NewServiceContext(c config.Config) *ServiceContext {
return &ServiceContext{
Config: c,
UserRpc: user.NewUserZrpcClient(zrpc.MustNewClient(c.UserRpcConf)), //RPC配置
}
}
l.svcCtx.UserRpc.GetUser(l.ctx, &user.IdRequest{
Id: "1",
})
Name: user
Host: 0.0.0.0
Port: 8888
#jwtAuth
JwtAuth:
AccessSecret: ae0536f9-6450-4606-8e13-5a19ed505da0
AccessExpire: 7200
#rpc service 直连配置
UserRpcConf:
Endpoints:
- 127.0.0.1:2004
NonBlock: true
type Config struct {
rest.RestConf
JwtAuth struct { // jwt鉴权配置
AccessSecret string // jwt密钥
AccessExpire int64 // 有效期,单位:秒
}
UserRpcConf zrpc.RpcClientConf //RPC配置
}
l.svcCtx.Config.JwtAuth.AccessSecret
在go-zero中,中间件可以分为路由中间件和全局中间件,路由中间件是指某一些特定路由需要实现中间件逻辑,其和jwt类似,没有放在jwt:xxx下的路由不会使用中间件功能, 而全局中间件的服务范围则是整个服务。
参考1:s://www.w3cschool.cn/gozero/gozero-alqu3nnc.html
参考2:https://go-zero.dev/docs/tutorials/api/middleware
在前面我们已经根据user.api和usr.pb生成了对应的api和RPC代码,我们只需要填充对应的业务逻辑即可。
service/user/api/internal/logic/user/registerlogic.go
service/user/rpc/internal/logic/registerlogic.go
参考go-zero错误处理章