Skip to content

go-zero 是一个专为 Go 语言设计的微服务框架,它提供了一套完整的微服务开发工具集,包括 API 网关、服务发现、负载均衡、限流、熔断、日志、监控等功能。go-zero 旨在简化大规模分布式应用的开发,特别适用于高性能、低延迟、高吞吐量的服务场景。

以下是使用 go-zero 构建微服务的基本步骤。

1. 安装 go-zero

要开始使用 go-zero,首先需要安装它。你可以使用以下命令来安装 go-zero

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

2. 项目结构

go-zero 的项目结构非常简洁,推荐的项目结构如下:

/my-service
    /api                  # 存放接口定义文件
    /app                  # 存放具体的业务逻辑
    /config               # 配置文件
    /internal             # 存放底层实现代码(如中间件、工具类)
    /scripts              # 存放启动、编译等脚本
    go.mod                # Go 模块管理文件
    go.sum                # Go 依赖文件

3. 定义 API 接口

使用 go-zero 的第一步通常是定义 API 接口。go-zero 提供了一种特殊的方式来定义接口文件,通常是 .api 文件。

示例:定义一个简单的接口

api 文件夹下创建一个名为 hello.api 的文件,内容如下:

api
syntax = "v1"

service hello {
    rpc SayHello (HelloRequest) returns (HelloResponse);
}

message HelloRequest {
    string name = 1;
}

message HelloResponse {
    string message = 1;
}

该文件定义了一个 SayHello 的远程过程调用(RPC)接口,它接受一个 HelloRequest,并返回一个 HelloResponse

4. 生成代码

一旦定义了 API 接口,你可以使用 go-zero 提供的 build 工具来生成代码。

bash
# 安装 goctl(go-zero 的代码生成工具)
go install github.com/zeromicro/go-zero/tools/goctl@latest

# 使用 goctl 根据 .api 文件生成代码
goctl rpc proto -src=api/hello.api -dir=app

这将根据 hello.api 文件生成相关的代码,包括 RPC 服务、请求和响应的结构体以及一些基础的框架代码。生成的代码将位于 app 文件夹下。

5. 实现服务逻辑

生成代码之后,你需要在 app 文件夹中实现具体的业务逻辑。假设我们在 hello 服务中返回一个简单的问候信息:

示例:实现 SayHello 方法

app/hello 文件夹下,找到 logic 包,并编辑其中的文件来实现具体的逻辑。

go
package logic

import (
	"context"
	"fmt"

	"my-service/app/hello/rpc/internal/svc"
	"my-service/app/hello/rpc/pb"
	"github.com/zeromicro/go-zero/core/logx"
)

type SayHelloLogic struct {
	ctx    context.Context
	svcCtx *svc.ServiceContext
	logx.Logger
}

func NewSayHelloLogic(ctx context.Context, svcCtx *svc.ServiceContext) *SayHelloLogic {
	return &SayHelloLogic{
		ctx:    ctx,
		svcCtx: svcCtx,
		Logger: logx.WithContext(ctx),
	}
}

func (l *SayHelloLogic) SayHello(in *pb.HelloRequest) (*pb.HelloResponse, error) {
	// 实现 SayHello 逻辑
	message := fmt.Sprintf("Hello, %s!", in.Name)
	return &pb.HelloResponse{
		Message: message,
	}, nil
}

6. 启动服务

一旦实现了服务逻辑,你就可以启动服务器了。go-zero 提供了一个方便的 server 启动程序来运行你的微服务。

示例:启动服务

main 文件中,启动你的服务:

go
package main

import (
	"flag"
	"fmt"
	"log"
	"my-service/app/hello/rpc"
	"my-service/app/hello/rpc/internal/config"
	"my-service/app/hello/rpc/internal/svc"
	"github.com/zeromicro/go-zero/core/conf"
	"github.com/zeromicro/go-zero/core/logx"
)

func main() {
	var configFile string
	flag.StringVar(&configFile, "f", "etc/hello.yaml", "the config file")
	flag.Parse()

	// 加载配置文件
	var c config.Config
	err := conf.LoadConfig(configFile, &c)
	if err != nil {
		log.Fatalf("Failed to load config file: %v", err)
	}

	// 初始化 ServiceContext
	ctx := svc.NewServiceContext(c)

	// 启动服务
	server := rpc.NewServer(ctx)
	err = server.Start()
	if err != nil {
		log.Fatalf("Failed to start server: %v", err)
	}
}

7. 配置文件

go-zero 框架要求配置文件来配置各类服务、日志、缓存等设置。你可以通过 YAML 格式来定义这些配置。

示例:配置文件 hello.yaml

yaml
Name: hello
Host: 0.0.0.0
Port: 5000
Log:
  Service: hello-service
  Mode: prod
  Path: /var/log
  MaxDays: 30

8. 调用服务

一旦服务启动,你可以通过 gRPC 或 HTTP 等协议来调用它。go-zero 默认支持 gRPC,如果你需要通过 HTTP 调用,可以配置 API 网关。

示例:使用 curl 调用服务

假设服务已经启动,并监听 5000 端口,你可以通过 gRPC 客户端来调用 SayHello 方法,或者通过 HTTP 进行调用。

使用 grpcurl 调用 gRPC 服务:

bash
grpcurl -d '{"name": "World"}' -plaintext localhost:5000 hello.Hello/SayHello

9. 高级特性

go-zero 提供了很多内置的功能来支持微服务的构建,以下是一些常用的功能:

  • 服务注册与发现go-zero 提供了与注册中心(如 Nacos、Consul)的集成,支持服务注册与发现。
  • API 网关go-zero 提供了 API 网关功能,可以作为微服务的入口,负责路由请求到对应的微服务。
  • 中间件:支持内置的中间件如日志、认证、限流、熔断等。
  • 负载均衡:支持 HTTP 和 gRPC 的负载均衡,确保高可用性。
  • 服务监控:集成了监控和日志,支持 Prometheus、Grafana 等工具进行性能监控。

10. 总结

go-zero 是一个功能丰富、性能优越的 Go 微服务框架,适用于构建高性能、高可用的微服务应用。它提供了包括 API 网关、服务发现、负载均衡、限流、熔断等功能,并且通过 goctl 工具生成代码,极大地简化了微服务开发过程。如果你需要快速开发高效的微服务系统,go-zero 是一个非常不错的选择。