grpc-Tutorial.md

gRPC 教程

本教程针对希望学习如何使用 gRPC 构建和部署高效、可扩展的微服务的开发者。通过阅读本教程,了解 gRPC 的基本概念、如何在 Go 语言中实现 gRPC 服务,以及如何进行客户端和服务器之间的通信。寻找一个高性能、跨语言、开放源代码的远程过程调用 (RPC) 框架,gRPC 是一个理想的选择。

教程概览

在本教程中,学习如何:

  • 设计和定义 gRPC 服务
  • 在 Go 语言中实现 gRPC 服务器和客户端
  • 使用 Protocol Buffers 进行数据序列化

在开始之前

确保安装了以下必备软件和工具:

  • Go 语言环境(至少 Go 1.15)
  • Protocol Buffers 编译器 (protoc)
  • gRPC Go 语言库

以下知识或经验:

  • 基本的 Go 语言编程知识
  • 对 RPC 和客户端-服务器架构有基本的了解

第一部分:定义和实现 gRPC 服务 {id=”grpc_1”}

学习如何定义 gRPC 服务和在 Go 中实现这些服务。

  1. 定义服务和消息格式。在 service.proto 文件中编写以下内容:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    syntax = "proto3";

    package tutorial;

    // 定义 Greeter 服务
    service Greeter {
    // 发送问候
    rpc SayHello (HelloRequest) returns (HelloReply) {}
    }

    // HelloRequest 消息定义
    message HelloRequest {
    string name = 1;
    }

    // HelloReply 消息定义
    message HelloReply {
    string message = 1;
    }
  2. 使用 Protocol Buffers 编译器生成 Go 代码。在终端执行:

    1
    protoc --go_out=. --go-grpc_out=. service.proto
  3. 实现 gRPC 服务器。创建 server.go 并添加以下代码:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    package main

    import (
    "context"
    "log"
    "net"

    "google.golang.org/grpc"
    pb "path/to/your/service"
    )

    type server struct {
    pb.UnimplementedGreeterServer
    }

    func (s *server) SayHello(ctx context.Context, in *pb.HelloRequest) (*pb.HelloReply, error) {
    return &pb.HelloReply{Message: "Hello " + in.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, &server{})
    if err := s.Serve(lis); err != nil {
    log.Fatalf("failed to serve: %v", err)
    }
    }

第二部分:创建 gRPC 客户端

学习如何创建 gRPC 客户端来调用服务器。

  1. 创建 client.go 并添加以下代码:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    package main

    import (
    "context"
    "log"
    "time"

    "google.golang.org/grpc"
    pb "path/to/your/service"
    )

    func main() {
    conn, err := grpc.Dial("localhost:50051", grpc.WithInsecure(), grpc.WithBlock())
    if err != nil {
    log.Fatalf("did not connect: %v", err)
    }
    defer conn.Close()
    c := pb.NewGreeterClient(conn)

    name := "world"
    ctx, cancel := context.WithTimeout(context.Background(), time.Second)
    defer cancel()
    r, err := c.SayHello(ctx, &pb.HelloRequest{Name: name})
    if err != nil {
    log.Fatalf("could not greet: %v", err)
    }
    log.Printf("Greeting: %s", r.Message)
    }
  2. 运行服务器和客户端,验证通信是否成功。

所学到的内容 {id=”what-learned”}

通过完成这个教程,已经成功地定义了一个简单的 gRPC 服务,实现了服务端和客户端,并在本地进行了测试。还学习了如何使用 Protocol Buffers 来定义数据格式和服务接口。

- [gRPC 官方文档](https://grpc.io/docs/) - [Go 语言官方文档](https://golang.org/doc/)

grpc-Tutorial.md
https://abrance.github.io/2024/09/04/mdstorage/project/sr/golang技术分享/grpc-Tutorial/
Author
xiaoy
Posted on
September 4, 2024
Licensed under