03. go-zero简介及如何学go-zero

网友投稿 333 2022-10-21

03. go-zero简介及如何学go-zero

目录

​​一、go-zero简介及如何学go-zero​​

​​1.go-zero官方文档​​​​2.go-zero微服务框架入门教程​​​​3.go-zero最佳实践​​​​4.学习资料​​

​​二、go-zero环境搭建​​

​​1.需要安装以下环境和依赖​​​​2.goctl安装​​​​3.其它依赖安装​​

​​三、go-zero杀手锏goctl详细使用​​

​​1.官方文档:​​​​2.开发准备工作​​​​3.编写API代码​​​​4.编写RPC代码​​​​5.编写Model代码​​

​​五、API服务之API文件​​

​​1.生成API文档​​​​2.atServer关键key描述说明​​

一、go-zero简介及如何学go-zero

1.go-zero官方文档

​​go mod tidy 会自动下载goctlprotoc:​​1.16 及以后版本​

GOPROXY=go install github.com/zeromicro/go-zero/tools/goctl@latest查看版本haima@haima-PC:~$ goctl -vgoctl version 1.3.3 linux/amd64

3.其它依赖安装

如果​​goctl​​安装的版本是>=1.3.3版本的,执行以命令就可以自动安装protoc,protoc-gen-go,protoc-gen-go-grpc三个依赖

