go-zero
go-zero 是一个集成了大量工程实践的 Web 和 RPC 框架。它的诞生是为了确保高负载服务的稳定性,通过弹性设计,多年来一直为拥有数千万用户的网站提供服务。
🤷 什么是 go-zero?
English | 简体中文
go-zero (已列入 CNCF 全景图:https://landscape.cncf.io/?selected=go-zero) 是一个集成了大量工程实践的 Web 和 RPC 框架。它的诞生是为了确保高负载服务的稳定性,通过弹性设计,多年来一直为拥有数千万用户的网站提供服务。
go-zero 包含简单的 API 描述语法和代码生成工具 goctl
。您可以使用 goctl
从 .api 文件生成 Go、iOS、Android、Kotlin、Dart、TypeScript、JavaScript 代码。
go-zero 的优势:
- 提高了日活用户数千万的服务的稳定性
- 内置链式超时控制、并发控制、限流、自适应熔断、自适应负载降级,甚至无需配置
- 内置中间件也可以集成到您的框架中
- 简单的 API 语法,一条命令生成多种不同语言的代码
- 自动验证客户端请求参数
- 丰富的内置微服务管理和并发工具包
go-zero 的背景
2018年初,我们开始了系统重新设计的转型之旅,从基于 Java 和 MongoDB 的单体架构转向微服务架构。经过仔细研究和比较,我们做出了以下慎重选择:
-
选择 Golang
- 卓越的性能
- 简洁的语法
- 经过验证的工程效率
- 极致的部署体验
- 更少的服务器资源消耗
-
自行设计微服务架构
- 微服务架构便于创建可扩展、灵活和可维护的软件系统,具有独立、可重用的组件。
- 易于定位微服务中的问题。
- 易于通过添加或修改特定微服务来扩展功能,而不影响整个系统。
go-zero 的设计考虑
在设计微服务架构时,我们期望确保稳定性和生产力。从一开始,我们就有以下设计原则:
- 保持简单
- 高可用性
- 高并发稳定性
- 易于扩展
- 弹性设计,面向失败编程
- 尽量对业务逻辑开发友好,封装复杂性
- 一件事,一种方式
经过近半年的时间,我们完成了从单体系统到微服务系统的转型,并于2018年8月部署。新系统保证了业务增长和系统稳定性。
go-zero 的实现和特性
go-zero 是一个集成了大量工程实践的 Web 和 RPC 框架。主要特性如下:
- 强大的工具支持,减少代码编写
- 简单的接口
- 完全兼容 net/http
- 支持中间件,易于扩展
- 高性能
- 面向失败编程,弹性设计
- 内置服务发现、负载均衡
- 内置并发控制、自适应熔断、自适应负载降级、自动触发、自动恢复
- 自动验证 API 请求参数
- 链式超时控制
- 自动管理数据缓存
- 调用跟踪、指标和监控
- 高并发保护
如下图所示,go-zero 通过多层和多种机制保护系统:
我们使用 go-zero 的简化架构
安装
在您的项目下运行以下命令:
go get -u github.com/zeromicro/go-zero
快速开始
-
完整示例可以查看以下内容:
-
安装 goctl
goctl
可以读作go control
。goctl
意味着不被代码控制,而是我们控制它。内部的go
不是golang
。一开始,我希望它能帮助我们提高生产力,让我们的生活更轻松。# 对于 Go go install github.com/zeromicro/go-zero/tools/goctl@latest # 对于 Mac brew install goctl # 适用于所有平台的 docker docker pull kevinwan/goctl # 运行 goctl docker run --rm -it -v `pwd`:/app kevinwan/goctl --help
确保 goctl 可执行且在您的 $PATH 中。
-
创建 API 文件,如 greet.api,您可以在 VS Code 中安装 goctl 插件,支持 api 语法。
type ( Request { Name string `path:"name,options=[you,me]"` // 参数会自动验证 } Response { Message string `json:"message"` } ) service greet-api { @handler GreetHandler get /greet/from/:name(Request) returns (Response) }
.api 文件也可以通过 goctl 生成,如下所示:
goctl api -o greet.api
-
生成 Go 服务端代码
goctl api go -api greet.api -dir greet
生成的文件结构如下:
├── greet │ ├── etc │ │ └── greet-api.yaml // 配置文件 │ ├── 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 mod tidy go run greet.go -f etc/greet-api.yaml
默认情况下,它监听 8888 端口,可以在配置文件中更改。
您可以通过 curl 进行检查:
curl -i http://localhost:8888/greet/from/you
响应如下所示:
HTTP/1.1 200 OK Date: Sun, 30 Aug 2020 15:32:35 GMT Content-Length: 0
-
编写业务逻辑代码
- 可以在 servicecontext.go 中将依赖项传递到逻辑中,如 mysql、redis 等。
- 根据 .api 文件在 logic 包中添加逻辑代码
-
仅从 api 文件生成 Java、TypeScript、Dart、JavaScript 等代码
goctl api java -api greet.api -dir greet goctl api dart -api greet.api -dir greet ...
基准测试
文档
聊天群
通过 https://discord.gg/4JQvC5A4Fe 加入聊天
云原生全景图
go-zero 已列入 CNCF 云原生全景图。
给个星星! ⭐
如果您喜欢这个项目或正在使用它来学习或开始您自己的解决方案,请给它一个星星以获取新版本的更新。您的支持很重要!