初识 Go-zero | 青训营笔记

501 阅读4分钟

文章第一句话为“这是我参与「第五届青训营 」伴学笔记创作活动的第 5 天

前言

项目选型中参考了 Go-zero,因此做一个记录

一、简介:

Go-zero

Go-zero 是一个 Go 语言开发的 Web 和微服务框架,旨在提高开发者的生产力并加速应用程序的性能。它提供了一系列功能,包括路由和中间件处理、RPC 框架、API 文档生成、分布式事务、缓存、日志等,同时还支持代码生成工具,帮助开发者快速生成模板代码。

应用场景

  1. 微服务
  2. Web 开发
  3. API 开发
  4. 高性能服务开发
  5. 分布式事务

二、涉及技术&知识点:

本文内容

  • Go-zero 开发环境的搭建
  • 输出 Hello World

为什么使用 Go-zero

抖音作为短视频社交应用,用户数量巨大、数据量庞大,同时需要保证视频的高清、流畅播放,因此对后端服务的性能和可扩展性要求非常高。同时,抖音的后端服务需要支持大量的实时消息推送、用户关系管理、数据分析等功能。

Go-zero 内置了很多高性能的组件,例如连接池、缓存、异步 IO 等,能够提高抖音的服务性能。Go-zero 提供了完整的微服务框架,并且支持分布式事务,可以解决分布式事务的问题。Go-zero 的代码生成工具能够快速生成模板代码,减少了开发者的工作量,同时文档和社区支持也非常完善,开发时能在社区找到相关的案例。

三、实践过程:

开发工具

  • Visual Studio Code
  • Goland(推荐)

这里链接我以前的文章,感兴趣的可以去看看:梦的开始:走进Go语言基础语言(万字总结) | 青训营笔记

安装Golang

相关链接:

Golang官网go.dev/
Go语言中文网:studygolang.com/dl
七牛云:goproxy.cn/

打开golang官网,下载golang的二进制文件进行安装即可

image.png 如果无法打开官网,也可以使用Go语言中文网提供的镜像下载安装

image.png 安装完成后,如果遇到第三方包无法安装,可以尝试使用七牛云提供的镜像

image.png 对于开发环境的搭建,可以参考:

练习 - 安装 Go - Training | Microsoft Learn

练习 - 安装 Visual Studio Code 和 Go 扩展 - Training | Microsoft Learn

Tips上文开发环境的搭建使用的软件是Visual Studio Code,如果不想使用,或者嫌装插件太麻烦,可以使用JetBrains公司开发的IDE(集成开发环境):GoLand,可省去不少步骤

image.png

GoLand是一个商业付费软件,你可以免费试用30天再决定是否购买。同时,如果你是在校学生,或者你维护着一个开源仓库,你可以向JetBrains公司申请免费试用,这里不再赘述。 相关链接:

学生免费申请:www.jetbrains.com/zh-cn/commu…
开源仓库:www.jetbrains.com/zh-cn/commu…

开发环境搭建

Goctl安装

# Go 1.15 及之前版本
GO111MODULE=on GOPROXY=https://goproxy.cn/,direct go get -u github.com/zeromicro/go-zero/tools/goctl@latest

# Go 1.16 及以后版本
GOPROXY=https://goproxy.cn/,direct go install github.com/zeromicro/go-zero/tools/goctl@latest

验证安装:

$ goctl -v

image.png

protoc & protoc-gen-go安装

方式一:goctl一键安装(推荐)

$ goctl env check -i -f --verbose

结果验证:(命令行刷出如下结果即为成功)

[goctl-env]: congratulations! your goctl environment is ready!

方式二:源代码安装

  • protoc安装
  • protoc-gen-go/protoc-gen-go-grpc 安装
$ go install google.golang.org/protobuf/cmd/protoc-gen-go@latest
$ go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@latest

单体服务

创建greet服务

$ mkdir go-zero-demo // 创建目录 go-zero-demo
$ cd go-zero-demo // 进入目录 go-zero-demo
$ go mod init go-zero-demo // 初始化
$ goctl api new greet // 创建greet服务
$ go mod tidy

编写逻辑

$ vim greet/internal/logic/greetlogic.go 
func (l *GreetLogic) Greet(req *types.Request) (resp *types.Response, err error) {
   // todo: add your logic here and delete this line

   return &types.Response{
      Message: "Hello World!",
   }, nil
}

启动服务

go run ./greet/greet.go -f ./greet/etc/greet-api.yaml

结果验证:(命令行刷出如下结果即为成功)

Starting server at 0.0.0.0:8888...

image.png

也可以用Apifox等工具验证:

image.png

代码分析

路由:在项目目录下greet/internal/handler/routes.go内:

func RegisterHandlers(server *rest.Server, serverCtx *svc.ServiceContext) {
   server.AddRoutes(
      []rest.Route{
         {
            Method:  http.MethodGet,
            Path:    "/from/:name",
            Handler: GreetHandler(serverCtx),
         },
      },
   )
}

参数:在项目目录下greet/internal/types/types.go内:

// Code generated by goctl. DO NOT EDIT.
package types

type Request struct {
   Name string `path:"name,options=you|me"`
}

type Response struct {
   Message string `json:"message"`
}

四、总结思考:

protoc-gen-go安装失败,参考:常见错误处理 | go-zero

五、 引用参考: