gRPC的stream介绍
gRPC的stream介绍
gRPC为什么提供 steam功能?
-
在以下场景使用unary rpc 可能有如下问题
- 数据表过大可能造成熟瞬时的压力
- 服务需要全部数据接收完毕,才能正确回调响应,进行业务处理,不能客户端边发送,服务端边接受。
-
stream rpc 适用于,大规模数据传递,和实时场景。
gRPC的stream的分类
- stream 分类
一元RPC
- 定义形式
rpc SayHello(HelloRequest) returns (HelloResponse);
- 描述
1、客户端发送一个请求给服务端,
2、得到服务端的一个响应,
3、就像正常的函数调用
- client
package main
import (
"context"
pb "d-grpc/lib/proto/hellowrold"
"google.golang.org/grpc"
"log"
)
const (
address = "localhost:50051"
)
func main() {
// 链接服务
conn, err := grpc.Dial(address, grpc.WithInsecure(), grpc.WithBlock())
if err != nil {
log.Fatalf("dit not connetc:%v", err)
return
}
defer conn.Close()
// 创建一个客户端
c := pb.NewGreeterClient(conn)
r, err := c.SayHello(context.Background(), &pb.HelloRequest{
Name: "world"})
if err != nil {
log.Fatalf("could not greet: %v", err)
}
// 打印响应信息
log.Printf("Greeting: %s", r.GetMessage())
}
- server
package main
import (
"context"
pb "d-grpc/lib/proto/hellowrold"
"google.golang.org/grpc"
"log"
"net"
)
const (
port = ":50051"
)
//
func main() {
lis, err := net.Listen("tcp", port)
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)
}
}
type server struct {
// 这个结构体实现了GreeterServer接口,避免service未实现
pb.UnimplementedGreeterServer
}
func (*server) SayHello(ctx context.Context, in *pb.HelloRequest) (*pb.HelloReply, error) {
log.Printf("Received: %v", in.GetName(