go-zero快速开始

go-zero 是一个集成了各种工程实践的 web 和 rpc 框架。

架构图

go-zero

框架设计​

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

框架特点​

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

快速开始

goctl 是 go-zero 的内置脚手架,是提升开发效率的一大利器,可以一键生成代码、文档、部署 k8s yaml、dockerfile 等。

  • api demo 代码生成
1
2
3
4
5
# 创建工作空间并进入该目录
$ mkdir -p ~/workspace/api && cd ~/workspace/api
# 执行指令生成 demo 服务
$ goctl api new demo
Done.

启动服务

1
2
3
4
5
6
# 进入服务目录
$ cd ~/workspace/api/demo
# 整理依赖文件
$ go mod tidy
# 启动 go 程序
$ go run demo.go
  • gRPC demo 代码生成
1
2
3
4
5
# 创建工作空间并进入该目录
$ mkdir -p ~/workspace/rpc && cd ~/workspace/rpc
# 执行指令生成 demo 服务
$ goctl rpc new demo
Done.

启动服务

1
2
3
4
5
6
# 进入服务目录
$ cd ~/workspace/rpc/demo
# 整理依赖文件
$ go mod tidy
# 启动 go 程序
$ go run demo.go

http服务demo

一个简单的 HTTP 服务。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
func main() {
    var restConf rest.RestConf
    conf.MustLoad("etc/helloworld.yaml", &restConf)
    s, err := rest.NewServer(restConf)
    if err != nil {
        log.Fatal(err)
        return
    }

    s.AddRoute(rest.Route{ // 添加路由
        Method: http.MethodGet,
        Path:   "/hello/world",
        Handler: func(writer http.ResponseWriter, request *http.Request) { // 处理函数
            httpx.OkJson(writer, "Hello World!")
        },
    })

    defer s.Stop()
    s.Start() // 启动服务
}

配置文件etc/helloworld.yaml

1
2
3
Name: HelloWorld.api
Host: 127.0.0.1
Port: 8080

grpc服务demo

一个 rpc server 服务示例:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
func main() {
    var serverConf zrpc.RpcServerConf
    conf.MustLoad("etc/greet-server.yaml", &serverConf)
    s := zrpc.MustNewServer(serverConf, func(server *grpc.Server) {
        greet.RegisterGreetServer(server, &exampleServer{})
    })
    
    defer s.Stop()
    s.Start()
}

type exampleServer struct {
    greet.UnimplementedGreetServer
}

func (e *exampleServer) Ping(ctx context.Context, request *greet.Request) (*greet.Response, error) {
    // fill your logic here
    return &greet.Response{}, nil
}

配置文件etc/greet-server.yaml

1
2
Name: greet.rpc
ListenOn: 127.0.0.1:8080