Go-Zero微服务快速入门和最佳实践(一)
并发编程和分布式微服务是我们Gopher升职加薪的关键。
毕竟Go基础很容易搞定,不管你是否有编程经验,都可以比较快速的入门Go语言进行简单项目的开发。
虽说好上手,但是想和别人拉开差距,提高自己的竞争力,搞懂分布式微服务和并发编程还是灰常重要的,这也是我今年签约文章的重点。
更文计划
我会更新一系列文章,陪你一起打怪升级,升职加薪!
本文的重点是:gozero快速入门,带你了解使用gozero开发项目的整体流程,以及一些技巧。
下一篇的重点是:带你使用gozero从头到尾实现一个经典功能的开发。
后续文章还会陆续更新我们在商业项目开发中积累的项目经验,比如:如何自定义goctl提高效率;并发编程实战;devops入门和实战等等......
Go-Zero
我想和大家说一下安利gozero的原因:
Go-zero [1]在GitHub中已经有27.2K的star,集成了各种工程实践的 web 和 rpc 框架。通过弹性设计保障了大并发服务端的稳定性,经受了充分的实战检验。
官网
Go-Zero官方地址[2]
一个神奇的事情,如果你直接在百度搜索gozero,前几页的检索结果竟然都没有gozero官网,而是各个技术社区作者的分享。
我建议你先认真学习Go-Zero官网资料,扫清知识盲点,然后再跟着我去实践。
技巧 & 整体开发流程
为了吸引你继续读下去,我先分享技巧吧:“总结一句话:用好goctl开发就是快!”
先说技巧
goctl
能使用 goctl[3] 的一定要用 goctl , goctl 是 go-zero 的内置脚手架,是提升开发效率的一大利器,可以一键生成代码、文档、部署 k8s yaml、dockerfile 等。 gozero和go一样也强调“少即是多”的思想,能用goctl生成的千万不要手写,不仅开发速度慢;在团队开发中也难以保证统一的开发规范。 更重要的 goctl 支持我们自定义,后面我也会单独整理文章出来,和你分享如何结合你的项目,定制适合自己的goctl,进一步提高效率。那具体goctl能生成什么呢?
api grpc MySQL MongoDB 格式化 接口文档 还支持自定义 甚至还支持生成php、Android等代码
目录结构
先带你了解一下整体项目目录,这样你能更好的理解下文中的开发流程,这也是新手最头疼的地方,不知道从哪里着手开发。
app 所有的微服务目录 cmd model model层 方便cmd目录中api和rpc调用 etc internal pb 服务包名 由goctl生成 main.go desc etc internal main.go xxx.api api api接口层 对外提供服务,可以用goctl生成 rpc rpc层 内部服务 可以用goctl生成 user mqueue 等不同的服务 common 服务共享的常量、工具类等统一封装到这里 deploy 项目部署配置等 比如Nginx配置 go.mod
欢迎关注我,下期内容会共享GitHub开源地址出来。
Go-Zero微服务项目开发流程
当你把go和gozero的开发环境安装好之后,建议按照下面的顺序进行开发:
首先设计数据库和数据表 使用工具先生成model 先开发api层 再开发rpc层 在api层注册rpc服务,调用rpc方法,对外提供接口 生成接口文档
以上是整体的开发流程,请你按照这个顺序开发,会非常清晰。
详解
1)首先设计数据库和数据表
微服务进行服务拆分一个最好理解并且最基本的原则就是:每个服务对应一个单独的数据库。做到服务与服务之间的解耦,划清边界。 这就要求我们明确项目(服务)需求之后,做好表结构设计。3.** 我们后续项目中用到的model、proto、甚至api层的结构体都可以通过工具根据数据库生成,所以数据库的设计至关重要!**
2)使用工具先生成model
使用goctl中的model命令生成即可:官网有讲,不再赘述:mysql 代码生成[4]
为了进一步提高效率,我们对此进行了封装,方便我们更快更好的生成model,你也可以按照我们的方式来:
在项目根目录下创建了script目录,专门用于封装各种常用的脚本 在script目录下,我们创建了genModel目录,用于生成model文件。 封装genModel.sh脚本,内容如下:
#!/usr/bin/env bash
# 使用方法:
# ./genModel.sh 数据库名 表名称
# 比如:
# ./genModel.sh lottery lottery
# 再将./genModel下的生成的文件剪切到对应服务的model目录中即可
#生成的表名
tables=$2
#表生成的genmodel目录
modeldir=./genModel
# 数据库配置
host=127.0.0.1
port=3306
dbname=$1
username=root
passwd=xxxxx
echo "开始创建库:$dbname 的表:$2"
goctl model mysql datasource -url="${username}:${passwd}@tcp(${host}:${port})/${dbname}" -table="${tables}" -dir="${modeldir}" -cache=true --home="${template}" --style=goZero
这样,我们就可以很方便的使用./genModel.sh生成model,而不是需要拼接冗长的goctl命令
这个思路也同样适用你使用goctl生成其他的代码。
3)先开发api层
先定义xxx.api文件,可以参考 api demo 代码生成[5] 使用goctl生成代码: goctl api go -api main.api -dir ../ --style=goZero
配置生成代码中的config目录以及yaml文件,弄清它们两者之间的联系 配置生成代码svc目录中的文件(比如jwt之类的中间件)
4)再开发rpc层
再告诉你一个提效利器 sql2pb[6],这个工具适合我们开发新服务时使用。见名之意,也就是可以把sql转成pb文件 注意:一旦我们的xx.proto文件有自定义修改之后,就不建议使用sql2pb了。如果不使用sql2pb的话,就直接修改xxx.proto文件 使用goctl生成pb.go文件: goctl rpc protoc lottery.proto --go_out=../ --go-grpc_out=../ --zrpc_out=../ --style=goZero
配置svc,注册model 编写logic,调用model,写业务代码
5)在api层注册rpc服务,调用rpc方法
api层配置svc,注册rpc客户端 调用rpc方法 返回restful api
6)生成接口文档
注意:虽然goctl不直接支持生成swagger,但是goctl的插件支持。- goctl-swagger[7] 通过 api 文件生成 swagger 文档 安装好goctl-swagger插件之后,我们就可以在api层的xxx.api同级目录下生成swagger了 参考命令如下:其中 main.api
是我在api层的desc目录中定义的,我们也在同级目录执行goctl命令即可:goctl api plugin -plugin goctl-swagger="swagger -filename main.json" -api main.api -dir .
执行之后,就会出现如下图所示的main.json,这就是swagger文件
你可以直接使用swagger进行测试,也可以导入到其他工具中,比如我习惯导入到Apifox中,可以自动生成参数,方便我们进行测试:
总结
这篇文章带你梳理了使用gozero开发微服务项目的步骤和技巧,请你按我建议的方式开发和debug,会很清晰。下一篇文章将通过一个完整的功能,带你跑通一个微服务的开发,包括:需求分析+表结构设计+api+rpc+goctl+apifox调试+细节处理。
如果你对Go语言或者微服务感兴趣,欢迎关注我的公众号,也欢迎直接私信我。
相关文章[1]Go-zero : https://github.com/zeromicro/go-zero
[2]Go-Zero官方地址: https://go-zero.dev/
[3]goctl: https://go-zero.dev/docs/tasks/installation/goctl
[4]官网有讲,不再赘述:mysql 代码生成: https://go-zero.dev/docs/tasks/cli/mysql
[5]api demo 代码生成: https://go-zero.dev/docs/tasks/cli/api-demo
[6]sql2pb: https://github.com/Mikaelemmmm/sql2pb
[7]goctl-swagger: https://github.com/zeromicro/goctl-swagger
早日上岸!
我们搞了一个免费的面试真题共享群,互通有无,一起刷题进步。
没准能让你能刷到自己意向公司的最新面试题呢。
感兴趣的朋友们可以加我微信:wangzhongyang1993,备注:面试群。
点击下方文章,看看他们是怎么找到好工作的!
还有最新鲜的腾讯面经,不容错过!