03. go-zero简介及如何学go-zero
- 一、go-zero简介及如何学go-zero
- go-zero官方文档
- go-zero微服务框架入门教程
- go-zero最佳实践
- 学习资料
- 二、go-zero环境搭建
- 三、go-zero杀手锏goctl详细使用
- 官方文档:
- 开发准备工作
- 编写API代码
- 编写rpc代码
- 编写model代码
一、go-zero简介及如何学go-zero
go-zero官方文档
http://go-zero.dev/
go-zero微服务框架入门教程
作者:Mikael
https://www.bilibili.com/medialist/play/389552232?from=space&business=space_series&business_id=2122723
go-zero最佳实践
go-zero-looklook
项目地址:
https://github.com/Mikaelemmmm/go-zero-looklook。
学习资料
- 公众号:微服务器实践
- go-zero-expmple: https://github.com/zeromicro/zero-examples
- zero-contrib: https://github.com/zeromicro/zero-contrib
- 微信社区群
- go-zero-issue: https://github.com/zeromicro/go-zero/issues
二、go-zero环境搭建
- 需要安装以下环境和依赖
- go-zero go mod tidy 会自动下载
- goctl
- protoc: https://github.com/protocolbuffers/protobuf/releases
- protoc-gen-go
- protoc-gen-go-grpc
- goctl安装
Go 1.16 及以后版本
GOPROXY=https://goproxy.cn/,direct go install github.com/zeromicro/go-zero/tools/goctl@latest
查看版本
haima@haima-PC:~$ goctl -v
goctl version 1.3.3 linux/amd64
- 其它依赖安装
如果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 -v
goctl version 1.3.3 linux/amd64
haima@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详细使用
官方文档:
http://go-zero.dev/cn/goctl.html
goctl -help
开发准备工作
-
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
编写API代码
- 新建.api文件
-
手动创建
zero-demo/user-api/api/user.api -
命令行自动创建
mkdir zero-demo && cd zero-demo/
goctl api new user
/**
* api语法示例及语法说明
*/
// api语法版本
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
编写rpc代码
- 新建user.proto
zero-demo/user-rpc/pb/user.proto
写入以下内容
syntax = "proto3";
option go_package = "./pb";
package pb;
//model
message GetUserInfoReq {
int64 id = 1;
}
message GetUserInfoResp {
int64 id = 1;
string nickname = 2;
}
//service
service 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
编写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.1
port=3306
#dbname=looklook_$1
dbname=$1
username=root
passwd=123456
echo "开始创建库:$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
原文笔记: