go-zero入门
简介go-zero是一个集成了各种工程实现的web和rpc框架通俗的来说go-zero既是一个web框架又是一个微服务框架。官网 https://go-zero.dev/go-zero提供了极简的API定义和强大的代码生成工具goctl可以大幅提升开发效率定义好api之后通过goctl可以快速生成工程diamantego–zero中还内置了微服务治理能力比如**限流、熔断、降级、服务发现负载均衡链路追踪等微服务治理能力**无需额外的配置和代码即可使用go-zero和Gin的对比维度go-zerogin核心定位面向微服务的全栈式框架轻量级Web框架高性能、简洁易用用途构建高性能API接口与微服务构建高性能、Web应用设置工具大于约定工程化标准化灵活简洁高性能路由治理能力内置 限流 熔断 服务发现等依赖中间件开发效率高提供goctl工具链生成代码中灵活但需要手动完成工作协议支持同时支持HTTP和RPCgRPC)主要支持Http和Https适用场景构建Api和大型复杂的微服务项目快速构建Api或构建需要模板渲染的web应用发布日期2020.820141.安装1.安装golanggolang download 找到对应版本的安装包执行安装安装后执行查看版本go version3.安装goctlgoinstallgithub.com/zeromicro/go-zero/tools/goctllatest查看版本goctl --version4.安装protocgoctlenvcheck--install--verbose--force5.安装fresh实现热加载goinstallgithub.com/gravityblast/freshlatest使用安装fresh2.安装vscode插件1.Go插件Name: GoId: golang.goDescription: Rich Go language support for Visual Studio CodeVersion: 0.56.0Publisher: Go Team at GoogleVS Marketplace Link: https://marketplace.visualstudio.com/items?itemNamegolang.Go2.goctl插件Name: goctlId: xiaoxin-technology.goctlDescription: goctl visual studio code extensionVersion: 0.1.10Publisher: zeromicroVS Marketplace Link: https://marketplace.visualstudio.com/items?itemNamexiaoxin-technology.goctl3.goctl生成项目示例1.生成单体应用创建一个文件夹zeroshop在zeroshop文件夹下执行创建一个shop.api文件等会用goctl生成项目syntaxv1// 定义类型快// 轮播图结构type(FocusResp{Result[]*Focusjson:result}Focus{Idint64json:idNamestringjson:namePicstringjson:picUrlstringjson:urlPositionint32json:position})// 文章结构type(ArticleResp{Result[]*Articlejson:result}Article{Idint64json:idTitlestringjson:titleContentstringjson: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.gofunc(l*GetArticleListLogic)GetArticleList()(resp*types.ArticleResp,errerror){resptypes.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如下# 这个代码主要就是用来测试心跳的。 syntaxproto3;packagegreet;option go_package./greet;message Request{stringping1;}message Response{stringpong1;}service Greet{rpcPing(Request)returns(Response);}生成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生成的yml由于此时注册中心还没有就绪因此建议注释EtcdName: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(contextgrpc-client/greetloggoogle.golang.org/grpcgoogle.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查看结果客户端运行起来后服务端输出客户端输出说明运行成功