Client streaming RPCs
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?