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。

学习资料

  1. 公众号:微服务器实践
  2. go-zero-expmple: https://github.com/zeromicro/zero-examples
  3. zero-contrib: https://github.com/zeromicro/zero-contrib
  4. 微信社区群
  5. go-zero-issue: https://github.com/zeromicro/go-zero/issues

二、go-zero环境搭建

  1. 需要安装以下环境和依赖
  • go-zero go mod tidy 会自动下载
  • goctl
  • protoc: https://github.com/protocolbuffers/protobuf/releases
  • protoc-gen-go
  • protoc-gen-go-grpc
  1. 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
  1. 其它依赖安装

如果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

开发准备工作

  1. ide插件市场里安装goctl插件

  2. 安装protobuf插件

  3. 配置命令别名

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代码

  1. 新建.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)
}
  1. 进入api目标
    cd user-api/api/

  2. 生成api

方法一:

用原始命令:

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

方法二:

用别名:

apigen

命令说明:

-dir 代码输出目录
--api 指定api源文件
--style 指定生成代码文件的文件名称风格,详情见文件名称命名style说明

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

  1. 目标结构:
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
  1. 下载依赖

zero-demo$ go mod tidy

  1. 生成Dockerfile文件

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

会生成Dockerfile文件

zero-demo/user-api/Dockerfile

  1. 生成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代码

  1. 新建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);
}

  1. 生成代码

进入目录:
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目录里生成代码

  1. 查看生成目录
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

  1. 下载依赖
zero-demo$ go mod tidy

编写model代码

  1. 编写脚本文件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
  1. 生成代码

./genModel.sh

会生成目录
./genModel

  1. 查看生成代码
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
  1. 下载依赖
zero-demo$ go mod tidy

原文笔记: