You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
go-zero/readme.md

179 lines
5.1 KiB
Markdown

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# go-zero项目介绍
![Go](https://github.com/tal-tech/go-zero/workflows/Go/badge.svg?branch=master)
## 1. go-zero框架背景
18年初晓黑板后端在经过频繁的宕机后决定从`Java+MongoDB`的单体架构迁移到微服务架构,经过仔细思考和对比,我们决定:
* 基于Go语言
* 高效的性能
* 简洁的语法
* 广泛验证的工程效率
* 极致的部署体验
* 极低的服务端资源成本
* 自研微服务框架
* 个人有过很多微服务框架自研经验
* 需要有更快速的问题定位能力
* 更便捷的增加新特性
## 2. go-zero框架设计思考
对于微服务框架的设计,我们期望保障微服务稳定性的同时,也要特别注重研发效率。所以设计之初,我们就有如下一些准则:
* 保持简单
* 高可用
* 高并发
* 易扩展
* 弹性设计,面向故障编程
* 尽可能对业务开发友好,封装复杂度
* 尽可能约束做一件事只有一种方式
我们经历不到半年时间,彻底完成了从`Java+MongoDB`到`Golang+MySQL`为主的微服务体系迁移并于18年8月底完全上线稳定保障了晓黑板后续增长确保了整个服务的高可用。
## 3. go-zero项目实现和特点
go-zero是一个集成了各种工程实践的包含web和rpc框架有如下主要特点
* 强大的工具支持,尽可能少的代码编写
* 极简的接口
* 完全兼容net/http
* 支持中间件,方便扩展
* 高性能
* 面向故障编程,弹性设计
* 内建服务发现、负载均衡
* 内建限流、熔断、降载,且自动触发,自动恢复
* API参数自动校验
* 超时级联控制
* 自动缓存控制
* 链路跟踪、统计报警等
* 高并发支撑,稳定保障了晓黑板疫情期间每天的流量洪峰
如下图,我们从多个层面保障了整体服务的高可用:
![弹性设计](doc/images/resilience.jpg)
## 4. go-zero框架收益
* 保障大并发服务端的稳定性,经受了充分的实战检验
* 极简的API定义
* 一键生成Go, iOS, Android, Dart, TypeScript, JavaScript代码并可直接运行
* 服务端自动校验参数合法性
## 5. go-zero近期开发计划
* 自动生成API mock server便于客户端开发
* 自动生成服务端功能测试
## 6. Installation
1. 在项目目录下通过如下命令安装:
```shell
go get -u github.com/tal-tech/go-zero
```
2. 代码里导入go-zero
```go
import "github.com/tal-tech/go-zero"
```
## 7. Quick Start
1. 编译goctl工具
```shell
go build tools/goctl/goctl.go
```
把goctl放到$PATH的目录下确保goctl可执行
2. 定义API文件比如greet.api可以在vs code里安装`goctl`插件支持api语法
```go
type Request struct {
Name string `path:"name"`
}
type Response struct {
Message string `json:"message"`
}
service greet-api {
@server(
handler: GreetHandler
)
get /greet/from/:name(Request) returns (Response);
}
```
也可以通过goctl生成api模本文件命令如下
```shell
goctl api -o greet.api
```
3. 生成go服务端代码
```shell
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描述文件
8 directories, 9 files
```
如果使用的是gomod依赖管理需要在greet项目目录下面执行 `go mod init greet` 初始化gomod。
生成的代码可以直接运行:
```shell
cd greet
go run greet.go -f etc/greet-api.json
```
默认侦听在8888端口可以在配置文件里修改可以通过curl请求
```shell
➜ 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里增加业务处理逻辑
4. 可以根据api文件生成前端需要的Java, TypeScript, Dart, JavaScript代码
```shell
goctl api java -api greet.api -dir greet
goctl api dart -api greet.api -dir greet
...
```
### 微信交流群
添加我的微信kevwan请注明go-zero我拉进go-zero社区群🤝