GO-ZERO快速入门| 青训营笔记

236 阅读3分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 10 天


什么是GO-ZERO?

GO-ZERO是一个框架,他集成了web和rpc框架

使用 go-zero 的好处:

  • 轻松获得支撑千万日活服务的稳定性
  • 内建级联超时控制、限流、自适应熔断、自适应降载等微服务治理能力,无需配置和额外代码
  • 微服务治理中间件可无缝集成到其它现有框架使用
  • 极简的 API 描述,一键生成各端代码
  • 自动校验客户端请求参数合法性
  • 大量微服务治理和并发工具包

go-zero框架的特点:

go-zero 是一个集成了各种工程实践的包含 web 和 rpc 框架,有如下主要特点:

  • 强大的工具支持,尽可能少的代码编写
  • 极简的接口
  • 完全兼容 net/http
  • 支持中间件,方便扩展
  • 高性能
  • 面向故障编程,弹性设计
  • 内建服务发现、负载均衡
  • 内建限流、熔断、降载,且自动触发,自动恢复
  • API 参数自动校验
  • 超时级联控制
  • 自动缓存控制
  • 链路跟踪、统计报警等
  • 高并发支撑,稳定保障了疫情期间每天的流量洪峰

综上,当我们项目需要进行高并发高性能的时候,我们应该从传统的架构服务,转向微服务框架,go-zero就是很好也好上手的一款微服务框架,他包含了web框架和rpc框架,并且还有goctl生成工具,可以生成api等,接下来我们快速写一个官方文档里面的demo

快速入门:

在这个demo里面,我们没有完成业务逻辑,只是单纯的将微服务进行构建好了

首先我们需要环境,根据官方文档,我们需要安装goctl

安装goctl:

在windows下安装goctl,首先是去Github上拉取goctl的项目,然后进行build,然后将编译好的文件放在go里面的bin中,并配置好go的环境变量

安装protoc:

同理如上,我们将构建好的放入bin文件中

  • 安装 protoc-gen-go
go get -u github.com/golang/protobuf/protoc-gen-go@v1.3.2

编写API Gateway

我们在项目的api目录下的终端输入

goctl api -o shorturl.api

这样我们就创建好了,编写api文件

type (
  expandReq {
    shorten string `form:"shorten"`
  }

  expandResp {
    url string `json:"url"`
  }
)

type (
  shortenReq {
    url string `form:"url"`
  }

  shortenResp {
    shorten string `json:"shorten"`
  }
)

service shorturl-api {
  @server(
    handler: ShortenHandler
  )
  get /shorten(shortenReq) returns(shortenResp)

  @server(
    handler: ExpandHandler
  )
  get /expand(expandReq) returns(expandResp)
}

然后就是生成代码:

goctl api go -api shorturl.api -dir .

我的理解是我们生成了客户端的一些必须代码,也配置了路由,接下来我们需要生成服务端才能构建完整的RPC

编写RPC服务:

我们在当前目录下创建好rpc目录,然后写proto 文件

也可以命令生成模板:

goctl rpc template -o transform.proto
syntax = "proto3";

package transform;

option go_package = "./transform";

message expandReq{
  string shorten = 1;
}

message expandResp{
  string url = 1;
}

message shortenReq{
  string url = 1;
}

message shortenResp{
  string shorten = 1;
}

service  transformer{
  rpc expand(expandReq) returns(expandResp);
  rpc shorten(shortenReq) returns(shortenResp);
}

当我们修改完配置文件后

我们使用goctl生成rpc服务的代码:

goctl rpc protoc transform.proto --go_out=. --go-grpc_out=. --zrpc_out=.

配置API Gateway去调用rpc服务

我们将rpc服务的模块配置好后,就去配置API Gateway的逻辑代码,注意这里我们需要etcd,主要目的是能够找到rpc服务

编写RPC服务逻辑和数据库缓存

当然这是我们主要完成的业务,也是我们整个项目的关键实现。


总结:

就如go-zero文档里面所说的,go-zero更像是一个技术体系一样。它极大规范和简化了开发,并且让开发人员更专注于业务,提高了效率。