写点什么

Go-Zero 微服务快速入门和最佳实践(一)

作者:王中阳Go
  • 2024-04-28
    北京
  • 本文字数:2610 字

    阅读完需:约 9 分钟

Go-Zero微服务快速入门和最佳实践(一)

前言

并发编程和分布式微服务是我们 Gopher 升职加薪的关键。


毕竟 Go 基础很容易搞定,不管你是否有编程经验,都可以比较快速的入门 Go 语言进行简单项目的开发。


虽说好上手,但是想和别人拉开差距,提高自己的竞争力,搞懂分布式微服务和并发编程还是灰常重要的,这也是我今年更新文章的重点。

更文计划

我会更新一系列文章,陪你一起打怪升级,升职加薪!


本文的重点是:gozero 快速入门,带你了解使用 gozero 开发项目的整体流程,以及一些技巧。


下一篇的重点是:带你使用 gozero 从头到尾实现一个经典功能的开发。


后续文章还会陆续更新我们在商业项目开发中积累的项目经验,比如:如何自定义 goctl 提高效率;并发编程实战;devops 入门和实战等等......

Go-Zero

我想和大家说一下安利 gozero 的原因:


Go-zero 在 GitHub 中已经有 27.2K 的 star,集成了各种工程实践的 web 和 rpc 框架。通过弹性设计保障了大并发服务端的稳定性,经受了充分的实战检验。

官网

Go-Zero官方地址


一个神奇的事情,如果你直接在百度搜索 gozero,前几页的检索结果竟然都没有 gozero 官网,而是各个技术社区作者的分享。


我建议你先认真学习 Go-Zero 官网资料,扫清知识盲点,然后再跟着我去实践。

技巧 & 整体开发流程

为了吸引你继续读下去,我先分享技巧吧:“总结一句话:用好 goctl 开发就是快!

先说技巧

goctl

  1. 能使用 goctl 的一定要用 goctl , goctl 是 go-zero 的内置脚手架,是提升开发效率的一大利器,可以一键生成代码、文档、部署 k8s yaml、dockerfile 等。

  2. gozero 和 go 一样也强调**“少即是多”**的思想,能用 goctl 生成的千万不要手写,不仅开发速度慢;在团队开发中也难以保证统一的开发规范。

  3. 更重要的 goctl 支持我们自定义,后面我也会单独整理文章出来,和你分享如何结合你的项目,定制适合自己的 goctl,进一步提高效率。那具体 goctl 能生成什么呢?


  • api

  • grpc

  • MySQL

  • MongoDB

  • 格式化

  • 接口文档

  • 还支持自定义

  • 甚至还支持生成 php、Android 等代码

目录结构

先带你了解一下整体项目目录,这样你能更好的理解下文中的开发流程,这也是新手最头疼的地方,不知道从哪里着手开发。



  • app 所有的微服务目录

  • user

  • cmd

  • api api 接口层 对外提供服务,可以用 goctl 生成

  • desc

  • xxx.api

  • etc

  • internal

  • main.go

  • rpc rpc 层 内部服务 可以用 goctl 生成

  • etc

  • internal

  • pb

  • 服务包名 由 goctl 生成

  • main.go

  • model model 层 方便 cmd 目录中 api 和 rpc 调用

  • mqueue 等不同的服务

  • common 服务共享的常量、工具类等统一封装到这里

  • deploy 项目部署配置等 比如 Nginx 配置

  • go.mod


欢迎关注我,下期内容会共享 GitHub 开源地址出来。

Go-Zero 微服务项目开发流程

当你把 go 和 gozero 的开发环境安装好之后,建议按照下面的顺序进行开发:


  1. 首先设计数据库和数据表

  2. 使用工具先生成 model

  3. 先开发 api 层

  4. 再开发 rpc 层

  5. 在 api 层注册 rpc 服务,调用 rpc 方法,对外提供接口

  6. 生成接口文档


以上是整体的开发流程,请你按照这个顺序开发,会非常清晰。

详解

