快速入门
1. 介绍
go-zero 是一个集成了各种工程实践的 web 和 RPC框架。通过弹性设计保障了大并发服务端的稳定性,经受了充分的实战检验。
1.1 web框架
快速高效开发web应用
的工具或软件:
- web应用有
动态网站
,网络应用
,网络服务
等,比如抖音,B站,淘宝,在线银行,医疗系统,政务服务,微信,各种网站等等 - 支持
HTTP协议
- 支持
Websocket协议
1.2 RPC
RPC(Remote Procedure Call Protocol)
远程过程调用协议。一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。
RPC是两个进程间的通信,可以跨设备,RPC框架需要保证在调用远端服务或资源时,就像调用本地应用程序一样方便
1.3 微服务
微服务是由多个功能模块(小服务)组成,共同完成一件事(组成可用的一整个系统),各个服务之间使用RPC
进行通信。
- 好处就在于各个服务是独立的个体,其代表了一种编程思维方式,服务需要具备独立性,扩展性,容错性,高可用性等,适用于高并发等大型系统
- 坏处就是复杂性大大提高,管理维护变得困难
要构建一个微服务系统,需要如下手段:
- 服务治理
- 服务注册发现
- 服务调用
- RPC
- REST
- 服务网关
- 服务容错
- 限流
- 熔断
- 降级
- 链路追踪
- 负载均衡
- 监控报警
- 分布式配置中心
- 分布式事务
- 分布式任务调度
- 分布式文件存储
- 消息队列
- Docker
- 云原生
2. 安装
要想使用go-zero
框架,需要安装以下环境:
- golang:这里我们安装最新版
go1.23
版本 - goctl:goctl是go-zero框架的内置脚手架,可以一键生成代码、文档、部署 k8s yaml、dockerfile 等。
- protoc
protobuf
是一种数据序列化和反序列化标准,谷歌出品,和json
,xml
类似,性能非常高。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描述语言
- goland或者vscode插件市场搜
2.1 安装方式
2.1.1 goctl安装
go install github.com/zeromicro/go-zero/tools/goctl@latest
#验证版本
goctl --version
1
2
3
2
3
2.1.2 protoc相关安装
##快捷安装
goctl env check --install --verbose --force
1
2
2
手动安装:
- 打开
https://github.com/protocolbuffers/protobuf/releases
- 下载对应的版本(我这里是windows电脑),下载protoc-28.0-win64.zip
- 解压,并设置环境变量即可
- 使用
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
3. 快速入门
框架的目的是为了帮助开发人员快速高效的开发应用程序
创建一个目录
gozero-learn
做为工作目录在当前目录打开
命令行工具
运行
goctl api new hello01
命令生成如下代码:
进入
hello01
,运行go mod tidy
下载依赖在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将
hello01.go
改为main.go
并运行main函数访问
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文件生成的目录
重新运行访问即可
至此我们初步学会了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
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:结构体存放目录