03. go-zero简介及如何学go-zero
一、go-zero简介及如何学go-zero
1.go-zero官方文档
2.go-zero微服务框架入门教程
作者:Mikael
3.go-zero最佳实践
go-zero-looklook
项目地址:
https://github.com/Mikaelemmmm/go-zero-looklook
4.学习资料
- 公众号:微服务器实践
- 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环境搭建
1.GO环境和Gopath的配置
linux配置
export GOROOT="/home/haima/local/go" #go的源码包
export GOPATH=/media/haima/34E401CC64DD0E282/site/go #工作地址路径
export PATH=$PATH:$GOROOT/bin:$GOPATH/bin
更多详细参考以下连接:
https://www.cnblogs.com/haima/p/12057933.html
1.需要安装以下环境和依赖
- go-zero go mod tidy 会自动下载
- goctl
- protoc: https://github.com/protocolbuffers/protobuf/releases
- protoc-gen-go
- protoc-gen-go-grpc
2.goctl安装
Go 1.16 及以后版本
GOPROXY=https://goproxy.cn/,direct go install github.com/zeromicro/go-zero/tools/goctl@latest
查看版本
haima@haima-PC:~/Desktop$ goctl -v
goctl version 1.3.5 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 -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!
查看已经安装的环境
haima@haima-PC:~/Desktop$ protoc --version
libprotoc 3.19.4
haima@haima-PC:~/Desktop$ protoc-gen-go --version
protoc-gen-go v1.28.0
haima@haima-PC:~/Desktop$ protoc-gen-go-grpc --version
protoc-gen-go-grpc 1.2.0
文件会安装到gopath目录里

