go-zero入门

📅 2026/7/16 23:39:10 👁️ 阅读次数 📝 编程学习
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-zerogin
核心定位面向微服务的全栈式框架轻量级Web框架,高性能、简洁易用
用途构建高性能API接口与微服务构建高性能、Web应用
设置工具大于约定,工程化,标准化灵活简洁,高性能路由
治理能力内置 (限流 熔断 服务发现等)依赖中间件
开发效率高(提供goctl工具链生成代码)中(灵活但需要手动完成工作)
协议支持同时支持HTTP和RPC(gRPC)主要支持Http和Https
适用场景构建Api和大型复杂的微服务项目快速构建Api或构建需要模板渲染的web应用
发布日期2020.82014

1.安装

1.安装golang

  • golang download 找到对应版本的安装包,执行安装
  • 安装后执行,查看版本
go version

3.安装goctl

goinstallgithub.com/zeromicro/go-zero/tools/goctl@latest

查看版本

goctl --version

4.安装protoc

goctlenvcheck--install--verbose--force

5.安装fresh实现热加载

goinstallgithub.com/gravityblast/fresh@latest

使用安装

fresh

2.安装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文件夹下执行

  1. 创建一个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)}
  1. 使用命令生成项目
goctl api go--apishop.api--dir.
  1. 生成项目后下载依赖
go mo tidy
  1. 修改代码,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}
  1. 运行
go run .\shop.go
  1. 验证
    打开浏览器输入http://localhost:8888/api/article/list,可以看到输出的正是我们修改的func (l *GetArticleListLogic) GetArticleList() (resp *types.ArticleResp, err error)方法
  2. 项目目录结构如下
    目录结构
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端

  1. proto文件,用于grpc远程调用
# 用这个命令生成一个用来测试心跳包的proto文件goctl rpc-ogreet.proto
  1. 生成后的greet.proto如下
# 这个代码主要就是用来测试心跳的。 syntax="proto3";packagegreet;option go_package="./greet";message Request{stringping=1;}message Response{stringpong=1;}service Greet{rpcPing(Request)returns(Response);}
  1. 生成gRPC服务端
参数描述
go_outproto生成的go代码所在的目录,proto自己的参数
go-rpc_outproto生成的grpc代码所在的目录,proto自带的参数,和go_out必须在同一个目录
zrpc_outgoctl rpc自带的命令,go-zero生成的代码所在的目录
goctl rpc protoc greet.proto--go_out=./grpc-server --go-grpc_out=./grpc-server--zrpc_out=./grpc-server
  1. 生成的yml
    由于此时注册中心还没有就绪,因此建议注释Etcd
Name:greet.rpcListenOn:0.0.0.0:8080# 这下边的是注册中心,直连的话可以把Etcd都注释掉Etcd:Hosts:-127.0.0.1:2379Key:greet.rpc

2. 创建一个简单的grpc-client

  1. 在grpc-server的同级目录创建一个grpc-client目录
  2. 把grpc-server里边生成的greet目录复制过去
  3. 创建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.运行

  1. 运行服务端
go mod init grpc-server go mod tidy go run .\greet.go
  1. 运行客户端
go mod init grpc-client go mod tidy go run ./client.go
  1. 查看结果
    客户端运行起来后
    服务端输出

    客户端输出

    说明运行成功