1)首先设计数据库和数据表

  1. 微服务进行服务拆分一个最好理解并且最基本的原则就是**:每个服务对应一个单独的数据库。做到服务与服务之间的解耦,划清边界。**

  2. 这就要求我们明确项目(服务)需求之后,做好表结构设计。3.** 我们后续项目中用到的 model、proto、甚至 api 层的结构体都可以通过工具根据数据库生成,所以数据库的设计至关重要!**

2)使用工具先生成 model

使用 goctl 中的 model 命令生成即可:官网有讲,不再赘述:mysql 代码生成


为了进一步提高效率,我们对此进行了封装,方便我们更快更好的生成 model,你也可以按照我们的方式来:


  1. 在项目根目录下创建了 script 目录,专门用于封装各种常用的脚本

  2. 在 script 目录下,我们创建了 genModel 目录,用于生成 model 文件。

  3. 封装 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 层

  1. 先定义 xxx.api 文件,可以参考 api demo 代码生成

  2. 使用 goctl 生成代码:goctl api go -api main.api -dir ../ --style=goZero

  3. 配置生成代码中的 config 目录以及 yaml 文件,弄清它们两者之间的联系

  4. 配置生成代码 svc 目录中的文件(比如 jwt 之类的中间件)

4)再开发 rpc 层

  1. 再告诉你一个提效利器 sql2pb,这个工具适合我们开发新服务时使用。见名之意,也就是可以把 sql 转成 pb 文件

  2. 注意:一旦我们的 xx.proto 文件有自定义修改之后,就不建议使用 sql2pb 了。如果不使用 sql2pb 的话,就直接修改 xxx.proto 文件

  3. 使用 goctl 生成 pb.go 文件:goctl rpc protoc lottery.proto --go_out=../ --go-grpc_out=../ --zrpc_out=../ --style=goZero

  4. 配置 svc,注册 model

  5. 编写 logic,调用 model,写业务代码

5)在 api 层注册 rpc 服务,调用 rpc 方法

  1. api 层配置 svc,注册 rpc 客户端

  2. 调用 rpc 方法

  3. 返回 restful api

6)生成接口文档

  1. 注意:虽然 goctl 不直接支持生成 swagger,但是 goctl 的插件支持。- goctl-swagger 通过 api 文件生成 swagger 文档

  2. 安装好 goctl-swagger 插件之后,我们就可以在 api 层的 xxx.api 同级目录下生成 swagger 了

  3. 参考命令如下:其中main.api是我在 api 层的 desc 目录中定义的,我们也在同级目录执行 goctl 命令即可:

  4. goctl api plugin -plugin goctl-swagger="swagger -filename main.json" -api main.api -dir .



  1. 执行之后,就会出现如下图所示的 main.json,这就是 swagger 文件



  1. 你可以直接使用 swagger 进行测试,也可以导入到其他工具中,比如我习惯导入到 Apifox 中,可以自动生成参数,方便我们进行测试:



总结

这篇文章带你梳理了使用 gozero 开发微服务项目的步骤和技巧,请你按我建议的方式开发和 debug,会很清晰。下一篇文章将通过一个完整的功能,带你跑通一个微服务的开发,包括:需求分析+表结构设计+api+rpc+goctl+apifox 调试+细节处理。


如果你对 Go 语言或者微服务感兴趣,欢迎关注我的 infoQ 账号,也欢迎直接私信我。

发布于: 14 分钟前阅读数: 4
用户头像

王中阳Go

关注

靠敲代码在北京买房的程序员 2022-10-09 加入

【微信】wangzhongyang1993【公众号】程序员升职加薪之旅【成就】InfoQ专家博主👍掘金签约作者👍B站&掘金&CSDN&思否等全平台账号:王中阳Go

评论 (1 条评论)

发布
用户头像
并发编程和分布式微服务是我们 Gopher 升职加薪的关键。
14 分钟前 · 北京
回复
没有更多了
Go-Zero微服务快速入门和最佳实践(一)_Go_王中阳Go_InfoQ写作社区