返回

快速上手 Go-Doudou 开发 gRPC 服务

后端

引言

Go-Doudou 是一个功能强大的 Go 语言框架,它允许开发者轻松构建和管理分布式系统。随着 v2 版本的发布,Go-Doudou 扩展了对 gRPC(Google Remote Procedure Call)的支持,使开发者能够构建高效且可扩展的微服务。本文将指导您快速上手 Go-Doudou,开发一个完整的 gRPC 服务。

gRPC 服务开发流程

Go-Doudou 中 gRPC 服务的开发流程与其他服务类似:

  1. svc.go 文件中定义 gRPC 服务接口。
  2. 运行 go-doudou 代码生成命令以生成 gRPC 代码。
  3. 实现 gRPC 服务方法并进行注册。

定义 gRPC 服务接口

svc.go 文件中,定义一个 gRPC 服务接口,该接口包含您希望公开的方法。例如:

type GreeterService interface {
    SayHello(ctx context.Context, req *pb.HelloRequest) (*pb.HelloResponse, error)
}

其中 pb.HelloRequestpb.HelloResponse 是 gRPC 协议缓冲区消息,用于定义请求和响应的格式。

生成 gRPC 代码

使用 go-doudou 代码生成命令生成 gRPC 代码:

go-doudou codegen \
--output=pb \
--protoc=/usr/local/bin/protoc \
--proto-path=./protos \
--service-proto=./protos/greeter.proto

这将生成 pb 目录,其中包含 gRPC 代码和协议缓冲区消息定义。

实现和注册 gRPC 服务

impl.go 文件中,实现 gRPC 服务接口的方法:

type GreeterServiceImpl struct{}

func (s *GreeterServiceImpl) SayHello(ctx context.Context, req *pb.HelloRequest) (*pb.HelloResponse, error) {
    return &pb.HelloResponse{Message: "Hello, " + req.Name}, nil
}

// RegisterGreeterService registers the GreeterService implementation with the gRPC server.
func RegisterGreeterService(server *grpc.Server) {
    pb.RegisterGreeterServer(server, &GreeterServiceImpl{})
}

然后,在 main.go 文件中注册 gRPC 服务:

func main() {
    server := grpc.NewServer()
    RegisterGreeterService(server)
    // Start the gRPC server
    server.Serve(lis)
}

示例代码

以下是一个完整的示例代码,演示了如何使用 Go-Doudou 开发一个简单的 gRPC 服务:

// svc.go
type GreeterService interface {
    SayHello(ctx context.Context, req *pb.HelloRequest) (*pb.HelloResponse, error)
}

// impl.go
type GreeterServiceImpl struct{}

func (s *GreeterServiceImpl) SayHello(ctx context.Context, req *pb.HelloRequest) (*pb.HelloResponse, error) {
    return &pb.HelloResponse{Message: "Hello, " + req.Name}, nil
}

// main.go
package main

import (
    "context"
    "net"
    "log"

    pb "github.com/myorg/myrepo/protos/greeter"
    "github.com/doudou/go-doudou/pkg/grpc"
    "google.golang.org/grpc"
)

type GreeterService interface {
    SayHello(ctx context.Context, req *pb.HelloRequest) (*pb.HelloResponse, error)
}

type GreeterServiceImpl struct{}

func (s *GreeterServiceImpl) SayHello(ctx context.Context, req *pb.HelloRequest) (*pb.HelloResponse, error) {
    return &pb.HelloResponse{Message: "Hello, " + req.Name}, nil
}

func main() {
    lis, err := net.Listen("tcp", ":50051")
    if err != nil {
        log.Fatalf("failed to listen: %v", err)
    }
    s := grpc.NewServer()
    pb.RegisterGreeterServer(s, &GreeterServiceImpl{})
    if err := s.Serve(lis); err != nil {
        log.Fatalf("failed to serve: %v", err)
    }
}

SEO 关键词:

SEO 文章