Go 每日一库之云原生 go-zero 微服务框架

Go语言精选

共 3000字,需浏览 6分钟

 ·

2020-09-05 04:28

点击上方蓝色“Go语言中文网”关注我们,领全套Go资料,每天学习 Go 语言

0. go-zero 介绍

go-zero 是一个集成了各种工程实践的 web 和 rpc 框架。通过弹性设计保障了大并发服务端的稳定性,经受了充分的实战检验。

go-zero 包含极简的 API 定义和生成工具 goctl,可以根据定义的 api 文件一键生成 Go, iOS, Android, Kotlin, Dart, TypeScript, JavaScript 代码,并可直接运行。

使用 go-zero 的好处:

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

1. go-zero 框架背景

18 年初,晓黑板后端在经过频繁的宕机后,决定从Java+MongoDB的单体架构迁移到微服务架构,经过仔细思考和对比,我们决定:

  • 基于 Go 语言
    • 高效的性能
    • 简洁的语法
    • 广泛验证的工程效率
    • 极致的部署体验
    • 极低的服务端资源成本
  • 自研微服务框架
    • 个人有过很多微服务框架自研经验
    • 需要有更快速的问题定位能力
    • 更便捷的增加新特性

2. go-zero 框架设计思考

对于微服务框架的设计,我们期望保障微服务稳定性的同时,也要特别注重研发效率。所以设计之初,我们就有如下一些准则:

  • 保持简单
  • 高可用
  • 高并发
  • 易扩展
  • 弹性设计,面向故障编程
  • 尽可能对业务开发友好,封装复杂度
  • 尽可能约束做一件事只有一种方式

我们经历不到半年时间,彻底完成了从Java+MongoDBGolang+MySQL为主的微服务体系迁移,并于 18 年 8 月底完全上线,稳定保障了晓黑板后续增长,确保了整个服务的高可用。

3. go-zero 项目实现和特点

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

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

如下图,我们从多个层面保障了整体服务的高可用:

弹性设计

4. go-zero 近期开发计划

  • 自动生成 API mock server,便于客户端开发
  • 自动生成服务端功能测试

5. Installation

在项目目录下通过如下命令安装:

go get -u github.com/tal-tech/go-zero

6. Quick Start

  1. 编译 goctl 工具
go build tools/goctl/goctl.go

把 goctl 放到$PATH 的目录下,确保 goctl 可执行

  1. 定义 API 文件,比如 greet.api,可以在 vs code 里安装goctl插件,支持 api 语法
type Request struct {
  Name string `path:"name,options=you|me"` // 框架自动验证请求参数是否合法
}

type Response struct {
  Message string `json:"message"`
}

service greet-api {
  @server(
    handler: GreetHandler
  )
  get /greet/from/:name(Request) returns (Response);
}

也可以通过 goctl 生成 api 模本文件,命令如下:

goctl api -o greet.api
  1. 生成 go 服务端代码
goctl api go -api greet.api -dir greet

生成的文件结构如下:

├── greet
│   ├── etc
│   │   └── greet-api.json        // 配置文件
│   ├── greet.go                  // main文件
│   └── internal
│       ├── config
│       │   └── config.go         // 配置定义
│       ├── handler
│       │   ├── greethandler.go   // get/put/post/delete等路由定义文件
│       │   └── routes.go         // 路由列表
│       ├── logic
│       │   └── greetlogic.go     // 请求逻辑处理文件
│       ├── svc
│       │   └── servicecontext.go // 请求上下文,可以传入mysql, redis等依赖
│       └── types
│           └── types.go          // 请求、返回等类型定义
└── greet.api                     // api描述文件

生成的代码可以直接运行:

cd greet
go run greet.go -f etc/greet-api.json

默认侦听在 8888 端口(可以在配置文件里修改),可以通过 curl 请求:

➜  go-zero git:(master) curl -w "\ncode: %{http_code}\n" http://localhost:8888/greet/from/kevin
{"code":0}
code: 200

编写业务代码:

  • 可以在 servicecontext.go 里面传递依赖给 logic,比如 mysql, redis 等
  • 在 api 定义的 get/post/put/delete 等请求对应的 logic 里增加业务处理逻辑
  1. 可以根据 api 文件生成前端需要的 Java, TypeScript, Dart, JavaScript 代码
goctl api java -api greet.api -dir greet
goctl api dart -api greet.api -dir greet
...

7. Benchmark

benchmark

测试代码见这里:https://github.com/smallnest/go-web-framework-benchmark

8. 项目地址

https://github.com/tal-tech/go-zero



推荐阅读


学习交流 Go 语言,扫码回复「进群」即可


站长 polarisxu

自己的原创文章

不限于 Go 技术

职场和创业经验


Go语言中文网

每天为你

分享 Go 知识

Go爱好者值得关注


浏览 44
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报