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

1.go-zero官方文档

http://go-zero.dev/

2.go-zero微服务框架入门教程

作者:Mikael

https://www.bilibili.com/medialist/play/389552232?from=space&business=space_series&business_id=2122723

3.go-zero最佳实践

go-zero-looklook

项目地址:

https://github.com/Mikaelemmmm/go-zero-looklook

4.学习资料

  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环境和Gopath的配置

linux配置

  1. export GOROOT="/home/haima/local/go" #go的源码包
  2. export GOPATH=/media/haima/34E401CC64DD0E282/site/go #工作地址路径
  3. export PATH=$PATH:$GOROOT/bin:$GOPATH/bin

更多详细参考以下连接:

https://www.cnblogs.com/haima/p/12057933.html

1.需要安装以下环境和依赖

2.goctl安装

Go 1.16 及以后版本

  1. GOPROXY=https://goproxy.cn/,direct go install github.com/zeromicro/go-zero/tools/goctl@latest
  2. 查看版本
  3. haima@haima-PC:~/Desktop$ goctl -v
  4. goctl version 1.3.5 linux/amd64

3.其它依赖安装

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

  1. haima@haima-PC:/media/haima/34E401CC64DD0E282/site/go/src/haimait/learn/go-zero/zero-demo$ goctl -v
  2. goctl version 1.3.3 linux/amd64
  3. haima@haima-PC:/media/haima/34E401CC64DD0E282/site/go/src/haimait/learn/go-zero/zero-demo$ goctl env check -i -f
  4. [goctl-env]: preparing to check env
  5. [goctl-env]: looking up "protoc"
  6. [goctl-env]: "protoc" is installed
  7. [goctl-env]: looking up "protoc-gen-go"
  8. [goctl-env]: "protoc-gen-go" is installed
  9. [goctl-env]: looking up "protoc-gen-go-grpc"
  10. [goctl-env]: "protoc-gen-go-grpc" is installed
  11. [goctl-env]: congratulations! your goctl environment is ready!

查看已经安装的环境

  1. haima@haima-PC:~/Desktop$ protoc --version
  2. libprotoc 3.19.4
  3. haima@haima-PC:~/Desktop$ protoc-gen-go --version
  4. protoc-gen-go v1.28.0
  5. haima@haima-PC:~/Desktop$ protoc-gen-go-grpc --version
  6. 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.开发准备工作

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

  2. 安装protobuf插件

  3. 配置命令别名

vim ~/.bashrc

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

source ~/.bashrc

3.编写API代码

  1. 新建.api文件
  • 手动创建

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

  • 命令行自动创建

    mkdir zero-demo && cd zero-demo/

    goctl api new user

  1. syntax = "v1"
  2. info(
  3. author: "user-api"
  4. date: "2022-03-26"
  5. desc: "api语法示例及语法说明"
  6. )
  7. type UserInfoRequest {
  8. UserId int64 `json:"userId"`
  9. }
  10. type UserInfoResponse {
  11. UserId int64 `json:"userId"`
  12. Nickname string `json:"nickname"`
  13. }
  14. service user-api{
  15. @doc "获取用户信息"
  16. @handler userInfo
  17. post /user/info (UserInfoRequest) returns (UserInfoResponse)
  18. }
  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. 目标结构:
  1. zero-demo/user-api/api$ cd ..
  2. zero-demo/user-api$ cd ..
  3. zero-demo$ tree
  4. .
  5. ├── go.mod
  6. └── user-api
  7. ├── api
  8. └── user.api
  9. ├── etc
  10. └── user-api.yaml
  11. ├── internal
  12. ├── config
  13. └── config.go
  14. ├── handler
  15. ├── routes.go
  16. └── userInfoHandler.go
  17. ├── logic
  18. └── userInfoLogic.go
  19. ├── svc
  20. └── serviceContext.go
  21. └── types
  22. └── types.go
  23. └── 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

4.编写RPC代码

  1. 新建user.proto

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

写入以下内容

  1. syntax = "proto3";
  2. option go_package = "./pb";
  3. package pb;
  4. //model
  5. message GetUserInfoReq {
  6. int64 id = 1;
  7. }
  8. message GetUserInfoResp {
  9. int64 id = 1;
  10. string nickname = 2;
  11. }
  12. //service
  13. service usercenter {
  14. rpc GetUserInfo(GetUserInfoReq) returns(GetUserInfoResp);
  15. }
  1. 生成代码

