Client streaming RPCs

2 phút đọcSeries: Tìm hiểu gRPC - Qua các ví dụ bằng Golang1 lượt xem

Unary RPCs là phương thức gọi function từ xa trong đó client viết một chuỗi tin nhắn và gửi chúng đến máy chủ, một lần nữa chúng ta sử dụng stream. Khi client viết xong tin nhắn, nó sẽ đợi server đọc chúng và trả về phản hồi. Một lần nữa gRPC đảm bảo thứ tự tin nhắn trong một lệnh RPC call riêng lẻ.

Tạo 1 file client_stream.go tại server , trong file này , chúng ta implement function SayHelloClientStreaming được define trong file proto

package main

import (
    pb "greet/proto"
    "io"
    "log"
)

func (s *Server) SayHelloClientStreaming(stream pb.GreetService_SayHelloClientStreamingServer) error {
    for {
       msg, err := stream.Recv()
       if err == io.EOF {
          return stream.SendAndClose(&pb.HelloResponse{Msg: "Receive all"})
       }
       if err != nil {
          log.Fatalf("Unary calling error %v", err)
       }
       log.Printf("Receive %s", msg)
    }
    return nil
}

Tại client , chúng ta gọi đến server đang chạy ở port 8080 bằng cách tạo 1 file main.go tại folder client với nội dung:

package main

import (
    "context"
    "google.golang.org/grpc"
    "google.golang.org/grpc/credentials/insecure"
    pb "greet/proto"
    "io"
    "log"
    "time"
)

const port = "8080"

func main() {
    conn, err := grpc.Dial("localhost:"+port, grpc.WithTransportCredentials(insecure.NewCredentials()))
    if err != nil {
       log.Fatalf("Cannot connect with error %v", err)
    }
    defer conn.Close()

    client := pb.NewGreetServiceClient(conn)

    ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
    defer cancel()

    //ClientStreaming
    stream, err := client.SayHelloClientStreaming(ctx)
    greets := []string{"Hello", "From", "Server"}
    for _, greet := range greets {
       stream.Send(&pb.HelloRequest{Msg: greet})
       time.Sleep(time.Second)
    }
    res, err := stream.CloseAndRecv()
    if err != nil {
       log.Fatalf("Unary calling error %v", err)
    }
    log.Printf("End Stream with result %s", res.Msg)
}

Chạy file main.go trên và quan sát kết quả

Bạn thấy bài này thế nào?