goctl版本小于 1.3.3 参考以下文章安装
https://www.cnblogs.com/haima/p/15859782.html
三、go-zero杀手锏goctl详细使用
1.官方文档:
http://go-zero.dev/cn/goctl.html
goctl -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;
//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
执行命令:
windows下*号改成具体的文件名,如user.proto
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-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.1
port=3306
#dbname=looklook_$1
dbname=$1
username=root
passwd=123456
echo "开始创建库:$dbname 的表:$2"
# -cache=true 带缓存
#goctl model mysql datasource -url="${username}:${passwd}@tcp(${host}:${port})/${dbname}" -table="${tables}" -dir="${modeldir}" -cache=true --style=goZero
# 不带缓存
goctl model mysql datasource -url="${username}:${passwd}@tcp(${host}:${port})/${dbname}" -table="${tables}" -dir="${modeldir}" --style=goZero
- 生成代码
./genModel.sh
会生成目录
./genModel
- 查看生成代码
haima@haima-PC:/media/haima/34E401CC64DD0E282/site/go/src/haimait/learn/go-zero/zero-demo$ tree
.
├── genModel/
│ ├── userModel_gen.go
│ ├── userModel.go
│ └── vars.go
重复执行生成代码时,文件 userModel.go 和 vars.go 不会修改,自定义的代码可以写在这两个文件个文件中
如何生成带缓存的model,会根据主键和唯一索引作为key生成生成缓存。
如下面粟子:
goZeroDemoUserIdKey 和 goZeroDemoUserMobileKey即为缓存的key
func (m *defaultUserModel) Insert(ctx context.Context, data *User) (sql.Result, error) {
goZeroDemoUserIdKey := fmt.Sprintf("%s%v", cacheGoZeroDemoUserIdPrefix, data.Id)
goZeroDemoUserMobileKey := fmt.Sprintf("%s%v", cacheGoZeroDemoUserMobilePrefix, data.Mobile)
ret, err := m.ExecCtx(ctx, func(ctx context.Context, conn sqlx.SqlConn) (result sql.Result, err error) {
query := fmt.Sprintf("insert into %s (%s) values (?, ?, ?, ?, ?, ?, ?, ?, ?)", m.table, userRowsExpectAutoSet)
return conn.ExecCtx(ctx, query, data.Id, data.Name, data.Age, data.Gender, data.Mobile, data.Password, data.CreatedAt, data.UpdatedAt, data.DeletedAt)
}, goZeroDemoUserIdKey, goZeroDemoUserMobileKey)
return ret, err
}
- 下载依赖
zero-demo$ go mod tidy
原文笔记:
https://www.cnblogs.com/haima/p/16057786.html
五、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)
参考文档:
http://go-zero.dev/cn/api-grammar.html
语法:
// 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"`
}
// 看这里 声名 路由组(group)和路由前缀(prefix)
// 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 handler
import (
"net/http"
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: http.MethodPost,
Path: "/user/info",
Handler: user.UserInfoHandler(serverCtx),
},
{
Method: http.MethodPost,
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
03. go-zero简介及如何学go-zero的更多相关文章
- knockoutJS学习笔记03:knockout简介
通常来说,前端的维护难度是比较大的,特别是脚本,虽然像jquery这样的库可以帮助我们减少很多代码,但在稍微复杂的情况下,还是会产生有很多代码.上一篇介绍了模板引擎jsRender,它可以帮我们快速生 ...
- 【03】AngularJS 简介
AngularJS 简介 AngularJS 是一个 JavaScript 框架.它可通过 <script> 标签添加到 HTML 页面. AngularJS 通过 指令 扩展了 HTML ...
- Java集合类简单总结(重学)
java集合类简介(重学) 一.Collection(集合).Map接口两者应该是平行关系吧. 1.Map介绍 Map是以键值(key-value)对来存放的,2个值.通过key来找到value(例: ...
- Android查缺补漏(IPC篇)-- 进程间通讯之Socket简介及示例
本文作者:CodingBlock 文章链接:http://www.cnblogs.com/codingblock/p/8425736.html 进程间通讯篇系列文章目录: Android查缺补漏(IP ...
- 一、MySQL数据库之简介和安装
一.基础部分 1.数据库是简介 之前所学,数据要永久保存,比如用户注册的用户信息,都是保存于文件中,而文件只能存在于某一台机器上. 如果我们不考虑从文件中读取数据的效率问题,并且假设我们的程序 ...
- 零基础学Python_汇总贴
https://time.geekbang.org/course/intro/98 零基础学Python-第一章 :Python介绍和安装-01.Python语言的特点 零基础学Python-第一章 ...
- 【讲座】朱正江——基于LC-MS的非靶向代谢组学
本次课程主题为<基于LC-MS的非靶向代谢组学>,主要分为代谢组学简介.代谢组学技术简介.非靶向代谢组学方法和数据采集.非靶向代谢组学数据分析和代谢物结构鉴定几个方面. 一.代谢组简介 基 ...
- JAVA EE企业级开发四步走完全攻略 [转]
http://bbs.51cto.com/thread-550558-1.html 本文是J2EE企业级开发四步走完全攻略索引,因内容比较广泛,涉及整个JAVA EE开发相关知识,这是一个长期的计划, ...
- 《深入理解JAVA虚拟机》笔记1
java程序运行时的内存空间,按照虚拟机规范有下面几项: )程序计数器 指示下条命令执行地址.当然是线程私有,不然线程怎么能并行的起来. 不重要,占内存很小,忽略不计. )方法区 这个名字很让我迷惑. ...
- 基于go语言结合微信小程序开发的微商城系统
最近在慕课网上录制了一门<Golang微信小程序微商城系统原型>,这门免费课程特别适合在校大学生或者刚毕业的大学生,go语言初学者以及想要从事微商城开发项目入门的小伙伴们来学习.在课程当中 ...
随机推荐
- KingbaseES中truncate和oracle中truncate区别
truncate命令在KingbaseES中本质上区别于oracle.因为oracle中,数据文件datafile可以被表所共享,每张表被分配各自的连续的extents.而在KingbaseES中,数 ...
- 初学STM32 CAN通信(一)
# 初学STM32 CAN通信(一) 1. CAN协议简介 CAN是控制器局域网络(Controller Area Network)的简称, 是国际上应用最广泛的现场总线之一 ,近年来,它具有的高 ...
- https://codeforces.com/gym/496962
A略. B最大最小即为答案. C略. DE记录 t 的每个字母 在 s 中出现的最左和最右,特判端点. FG先贪心后反悔 or 背包. *H:不会.AC自动机.
- 线上问题分析之java dump文件生成
一.查看java进程 jps or ps aux | grep java 二.生成dump文件 jmap -dump:live,format=b,file=xxxx.bin 进程ID 三.查看dump ...
- #Dinic,最大权闭合子图#CF1473F Strange Set
题目 分析 对于这种依赖关系,可以将正权值连源点,负权值连汇点, 然后 \(i\) 向 \(j(j<i)\) 连无穷大的边,注意到如果完全建图空间不够, 考虑记录每个约数最后一次出现的位置,直接 ...
- jenkins安装卸载和下载
环境 :docker容器 卸载 jenkins 1.rpm卸载rpm -e jenkins 2.检查是否卸载成功rpm -ql jenkins 3.彻底删除残留文件:find / -iname jen ...
- openGauss社区入门(openGauss-常用数据类型)
常用数据类型 数据类型 说明 布尔类型 boolean true/'1'/'yes' false/'0'/'no' 数值类型 smallint 两字节 int 4 字节 bigint 8 字节 dou ...
- 在 Visual Studio 2022 中创建一个类似于旧版本 Visual Studio 中的 Win32 Console Application 项目
在 Visual Studio 2022 中创建一个项目,其自动生成的源文件内容包含 #include "stdafx.h" 和使用_tmain 作为入口点,意味着你需要创建一个基 ...
- 重新整理 .net core 实践篇—————微服务的桥梁EventBus[三十一]
前言 简单介绍一下EventBus. 正文 EventBus 也就是集成事件,用于服务与服务之间的通信. 比如说我们的订单处理事件,当订单处理完毕后,我们如果通过api马上去调用后续接口. 比如说订单 ...
- 基于Material Design风格开源、易用、强大的WPF UI控件库
前言 今天大姚给大家分享一款基于Material Design风格开源.免费(MIT License).易于使用.强大的WPF UI控件库:MaterialDesignInXamlToolkit. 项 ...