进入目录:

cd zero-demo/user-rpc/pb

执行命令:

windows下*号改成具体的文件名,如user.proto

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

或者用别名:

  1. zero-demo/user-rpc/pb$ rpcgen

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

  1. 查看生成目录
  1. haima@haima-PC:/media/haima/34E401CC64DD0E282/site/go/src/haimait/learn/go-zero/zero-demo$ tree
  2. .
  3. ├── go.mod
  4. ├── go.sum
  5. └── user-rpc
  6. ├── etc
  7. └── user.yaml
  8. ├── internal
  9. ├── config
  10. └── config.go
  11. ├── logic
  12. └── getUserInfoLogic.go
  13. ├── server
  14. └── usercenterServer.go
  15. └── svc
  16. └── serviceContext.go
  17. ├── pb
  18. ├── user_grpc.pb.go
  19. ├── user.pb.go
  20. └── user.proto
  21. ├── usercenter
  22. └── usercenter.go
  23. └── user.go
  1. 下载依赖
  1. zero-demo$ go mod tidy

5.编写Model代码

  1. 编写脚本文件genModel.sh

go-zero/zero-demo/genModel.sh

  1. #!/usr/bin/env bash
  2. # 使用方法: 第一个参数为数据库名 第二个参数为表名
  3. # ./genModel.sh mall user
  4. # ./genModel.sh usercenter user_auth
  5. # 再将./genModel下的文件剪切到对应服务的model目录里面,记得改package
  6. #生成的表名
  7. tables=$2
  8. #表生成的genmodel目录
  9. modeldir=./genModel
  10. # 数据库配置
  11. host=127.0.0.1
  12. port=3306
  13. #dbname=looklook_$1
  14. dbname=$1
  15. username=root
  16. passwd=123456
  17. echo "开始创建库:$dbname 的表:$2"
  18. # -cache=true 带缓存
  19. #goctl model mysql datasource -url="${username}:${passwd}@tcp(${host}:${port})/${dbname}" -table="${tables}" -dir="${modeldir}" -cache=true --style=goZero
  20. # 不带缓存
  21. goctl model mysql datasource -url="${username}:${passwd}@tcp(${host}:${port})/${dbname}" -table="${tables}" -dir="${modeldir}" --style=goZero
  1. 生成代码

./genModel.sh

会生成目录

./genModel

  1. 查看生成代码
  1. haima@haima-PC:/media/haima/34E401CC64DD0E282/site/go/src/haimait/learn/go-zero/zero-demo$ tree
  2. .
  3. ├── genModel/
  4. ├── userModel_gen.go
  5. ├── userModel.go
  6. └── vars.go

重复执行生成代码时,文件 userModel.go 和 vars.go 不会修改,自定义的代码可以写在这两个文件个文件中

如何生成带缓存的model,会根据主键和唯一索引作为key生成生成缓存。

如下面粟子:

goZeroDemoUserIdKey 和 goZeroDemoUserMobileKey即为缓存的key

  1. func (m *defaultUserModel) Insert(ctx context.Context, data *User) (sql.Result, error) {
  2. goZeroDemoUserIdKey := fmt.Sprintf("%s%v", cacheGoZeroDemoUserIdPrefix, data.Id)
  3. goZeroDemoUserMobileKey := fmt.Sprintf("%s%v", cacheGoZeroDemoUserMobilePrefix, data.Mobile)
  4. ret, err := m.ExecCtx(ctx, func(ctx context.Context, conn sqlx.SqlConn) (result sql.Result, err error) {
  5. query := fmt.Sprintf("insert into %s (%s) values (?, ?, ?, ?, ?, ?, ?, ?, ?)", m.table, userRowsExpectAutoSet)
  6. return conn.ExecCtx(ctx, query, data.Id, data.Name, data.Age, data.Gender, data.Mobile, data.Password, data.CreatedAt, data.UpdatedAt, data.DeletedAt)
  7. }, goZeroDemoUserIdKey, goZeroDemoUserMobileKey)
  8. return ret, err
  9. }
  1. 下载依赖
  1. 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

语法:

  1. // service block
  2. @server(
  3. group: user
  4. prefix: api/v1
  5. )