haima@haima-PC:/media/haima/34E401CC64DD0E282/site/go/src/haimait/learn/go-zero/zero-demo$ goctl -vgoctl version 1.3.3 linux/amd64haima@haima-PC:/media/haima/34E401CC64DD0E282/site/go/src/haimait/learn/go-zero/zero-demo$ goctl env check -i -f[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!

goctl版本小于 1.3.3 参考以下文章安装

三、go-zero杀手锏goctl详细使用

1.官方文档:

​​-help

2.开发准备工作

ide插件市场里安装goctl插件安装​​protobuf​​插件配置命令别名

vim ~/.bashrc

alias apigen="goctl api go -api *.api -dir ../ --style=goZero"alias rpcgen="goctl rpc protoc *.proto --go_out=../ --go-grpc_out=../ --zrpc_out=../ --style=goZero"

source ~/.bashrc

3.编写API代码

新建.api文件

手动创建 zero-demo/user-api/api/user.api命令行自动创建 mkdir zero-demo && cd zero-demo/ goctl api new user

syntax = "v1"info( author: "user-api" date: "2022-03-26" desc: "api语法示例及语法说明")type UserInfoRequest { UserId int64 `json:"userId"`}type UserInfoResponse { UserId int64 `json:"userId"` Nickname string `json:"nickname"`}service user-api{ @doc "获取用户信息" @handler userInfo post /user/info (UserInfoRequest) returns (UserInfoResponse)}

进入api目标 cd user-api/api/生成api

方法一:

用原始命令:

​​goctl api go -api *.api -dir ../ --style=goZero​​

方法二:

用别名:

apigen

命令说明:

-dir 代码输出目录

--api 指定api源文件

--style 指定生成代码文件的文件名称风格,详情见文件名称命名style说明

会在​​user-api​​目录里生成代码

目标结构:

zero-demo/user-api/api$ cd ..zero-demo/user-api$ cd ..zero-demo$ tree.├── go.mod└── user-api ├── api │ └── user.api ├── etc │ └── user-api.yaml ├── internal │ ├── config │ │ └── config.go │ ├── handler │ │ ├── routes.go │ │ └── userInfoHandler.go │ ├── logic │ │ └── userInfoLogic.go │ ├── svc │ │ └── serviceContext.go │ └── types │ └── types.go └── user.go

下载依赖

​​zero-demo$ go mod tidy​​

生成Dockerfile文件

​​zero-demo/user-api$ goctl docker --go user.go​​

会生成​​Dockerfile​​文件

​​zero-demo/user-api/Dockerfile​​

生成k8s配置文件​​go-zero/zero-demo/user-api$ goctl kube deploy -name user-api -namespace go-zero-looklook -image user-api:v1.0 -o user-api.yml -port 1001 -nodePort 31001​​

会生成配置文件

zero-demo/user-api/user-api.yml

4.编写RPC代码

新建user.proto

zero-demo/user-rpc/pb/user.proto

写入以下内容

syntax = "proto3";option go_package = "./pb";package pb;//modelmessage GetUserInfoReq { int64 id = 1;}message GetUserInfoResp { int64 id = 1; string nickname = 2;}//serviceservice usercenter { rpc GetUserInfo(GetUserInfoReq) returns(GetUserInfoResp);}

生成代码

进入目录:

​​cd zero-demo/user-rpc/pb​​

执行命令:

zero-demo/user-rpc/pb$ goctl rpc protoc *.proto --go_out=../ --go-grpc_out=../ --zrpc_out=../ --style=goZero

或者用别名:

zero-demo/user-rpc/pb$ rpcgen

会在​​user-rpc​​目录里生成代码

查看生成目录

haima@haima-PC:/media/haima/34E401CC64DD0E282/site/go/src/haimait/learn/go-zero/zero-demo$ tree.├── go.mod├── go.sum├── user-api│ ├── api│ │ └── user.api│ ├── Dockerfile│ ├── etc│ │ └── user-api.yaml│ ├── internal│ │ ├── config│ │ │ └── config.go│ │ ├── handler│ │ │ ├── routes.go│ │ │ └── userInfoHandler.go│ │ ├── logic│ │ │ └── userInfoLogic.go│ │ ├── svc│ │ │ └── serviceContext.go│ │ └── types│ │ └── types.go│ ├── user-api.yml│ └── user.go└── user-rpc ├── etc │ └── user.yaml ├── internal │ ├── config │ │ └── config.go │ ├── logic │ │ └── getUserInfoLogic.go │ ├── server │ │ └── usercenterServer.go │ └── svc │ └── serviceContext.go ├── pb │ ├── user_grpc.pb.go │ ├── user.pb.go │ └── user.proto ├── usercenter │ └── usercenter.go └── user.go

下载依赖

zero-demo$ go mod tidy

5.编写Model代码

编写脚本文件​​genModel.sh​​

go-zero/zero-demo/genModel.sh

#!/usr/bin/env bash# 使用方法: 第一个参数为数据库名 第二个参数为表名# ./genModel.sh mall user# ./genModel.sh usercenter user_auth# 再将./genModel下的文件剪切到对应服务的model目录里面,记得改package#生成的表名tables=$2#表生成的genmodel目录modeldir=./genModel# 数据库配置host=127.0.0.1port=3306#dbname=looklook_$1dbname=$1username=rootpasswd=123456echo "开始创建库:$dbname 的表:$2"goctl model mysql datasource -url="${username}:${passwd}@tcp(${host}:${port})/${dbname}" -table="${tables}" -dir="${modeldir}" -cache=true --style=goZero

生成代码

​​./genModel.sh​​

会生成目录

./genModel

查看生成代码

haima@haima-PC:/media/haima/34E401CC64DD0E282/site/go/src/haimait/learn/go-zero/zero-demo$ tree.├── genModel│ ├── userModel.go│ └── vars.go├── genModel.sh├── go.mod├── go.sum├── user-api│ ├── api│ │ └── user.api│ ├── Dockerfile│ ├── etc│ │ └── user-api.yaml│ ├── internal│ │ ├── config│ │ │ └── config.go│ │ ├── handler│ │ │ ├── routes.go│ │ │ └── userInfoHandler.go│ │ ├── logic│ │ │ └── userInfoLogic.go│ │ ├── svc│ │ │ └── serviceContext.go│ │ └── types│ │ └── types.go│ ├── user-api.yml│ └── user.go└── user-rpc ├── etc │ └── user.yaml ├── internal │ ├── config │ │ └── config.go │ ├── logic │ │ └── getUserInfoLogic.go │ ├── server │ │ └── usercenterServer.go │ └── svc │ └── serviceContext.go ├── pb │ ├── user_grpc.pb.go │ ├── user.pb.go │ └── user.proto ├── usercenter │ └── usercenter.go └── user.go

下载依赖

zero-demo$ go mod tidy

五、API服务之API文件

1.生成API文档

根据user.api文件生成.md文档

执行命令:

​​go-zero-demo\user-api\api> goctl api doc --dir ./​​

会生成 ​​go-zero-demo\user-api/api/user.md​​ 文件

2.atServer关键key描述说明

修饰service时

路由组(group)和路由前缀(prefix)

参考文档:

​​service block@server( group: user prefix: api/v1)

例子:

syntax = "v1"info( author: "user-api" date: "2022-03-26" desc: "api语法示例及语法说明")type UserInfoRequest { UserId int64 `json:"userId"`}type UserInfoResponse { UserId int64 `json:"userId"` Nickname string `json:"nickname"`}type UserUpdateRequest { UserId int64 `json:"userId"` Nickname string `json:"nickname"`}type UserUpdateResponse { Flag bool `json:"flag"`}// service block@server( group: user prefix: api/v1)service user-api{ @doc "获取用户信息" @handler userInfo post /user/info (UserInfoRequest) returns (UserInfoResponse) @doc "修改用户信息" @handler upDateUser post /user/update (UserUpdateRequest) returns (UserUpdateResponse)}

执行生成命令:

​​go-zero-demo\user-api\api> goctl api go -api user.api -dir ../ --style=goZero​​

生成的路由:

// Code generated by goctl. DO NOT EDIT.package handlerimport ( "net/ user "go-zero-demo/user-api/internal/handler/user" "go-zero-demo/user-api/internal/svc" "github.com/zeromicro/go-zero/rest")func RegisterHandlers(server *rest.Server, serverCtx *svc.ServiceContext) { server.AddRoutes( []rest.Route{ { Method: Path: "/user/info", Handler: user.UserInfoHandler(serverCtx), }, { Method: Path: "/user/update", Handler: user.UpDateUserHandler(serverCtx), }, }, rest.WithPrefix("/api/v1"), #生成的路由前缀 )}

生成文件

go-zero-demo\user-api\internal\handler\user\upDateUserHandler.go

go-zero-demo\user-api\internal\handler\user\userInfoHandler.go

go-zero-demo\user-api\internal\logic\user\upDateUserLogic.go

go-zero-demo\user-api\internal\logic\user\userInfoLogic.go

├── user-api│ ├── api│ │ └── user.api│ ├── Dockerfile│ ├── etc│ │ └── user-api.yaml│ ├── internal│ │ ├── config│ │ │ └── config.go│ │ ├── handler│ │ │ ├── user│ │ │ │ ├── upDateUserHandler.go│ │ │ │ └── userInfoHandler.go│ │ │ ├── routes.go│ │ ├── logic│ │ │ ├── user│ │ │ │ ├── upDateUserLogic.go│ │ │ └── └── userInfoLogic.go│ │ ├── svc│ │ │ └── serviceContext.go│ │ └── types│ │ └── types.go│ ├── user-api.yml│ └── user.go

访问路由:

/api/v1/user/info/api/v1/user/update

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:使用Feign设置Token鉴权调用接口
下一篇:docker安装mysql
相关文章

 发表评论

暂时没有评论,来抢沙发吧~