go-zero入门
简介
go-zero是一个集成了各种工程实现的web和rpc框架,通俗的来说,go-zero既是一个web框架,又是一个微服务框架。官网 https://go-zero.dev/
go-zero提供了极简的API定义和强大的代码生成工具goctl,可以大幅提升开发效率,定义好api之后通过goctl可以快速生成工程diamante
go–zero中还内置了微服务治理能力,比如**限流、熔断、降级、服务发现,负载均衡,链路追踪等微服务治理能力**,无需额外的配置和代码即可使用
go-zero和Gin的对比
| 维度 | go-zero | gin |
|---|---|---|
| 核心定位 | 面向微服务的全栈式框架 | 轻量级Web框架,高性能、简洁易用 |
| 用途 | 构建高性能API接口与微服务 | 构建高性能、Web应用 |
| 设置 | 工具大于约定,工程化,标准化 | 灵活简洁,高性能路由 |
| 治理能力 | 内置 (限流 熔断 服务发现等) | 依赖中间件 |
| 开发效率 | 高(提供goctl工具链生成代码) | 中(灵活但需要手动完成工作) |
| 协议支持 | 同时支持HTTP和RPC(gRPC) | 主要支持Http和Https |
| 适用场景 | 构建Api和大型复杂的微服务项目 | 快速构建Api或构建需要模板渲染的web应用 |
| 发布日期 | 2020.8 | 2014 |
1.安装
1.安装golang
- golang download 找到对应版本的安装包,执行安装
- 安装后执行,查看版本
go version3.安装goctl
goinstallgithub.com/zeromicro/go-zero/tools/goctl@latest查看版本
goctl --version4.安装protoc
goctlenvcheck--install--verbose--force5.安装fresh实现热加载
goinstallgithub.com/gravityblast/fresh@latest使用安装
fresh2.安装vscode插件
1.Go插件
Name: Go
Id: golang.go
Description: Rich Go language support for Visual Studio Code
Version: 0.56.0
Publisher: Go Team at Google
VS Marketplace Link: https://marketplace.visualstudio.com/items?itemName=golang.Go
2.goctl插件
Name: goctl
Id: xiaoxin-technology.goctl
Description: goctl visual studio code extension
Version: 0.1.10
Publisher: zeromicro
VS Marketplace Link: https://marketplace.visualstudio.com/items?itemName=xiaoxin-technology.goctl
3.goctl生成项目示例
1.生成单体应用
创建一个文件夹zeroshop,在zeroshop文件夹下执行
- 创建一个shop.api文件,等会用goctl生成项目
syntax="v1"// 定义类型快,// 轮播图结构type(FocusResp{Result[]*Focus`json:"result"`}Focus{Idint64`json:"id"`Namestring`json:"name"`Picstring`json:"pic"`Urlstring`json:"url"`Positionint32`json:"position"`})// 文章结构type(ArticleResp{Result[]*Article`json:"result"`}Article{Idint64`json:"id"`Titlestring`json:"title"`Contentstring`json:"content"`})// 服务端定义@server(group:focus prefix:/api/focus)service shop-api{@handler GetFocusList get/list returns(FocusResp)}// 路由定义@server(group:article prefix:/api/article)// 详细的路由定义service shop-api{@handler GetArticleList get/list returns(ArticleResp)}- 使用命令生成项目
goctl api go--apishop.api--dir.- 生成项目后下载依赖
go mo tidy- 修改代码,
go_zero\zeroshop\internal\logic\article\getarticlelistlogic.go
func(l*GetArticleListLogic)GetArticleList()(resp*types.ArticleResp,errerror){resp=&types.ArticleResp{Result:[]*types.Article{{Id:1,Title:"title",Content:"xxxxxx",},{Id:2,Title:"title2",Content:"yyyyyy",},},}returnresp,nil}- 运行
go run .\shop.go- 验证
打开浏览器输入http://localhost:8888/api/article/list,可以看到输出的正是我们修改的func (l *GetArticleListLogic) GetArticleList() (resp *types.ArticleResp, err error)方法 - 项目目录结构如下
目录结构
go_zero_demo │ .gitignore │ go.mod │ go.sum │ readme.md │ shop.api -- api定义文件 │ shop.go -- 程序主入口 ├─etc │ shop-api.yaml --API服务配置寄文件 ├─internal │ ├─config -- 配置目录 │ │ config.go --配置结构体和加载逻辑 │ ├─handler --services目录 这个目录是自动生成的几乎不用管,只改logic里边的方法就行了 │ │ │ routes.go --路由注册配置 │ │ ├─article │ │ │ getarticledetailhandler.go │ │ │ getarticlelisthandler.go │ │ └─focus │ │ getfocuslisthandler.go │ ├─logic --生成的业务逻辑都在这里,修改这里的方法就可以了 │ │ ├─article │ │ │ getarticledetaillogic.go │ │ │ getarticlelistlogic.go │ │ └─focus │ │ getfocuslistlogic.go │ ├─svc │ │ servicecontext.go -- 服务上下文 │ └─types │ types.go 请求响应结构体定义 └─tmp runner-build.exe --如果使用fresh运行,那么会生成一个临时build的可执行文件2.生成微服务项目
1. 生成Server端
- proto文件,用于grpc远程调用
# 用这个命令生成一个用来测试心跳包的proto文件goctl rpc-ogreet.proto- 生成后的
greet.proto如下
# 这个代码主要就是用来测试心跳的。 syntax="proto3";packagegreet;option go_package="./greet";message Request{stringping=1;}message Response{stringpong=1;}service Greet{rpcPing(Request)returns(Response);}- 生成gRPC服务端
| 参数 | 描述 |
|---|---|
| go_out | proto生成的go代码所在的目录,proto自己的参数 |
| go-rpc_out | proto生成的grpc代码所在的目录,proto自带的参数,和go_out必须在同一个目录 |
| zrpc_out | goctl rpc自带的命令,go-zero生成的代码所在的目录 |
goctl rpc protoc greet.proto--go_out=./grpc-server --go-grpc_out=./grpc-server--zrpc_out=./grpc-server- 生成的yml
由于此时注册中心还没有就绪,因此建议注释Etcd
Name:greet.rpcListenOn:0.0.0.0:8080# 这下边的是注册中心,直连的话可以把Etcd都注释掉Etcd:Hosts:-127.0.0.1:2379Key:greet.rpc2. 创建一个简单的grpc-client
- 在grpc-server的同级目录创建一个grpc-client目录
- 把grpc-server里边生成的greet目录复制过去
- 创建client.go文件
packagemainimport("context""grpc-client/greet""log""google.golang.org/grpc""google.golang.org/grpc/credentials/insecure")funcmain(){conn,err:=grpc.NewClient("0.0.0.0:8080",grpc.WithTransportCredentials(insecure.NewCredentials()))iferr!=nil{log.Fatal(err)}client:=greet.NewGreetClient(conn)resp,err:=client.Ping(context.Background(),&greet.Request{Ping:"ping"})iferr!=nil{log.Fatal(err)return}log.Println(resp)}3.运行
- 运行服务端
go mod init grpc-server go mod tidy go run .\greet.go- 运行客户端
go mod init grpc-client go mod tidy go run ./client.go- 查看结果
客户端运行起来后
服务端输出
客户端输出
说明运行成功