例子:

  1. syntax = "v1"
  2. info(
  3. author: "user-api"
  4. date: "2022-03-26"
  5. desc: "api语法示例及语法说明"
  6. )
  7. type UserInfoRequest {
  8. UserId int64 `json:"userId"`
  9. }
  10. type UserInfoResponse {
  11. UserId int64 `json:"userId"`
  12. Nickname string `json:"nickname"`
  13. }
  14. type UserUpdateRequest {
  15. UserId int64 `json:"userId"`
  16. Nickname string `json:"nickname"`
  17. }
  18. type UserUpdateResponse {
  19. Flag bool `json:"flag"`
  20. }
  21. // 看这里 声名 路由组(group)和路由前缀(prefix)
  22. // service block
  23. @server(
  24. group: user
  25. prefix: api/v1
  26. )
  27. service user-api{
  28. @doc "获取用户信息"
  29. @handler userInfo
  30. post /user/info (UserInfoRequest) returns (UserInfoResponse)
  31. @doc "修改用户信息"
  32. @handler upDateUser
  33. post /user/update (UserUpdateRequest) returns (UserUpdateResponse)
  34. }

执行生成命令:

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

生成的路由:

  1. // Code generated by goctl. DO NOT EDIT.
  2. package handler
  3. import (
  4. "net/http"
  5. user "go-zero-demo/user-api/internal/handler/user"
  6. "go-zero-demo/user-api/internal/svc"
  7. "github.com/zeromicro/go-zero/rest"
  8. )
  9. func RegisterHandlers(server *rest.Server, serverCtx *svc.ServiceContext) {
  10. server.AddRoutes(
  11. []rest.Route{
  12. {
  13. Method: http.MethodPost,
  14. Path: "/user/info",
  15. Handler: user.UserInfoHandler(serverCtx),
  16. },
  17. {
  18. Method: http.MethodPost,
  19. Path: "/user/update",
  20. Handler: user.UpDateUserHandler(serverCtx),
  21. },
  22. },
  23. rest.WithPrefix("/api/v1"), #生成的路由前缀
  24. )
  25. }

生成文件

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

  1. ├── user-api
  2. ├── api
  3. └── user.api
  4. ├── Dockerfile
  5. ├── etc
  6. └── user-api.yaml
  7. ├── internal
  8. ├── config
  9. └── config.go
  10. ├── handler
  11. ├── user
  12. ├── upDateUserHandler.go
  13. └── userInfoHandler.go
  14. ├── routes.go
  15. ├── logic
  16. ├── user
  17. ├── upDateUserLogic.go
  18. └── └── userInfoLogic.go
  19. ├── svc
  20. └── serviceContext.go
  21. └── types
  22. └── types.go
  23. ├── user-api.yml
  24. └── user.go

访问路由:

  1. /api/v1/user/info
  2. /api/v1/user/update

03. go-zero简介及如何学go-zero的更多相关文章

  1. knockoutJS学习笔记03:knockout简介

    通常来说,前端的维护难度是比较大的,特别是脚本,虽然像jquery这样的库可以帮助我们减少很多代码,但在稍微复杂的情况下,还是会产生有很多代码.上一篇介绍了模板引擎jsRender,它可以帮我们快速生 ...

  2. 【03】AngularJS 简介

    AngularJS 简介 AngularJS 是一个 JavaScript 框架.它可通过 <script> 标签添加到 HTML 页面. AngularJS 通过 指令 扩展了 HTML ...

  3. Java集合类简单总结(重学)

    java集合类简介(重学) 一.Collection(集合).Map接口两者应该是平行关系吧. 1.Map介绍 Map是以键值(key-value)对来存放的,2个值.通过key来找到value(例: ...

  4. Android查缺补漏(IPC篇)-- 进程间通讯之Socket简介及示例

    本文作者:CodingBlock 文章链接:http://www.cnblogs.com/codingblock/p/8425736.html 进程间通讯篇系列文章目录: Android查缺补漏(IP ...

  5. 一、MySQL数据库之简介和安装

    一.基础部分 1.数据库是简介     之前所学,数据要永久保存,比如用户注册的用户信息,都是保存于文件中,而文件只能存在于某一台机器上. 如果我们不考虑从文件中读取数据的效率问题,并且假设我们的程序 ...

  6. 零基础学Python_汇总贴

    https://time.geekbang.org/course/intro/98 零基础学Python-第一章 :Python介绍和安装-01.Python语言的特点 零基础学Python-第一章 ...

  7. 【讲座】朱正江——基于LC-MS的非靶向代谢组学

    本次课程主题为<基于LC-MS的非靶向代谢组学>,主要分为代谢组学简介.代谢组学技术简介.非靶向代谢组学方法和数据采集.非靶向代谢组学数据分析和代谢物结构鉴定几个方面. 一.代谢组简介 基 ...

  8. JAVA EE企业级开发四步走完全攻略 [转]

    http://bbs.51cto.com/thread-550558-1.html 本文是J2EE企业级开发四步走完全攻略索引,因内容比较广泛,涉及整个JAVA EE开发相关知识,这是一个长期的计划, ...

  9. 《深入理解JAVA虚拟机》笔记1

    java程序运行时的内存空间,按照虚拟机规范有下面几项: )程序计数器 指示下条命令执行地址.当然是线程私有,不然线程怎么能并行的起来. 不重要,占内存很小,忽略不计. )方法区 这个名字很让我迷惑. ...

  10. 基于go语言结合微信小程序开发的微商城系统

    最近在慕课网上录制了一门<Golang微信小程序微商城系统原型>,这门免费课程特别适合在校大学生或者刚毕业的大学生,go语言初学者以及想要从事微商城开发项目入门的小伙伴们来学习.在课程当中 ...

