快速入门

点击直达-视频教程地址open in new window

1. 介绍

go-zero 是一个集成了各种工程实践的 web 和 RPC框架。通过弹性设计保障了大并发服务端的稳定性,经受了充分的实战检验。

1.1 web框架

快速高效开发web应用的工具或软件:

  • web应用有动态网站网络应用网络服务等,比如抖音,B站,淘宝,在线银行,医疗系统,政务服务,微信,各种网站等等
  • 支持HTTP协议
  • 支持Websocket协议

1.2 RPC

RPC(Remote Procedure Call Protocol)远程过程调用协议。一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。

img

RPC是两个进程间的通信,可以跨设备,RPC框架需要保证在调用远端服务或资源时,就像调用本地应用程序一样方便

1.3 微服务

image-20240912222051264

微服务是由多个功能模块(小服务)组成,共同完成一件事(组成可用的一整个系统),各个服务之间使用RPC进行通信。

  • 好处就在于各个服务是独立的个体,其代表了一种编程思维方式,服务需要具备独立性,扩展性,容错性,高可用性等,适用于高并发等大型系统
  • 坏处就是复杂性大大提高,管理维护变得困难

要构建一个微服务系统,需要如下手段:

  • 服务治理
    • 服务注册发现
  • 服务调用
    • RPC
    • REST
  • 服务网关
  • 服务容错
    • 限流
    • 熔断
    • 降级
  • 链路追踪
  • 负载均衡
  • 监控报警
  • 分布式配置中心
  • 分布式事务
  • 分布式任务调度
  • 分布式文件存储
  • 消息队列
  • Docker
  • 云原生

2. 安装

要想使用go-zero框架,需要安装以下环境:

  • golang:这里我们安装最新版go1.23版本
  • goctl:goctl是go-zero框架的内置脚手架,可以一键生成代码、文档、部署 k8s yaml、dockerfile 等。
  • protoc
    • protobuf是一种数据序列化和反序列化标准,谷歌出品,和jsonxml类似,性能非常高。
    • protoc命令是protobuf的编译器,将.proto后缀的文件编译成对应的开发语言文件
    • protoc-gen-go是protoc的一个插件,用于生成go语言代码(protoc原生不支持生成go语言文件)
    • protoc-gen-go-grpc是protoc的go grpc插件,可以生成grpc相关的go语言文件。
  • IDE插件
    • goland或者vscode插件市场搜goctl
    • 用于支持go-zero框架中api描述语言

2.1 安装方式

2.1.1 goctl安装

go install github.com/zeromicro/go-zero/tools/goctl@latest
#验证版本
goctl --version
1
2
3

image-20240911224511250

2.1.2 protoc相关安装

##快捷安装
goctl env check --install --verbose --force
1
2

手动安装:

  • 打开https://github.com/protocolbuffers/protobuf/releases
  • 下载对应的版本(我这里是windows电脑),下载protoc-28.0-win64.zipopen in new window
  • 解压,并设置环境变量即可
  • 使用protoc --version验证
  • go install google.golang.org/protobuf/cmd/protoc-gen-go@latest
  • go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@latest

image-20240911224428004

3. 快速入门

框架的目的是为了帮助开发人员快速高效的开发应用程序

  1. 创建一个目录gozero-learn做为工作目录

  2. 在当前目录打开命令行工具

  3. 运行goctl api new hello01命令

    image-20240911224625412

  4. 生成如下代码:

    image-20240911224703789

  5. 进入hello01,运行go mod tidy下载依赖

  6. 在logic目录下的hello01logic.go中写入如下代码:

    func (l *Hello01Logic) Hello01(req *types.Request) (resp *types.Response, err error) {
    	// todo: add your logic here and delete this line
    	resp = &types.Response{
    		Message: "hello " + req.Name,
    	}
    	return
    }
    
    1
    2
    3
    4
    5
    6
    7
  7. hello01.go改为main.go并运行main函数

    image-20240911225211661

  8. 访问http://localhost:8888/form/you

goctl api new xxx可以快捷生成一个最小化的http服务,但我们希望form后面的name可以任意输入,就需要修改代码

  • 修改hello01.api

    type Request {
    	Name string `path:"name"`
    }
    
    1
    2
    3
  • 重新生成代码,运行命令goctl api go --api hello01.api --dir .

    • --api:指定api文件
    • --dir:指定go文件生成的目录

    image-20240911230324358

  • 重新运行访问即可

至此我们初步学会了go-zero

4. 目录说明

example
├── etc
│   └── example.yaml
├── main.go
└── internal
    ├── config
    │   └── config.go
    ├── handler
    │   ├── xxxhandler.go
    │   └── xxxhandler.go
    ├── logic
    │   └── xxxlogic.go
    ├── svc
    │   └── servicecontext.go
    └── types
        └── types.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
  • example:单个服务目录,一般是某微服务名称
  • etc:静态配置文件目录
  • main.go:程序启动入口文件
  • internal:单个服务内部文件,其可见范围仅限当前服务
  • config:静态配置文件对应的结构体声明目录
  • handler:handler 目录,可选,一般 http 服务会有这一层做路由管理,handler 为固定后缀
  • logic:业务目录,所有业务编码文件都存放在这个目录下面,logic 为固定后缀
  • svc:依赖注入目录,所有 logic 层需要用到的依赖都要在这里进行显式注入
  • types:结构体存放目录