Server streaming RPCs

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

Server streaming RPCs là phương thức gọi function từ xa trong đó client gửi yêu cầu đến server và nhận được stream để đọc lại một chuỗi tin nhắn. Client  đọc từ luồng trả về cho đến khi không còn tin nhắn nào nữa. gRPC đảm bảo thứ tự tin nhắn trong một RPC call riêng lẻ.

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

package main

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

func (s *Server) SayHelloServerStreaming(in *pb.HelloRequest, stream pb.GreetService_SayHelloServerStreamingServer) error {
    log.Printf("Receive Message: %s", in.Msg)
    greets := []string{"Hello", "From", "Server"}
    for _, greet := range greets {
       stream.Send(&pb.HelloResponse{Msg: greet})
       time.Sleep(time.Second)
    }
    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()

    //ServerStreaming
    stream, err := client.SayHelloServerStreaming(ctx, &pb.HelloRequest{Msg: "Hello From Client"})
    for {
       msg, err := stream.Recv()
       if err == io.EOF {
          break
       }
       if err != nil {
          log.Fatalf("Unary calling error %v", err)
       }
       log.Printf("Receive %s", 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?