随机推荐

  1. Chrome浏览器安装离线插件Markdown Here

    前言 近期刚开通了微信公众号,想在上面发表一些自己的文章,由于排版问题很浪费时间,公众号后台本身不支持Markdown语法,所以就需要利用Markdown Here插件使得公众号后台支持Markdow ...

  2. 程序员/后端开发方向Java 跳槽注意事项(简历和面试经验分享)

    程序员/后端开发方向Java 跳槽注意事项(简历和面试经验分享) 应届生面试经验参考:https://www.cnblogs.com/rainbow-1/p/16779048.html 简历: 1.个 ...

  3. MySQL数据过滤和搜索

    操作符 AND操作符 mysql> SELECT prod_id,prod_price,prod_name FROM products WHERE vend_id=1003 AND prod_p ...

  4. #树上带修莫队,树链剖分#洛谷 4074 [WC2013]糖果公园

    题目 分析 考虑将树转换成序列求解,那就用欧拉序,入栈一次出栈一次正好抵消掉 注意当起点不是LCA的时候要将起点加入,剩下就是带修莫队板子题了 代码 #include <cstdio> # ...

  5. 30分钟成为Contributor|共建测试子系统,赋能提升项目代码质量

    如何优雅地参与开源贡献,向顶级开源项目提交 PR(Pull Request),跟着大咖30分钟成为OpenAtom OpenHarmony(以下简称"OpenHarmony") C ...

  6. RabbitMQ 09 主题模式

    主题模式 主题模式结构图: 主题模式实际上就是一种模糊匹配的模式,可以将routingKey以模糊匹配的方式去进行转发. 可以使用*或#来表示: *:任意的一个单词. #:0个或多个单词. 定义配置类 ...

  7. Linux Ubuntu配置国内源

    配置国内源 因为众所周知的原因,国外的很多网站在国内是访问不了或者访问极慢的,这其中就包括了Ubuntu的官方源. 所以,想要流畅的使用apt安装应用,就需要配置国内源的镜像. 市面上Ubuntu的国 ...

  8. leetcode-数组中两元素的最大乘积

    题目描述 给你一个整数数组 nums,请你选择数组的两个不同下标 i 和 j,使 (nums[i]-1)*(nums[j]-1) 取得最大值. 请你计算并返回该式的最大值. 示例 1: 输入:nums ...

  9. Windows XP Vmware 无法自适应窗口

    之前在吾爱破解上找到一个 WindowsXP SP3 的精简系统(目前找不到在哪了),自带 VMtools 和 52 破解工具包,很适合 XP 系统下的逆向和病毒分析.目前准备学习一下<恶意代码 ...

  10. python3 引入requests报错ImportError的处理方案

    执行python3 import requests时抛出错误:ImportError: No module named requests 使用python3写爬虫时,有些小伙伴会遇到这种坑,使用发现导 ...