2020-09-05 19:09:18 +08:00
English | [简体中文 ](readme_zh-CN.md )
2020-08-19 17:01:22 +08:00
# go-zero
2020-07-28 16:29:13 +08:00
2020-08-15 14:44:37 +08:00
[![Go ](https://github.com/tal-tech/go-zero/workflows/Go/badge.svg?branch=master )](https://github.com/tal-tech/go-zero/actions)
[![codecov ](https://codecov.io/gh/tal-tech/go-zero/branch/master/graph/badge.svg )](https://codecov.io/gh/tal-tech/go-zero)
2020-08-19 16:10:43 +08:00
[![Go Report Card ](https://goreportcard.com/badge/github.com/tal-tech/go-zero )](https://goreportcard.com/report/github.com/tal-tech/go-zero)
2020-08-19 17:01:22 +08:00
[![Release ](https://img.shields.io/github/v/release/tal-tech/go-zero.svg?style=flat-square )](https://github.com/tal-tech/go-zero)
2020-08-15 15:16:57 +08:00
[![License: MIT ](https://img.shields.io/badge/License-MIT-yellow.svg )](https://opensource.org/licenses/MIT)
2020-08-09 23:22:31 +08:00
2020-09-05 19:09:18 +08:00
## 0. what is go-zero?
2020-08-21 16:52:17 +08:00
2020-09-05 19:18:15 +08:00
go-zero is a web and rpc framework that with lots of engineering practices builtin. It’ s born to ensure the stability of the busy services with resilience design, and has been serving sites with tens of millions users for years.
2020-08-21 16:52:17 +08:00
2020-09-05 19:09:18 +08:00
go-zero contains simple API description syntax and code generation tool called `goctl` . You can generate Go, iOS, Android, Kotlin, Dart, TypeScript, JavaScript from .api files with `goctl` .
2020-08-21 16:52:17 +08:00
2020-09-05 19:09:18 +08:00
Advantages of go-zero:
2020-08-21 22:51:04 +08:00
2020-09-05 19:09:18 +08:00
* improve the stability of the services with tens of millions of daily active users
* builtin chained timeout control, concurrency control, rate limit, adaptive circuit breaker, adaptive load shedding, even no configuration needed
* builtin middlewares also can be integrated into your frameworks
* simple API syntax, one command to generate couple different languages
* auto validate the request parameters from clients
* plenty of builtin microservice management and concurrent toolkits
2020-08-21 22:51:04 +08:00
2020-09-05 19:09:18 +08:00
< img src = "doc/images/architecture-en.png" alt = "Architecture" width = "1500" / >
2020-08-21 20:09:53 +08:00
2020-09-05 19:09:18 +08:00
## 1. Backgrounds of go-zero
2020-07-28 16:29:13 +08:00
2020-09-05 19:09:18 +08:00
At the beginning of 2018, we heavily suffered from frequent downtime. We decided to re-design our system, from monolithic architecture with Java+MongoDB to microservice architecture. After researches and comparison, we chose to:
2020-07-28 16:29:13 +08:00
2020-09-05 19:09:18 +08:00
* Golang based
* great performance
* simple syntax
* proven engineering efficiency
* extreme deployment experience
* less server resource consumption
* Self-designed microservice architecture
* I have rich experience on designing microservice architectures
* easy to location the problems
* easy to extend the features
2020-07-28 16:29:13 +08:00
2020-09-05 19:09:18 +08:00
## 2. Design considerations on go-zero
2020-07-28 16:29:13 +08:00
2020-09-05 19:09:18 +08:00
By designing the microservice architecture, we expected to ensure the stability, as well as the productivity. And from just the beginning, we have the following design principles:
2020-07-28 16:29:13 +08:00
2020-09-05 19:09:18 +08:00
* keep it simple
* high availability
* stable on high concurrency
* easy to extend
* resilience design, failure-oriented programming
* try best to be friendly to the business logic development, encapsulate the complexity
* one thing, one way
2020-07-28 16:29:13 +08:00
2020-09-05 19:09:18 +08:00
After almost half a year, we finished the transfer from monolithic system to microservice system, and deployed on August 2018. The new system guaranteed the business growth, and the system stability.
2020-07-28 16:29:13 +08:00
2020-09-05 19:09:18 +08:00
## 3. The implementation and features of go-zero
2020-07-28 16:29:13 +08:00
2020-09-05 19:09:18 +08:00
go-zero is a web and rpc framework that integrates lots of engineering practices. The features are mainly listed below:
2020-07-28 16:29:13 +08:00
2020-09-05 19:09:18 +08:00
* powerful tool included, less code to write
* simple interfaces
* fully compatible with net/http
* middlewares are supported, easy to extend
* high performance
* failure-oriented programming, resilience design
* builtin service discovery, load balancing
* builtin concurrency control, adaptive circuit breaker, adaptive load shedding, auto trigger, auto recover
* auto validation of API request parameters
* chained timeout control
* auto management of data caching
* call tracing, metrics and monitoring
* high concurrency protected
2020-07-28 16:29:13 +08:00
2020-09-05 19:09:18 +08:00
As below, go-zero protects the system with couple layers and mechanisms:
2020-07-28 16:29:13 +08:00
2020-09-05 19:09:18 +08:00
![Resilience ](doc/images/resilience-en.png )
2020-07-28 16:29:13 +08:00
2020-09-05 19:09:18 +08:00
## 4. Future development plans of go-zero
2020-07-28 16:29:13 +08:00
2020-09-05 19:09:18 +08:00
* auto generate API mock server, make the client debugging eaisier
* auto generate the simple integration test for the server side just from the .api files
2020-08-08 13:40:11 +08:00
2020-08-21 22:51:04 +08:00
## 5. Installation
2020-08-08 13:40:11 +08:00
2020-09-05 19:09:18 +08:00
Run the following command under your project:
2020-08-08 13:40:11 +08:00
2020-08-20 10:44:14 +08:00
```shell
go get -u github.com/tal-tech/go-zero
```
2020-08-08 13:40:11 +08:00
2020-08-21 22:51:04 +08:00
## 6. Quick Start
2020-08-08 13:40:11 +08:00
2020-09-05 19:09:18 +08:00
0. full examples can be checked out from below:
2020-08-29 20:27:52 +08:00
2020-09-06 15:36:12 +08:00
[Rapid development of microservice systems ](doc/shorturl-en.md )
2020-09-04 08:13:22 +08:00
2020-09-05 19:09:18 +08:00
[Rapid development of microservice systems - multiple RPCs ](doc/bookstore.md )
2020-08-08 13:40:11 +08:00
2020-09-05 19:09:18 +08:00
1. install goctl
2020-08-08 13:40:11 +08:00
2020-09-05 19:09:18 +08:00
`goctl` can be read as `go control` . `goctl means not to be controlled by code, instead, we control it. The inside ` go` is not `golang` . At the very beginning, I was expecting it to help us improve the productivity, and make our lives easier.
2020-09-04 15:40:12 +08:00
2020-08-31 22:37:43 +08:00
```shell
2020-09-05 19:09:18 +08:00
GO111MODULE=on go get -u github.com/tal-tech/go-zero/tools/goctl
2020-08-31 22:37:43 +08:00
```
2020-09-05 19:09:18 +08:00
make sure goctl is executable.
2020-08-08 13:40:11 +08:00
2020-09-05 19:09:18 +08:00
2. create the API file, like greet.api, you can install the plugin of goctl in vs code, api syntax is supported.
2020-08-08 13:40:11 +08:00
```go
type Request struct {
2020-09-05 19:09:18 +08:00
Name string `path:"name,options=you|me"` // parameters are auto validated
2020-08-08 13:40:11 +08:00
}
type Response struct {
Message string `json:"message"`
}
service greet-api {
@server (
handler: GreetHandler
)
get /greet/from/:name(Request) returns (Response);
}
```
2020-09-05 19:09:18 +08:00
the .api files also can be generate by goctl, like below:
2020-08-08 13:40:11 +08:00
```shell
goctl api -o greet.api
```
2020-09-05 19:09:18 +08:00
3. generate the go server side code
2020-08-08 13:40:11 +08:00
```shell
goctl api go -api greet.api -dir greet
```
2020-09-05 19:09:18 +08:00
the generated files look like:
2020-08-08 13:40:11 +08:00
```
├── greet
│ ├── etc
2020-09-05 19:09:18 +08:00
│ │ └── greet-api.yaml // configuration file
│ ├── greet.go // main file
2020-08-08 13:40:11 +08:00
│ └── internal
│ ├── config
2020-09-05 19:09:18 +08:00
│ │ └── config.go // configuration definition
2020-08-08 13:40:11 +08:00
│ ├── handler
2020-09-05 19:09:18 +08:00
│ │ ├── greethandler.go // get/put/post/delete routes are defined here
│ │ └── routes.go // routes list
2020-08-08 13:40:11 +08:00
│ ├── logic
2020-09-05 19:09:18 +08:00
│ │ └── greetlogic.go // request logic can be written here
2020-08-08 13:40:11 +08:00
│ ├── svc
2020-09-05 19:09:18 +08:00
│ │ └── servicecontext.go // service context, mysql/redis can be passed in here
2020-08-08 13:40:11 +08:00
│ └── types
2020-09-05 19:09:18 +08:00
│ └── types.go // request/response defined here
└── greet.api // api description file
2020-08-08 13:40:11 +08:00
```
2020-09-05 19:09:18 +08:00
the generated code can be run directly:
2020-08-30 23:34:57 +08:00
2020-09-05 19:09:18 +08:00
```shell
cd greet
go run greet.go -f etc/greet-api.yaml
```
2020-08-14 15:31:10 +08:00
2020-09-05 19:09:18 +08:00
by default, it’ s listening on port 8888, while it can be changed in configuration file.
2020-08-14 15:31:10 +08:00
2020-09-05 19:09:18 +08:00
you can check it by curl:
2020-08-30 23:34:57 +08:00
2020-09-05 19:09:18 +08:00
```shell
curl -i http://localhost:8888/greet/from/you
```
2020-08-30 23:34:57 +08:00
2020-09-05 19:09:18 +08:00
the response looks like:
2020-08-14 15:31:10 +08:00
2020-09-05 19:09:18 +08:00
```http
HTTP/1.1 200 OK
Date: Sun, 30 Aug 2020 15:32:35 GMT
Content-Length: 0
```
2020-08-14 15:31:10 +08:00
2020-09-05 19:09:18 +08:00
4. Write the business logic code
* the dependencies can be passed into the logic within servicecontext.go, like mysql, reds etc.
* add the logic code in logic package according to .api file
5. Generate code like Java, TypeScript, Dart, JavaScript etc. just from the api file
2020-08-08 13:40:11 +08:00
2020-08-08 13:53:39 +08:00
```shell
goctl api java -api greet.api -dir greet
goctl api dart -api greet.api -dir greet
...
```
2020-08-09 21:32:23 +08:00
2020-08-21 22:51:04 +08:00
## 7. Benchmark
2020-08-19 12:43:14 +08:00
![benchmark ](doc/images/benchmark.png )
2020-09-05 19:09:18 +08:00
[Checkout the test code ](https://github.com/smallnest/go-web-framework-benchmark )
2020-08-14 15:31:10 +08:00
2020-09-05 19:09:18 +08:00
## 8. Documents (adding)
2020-08-09 21:32:23 +08:00
2020-09-06 15:36:12 +08:00
* [Rapid development of microservice systems ](doc/shorturl-en.md )
2020-09-05 19:09:18 +08:00
* [Rapid development of microservice systems - multiple RPCs ](doc/bookstore.md )