golang高性能Web和RPC框架插件库go-zero的使用

golang高性能Web和RPC框架插件库go-zero的使用

什么是go-zero?

go-zero是一个集成了许多工程实践的Web和RPC框架。它旨在通过弹性设计确保繁忙服务的稳定性,多年来一直为数千万用户的站点提供服务。

go-zero logo

go-zero的优势

  • 提高了日活跃用户数达数千万的服务的稳定性
  • 内置链式超时控制、并发控制、速率限制、自适应熔断器、自适应负载均衡,甚至无需配置
  • 内置中间件也可以集成到您的框架中
  • 简单的API语法,一个命令即可生成多种不同语言的代码
  • 自动验证来自客户端的请求参数
  • 大量内置的微服务管理和并发工具包

架构图

go-zero架构

安装

在您的项目下运行以下命令:

go get -u github.com/zeromicro/go-zero

快速开始

1. 安装goctl

# 对于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

2. 创建API文件

创建一个名为greet.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)
}

或者使用goctl生成.api文件:

goctl api -o greet.api

3. 生成Go服务器端代码

goctl api go -api greet.api -dir greet

生成的文件结构如下:

├── greet
│   ├── etc
│   │   └── greet-api.yaml        // 配置文件
│   ├── greet.go                  // 主文件
│   └── 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描述文件

4. 运行代码

cd greet
go mod tidy
go run greet.go -f etc/greet-api.yaml

默认监听8888端口,可以通过配置文件修改。

5. 测试API

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

6. 编写业务逻辑代码

  • 依赖项可以通过servicecontext.go传入逻辑中,如mysql、redis等
  • 根据.api文件在logic包中添加逻辑代码

7. 从api文件生成其他语言代码

goctl api java -api greet.api -dir greet
goctl api dart -api greet.api -dir greet
...

性能基准测试

性能基准测试

文档

云原生景观

go-zero已列入CNCF云原生景观

CNCF Logo CNCF Landscape Logo


更多关于golang高性能Web和RPC框架插件库go-zero的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于golang高性能Web和RPC框架插件库go-zero的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


go-zero 高性能Web和RPC框架使用指南

go-zero 是一个集成了各种工程实践的 Web 和 RPC 框架,它具有高性能、易扩展、简单易用等特点。下面我将介绍 go-zero 的核心功能和使用方法,并提供相应的示例代码。

安装 go-zero

go get -u github.com/zeromicro/go-zero

快速创建API服务

1. 使用goctl工具创建项目

# 安装goctl工具
go install github.com/zeromicro/go-zero/tools/goctl@latest

# 创建API服务
goctl api new greet
cd greet
go mod tidy

2. 编写API定义文件

greet.api 文件中定义API:

type (
    Request {
        Name string `path:"name,options=you|me"`
    }
    
    Response {
        Message string `json:"message"`
    }
)

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

3. 生成代码

goctl api go -api greet.api -dir .

4. 修改业务逻辑

编辑 internal/logic/greetlogic.go

func (l *GreetLogic) Greet(req *types.Request) (*types.Response, error) {
    return &types.Response{
        Message: fmt.Sprintf("Hello, %s!", req.Name),
    }, nil
}

5. 运行服务

go run greet.go

RPC服务开发

1. 创建RPC服务

goctl rpc new user
cd user
go mod tidy

2. 修改proto文件

编辑 user.proto

syntax = "proto3";

package user;

message UserRequest {
  string id = 1;
}

message UserResponse {
  string name = 1;
  int32 age = 2;
}

service User {
  rpc GetUser(UserRequest) returns (UserResponse);
}

3. 生成代码

goctl rpc protoc user.proto --go_out=./types --go-grpc_out=./types --zrpc_out=.

4. 实现业务逻辑

编辑 internal/logic/getuserlogic.go

func (l *GetUserLogic) GetUser(in *user.UserRequest) (*user.UserResponse, error) {
    // 这里应该是从数据库或其他服务获取用户信息
    return &user.UserResponse{
        Name: "John Doe",
        Age:  30,
    }, nil
}

5. 运行RPC服务

go run user.go

数据库操作

go-zero 提供了强大的数据库操作支持,以下是使用示例:

1. 定义模型

# 从数据库生成模型
goctl model mysql datasource -url="user:password@tcp(127.0.0.1:3306)/database" -table="user" -dir="./model"

2. 使用模型

// 查询示例
func (l *GetUserLogic) GetUser(in *user.UserRequest) (*user.UserResponse, error) {
    u, err := l.svcCtx.UserModel.FindOne(l.ctx, in.Id)
    if err != nil {
        return nil, err
    }
    
    return &user.UserResponse{
        Name: u.Name,
        Age:  u.Age,
    }, nil
}

中间件使用

go-zero 支持中间件机制,可以方便地添加日志、鉴权等功能:

// 在main函数中添加中间件
func main() {
    flag.Parse()

    c := rest.RestConf{
        Host: "0.0.0.0",
        Port: 8888,
    }
    
    server := rest.MustNewServer(c)
    defer server.Stop()

    // 全局中间件
    server.Use(func(next http.HandlerFunc) http.HandlerFunc {
        return func(w http.ResponseWriter, r *http.Request) {
            logx.Info("request incoming")
            next(w, r)
        }
    })

    handler.RegisterHandlers(server, svcCtx)
    
    fmt.Printf("Starting server at %s:%d...\n", c.Host, c.Port)
    server.Start()
}

配置管理

go-zero 使用 yaml 文件进行配置管理:

Name: greet-api
Host: 0.0.0.0
Port: 8888

Log:
  Mode: file
  Path: ./logs

在代码中读取配置:

var configFile = flag.String("f", "etc/greet-api.yaml", "the config file")

func main() {
    flag.Parse()
    
    var c config.Config
    conf.MustLoad(*configFile, &c)
    
    // 使用配置...
}

性能优化

go-zero 内置了多种性能优化技术:

  1. 自适应降载:当系统负载过高时自动拒绝部分请求
  2. 自适应熔断:当依赖服务出现问题时自动熔断
  3. 缓存控制:内置缓存机制减少数据库访问

监控与链路追踪

go-zero 内置了 Prometheus 和 Jaeger 支持:

Prometheus:
  Host: 0.0.0.0
  Port: 9080
  Path: /metrics

Telemetry:
  Name: greet-api
  Endpoint: http://jaeger:14268/api/traces
  Sampler: 1.0
  Batcher: jaeger

总结

go-zero 是一个功能强大且高性能的微服务框架,它提供了:

  • 快速API开发
  • 高性能RPC支持
  • 完善的数据库操作
  • 中间件机制
  • 配置管理
  • 监控和链路追踪
  • 多种性能优化技术

通过上述示例,您可以快速上手 go-zero 开发高性能的 Web 和 RPC 服务。更多高级功能和最佳实践可以参考官方文档。

回到顶部