gRPC双向流示例项目教程
项目介绍
go-grpc-bidirectional-streaming-example
是一个展示如何在Go语言中实现gRPC双向流通信的示例项目。该项目由 pahanini
开发,旨在帮助开发者理解和实践gRPC的双向流模式。通过这个示例,开发者可以学习如何在客户端和服务器之间进行双向数据流的交互。
项目快速启动
环境准备
确保你已经安装了以下工具和库:
- Go (版本1.17或更高)
- Protocol Buffers
- gRPC
克隆项目
git clone https://github.com/pahanini/go-grpc-bidirectional-streaming-example.git
cd go-grpc-bidirectional-streaming-example
运行服务器
cd src
go run server/main.go
运行客户端
go run client/main.go
示例代码
以下是服务器和客户端的部分代码示例:
服务器代码
package main
import (
"context"
"log"
"net"
pb "github.com/pahanini/go-grpc-bidirectional-streaming-example/src/proto"
"google.golang.org/grpc"
)
type server struct {
pb.UnimplementedMathServer
}
func (s *server) Max(stream pb.Math_MaxServer) error {
var max int32
for {
req, err := stream.Recv()
if err != nil {
return stream.SendAndClose(&pb.MaxResponse{Max: max})
}
if req.Number > max {
max = req.Number
}
}
}
func main() {
lis, err := net.Listen("tcp", ":50051")
if err != nil {
log.Fatalf("failed to listen: %v", err)
}
s := grpc.NewServer()
pb.RegisterMathServer(s, &server{})
if err := s.Serve(lis); err != nil {
log.Fatalf("failed to serve: %v", err)
}
}
客户端代码
package main
import (
"context"
"io"
"log"
"time"
pb "github.com/pahanini/go-grpc-bidirectional-streaming-example/src/proto"
"google.golang.org/grpc"
)
func main() {
conn, err := grpc.Dial("localhost:50051", grpc.WithInsecure())
if err != nil {
log.Fatalf("did not connect: %v", err)
}
defer conn.Close()
c := pb.NewMathClient(conn)
stream, err := c.Max(context.Background())
if err != nil {
log.Fatalf("error creating stream: %v", err)
}
waitc := make(chan struct{})
go func() {
for {
res, err := stream.Recv()
if err == io.EOF {
close(waitc)
return
}
if err != nil {
log.Fatalf("error receiving response: %v", err)
}
log.Printf("New max received: %d", res.Max)
}
}()
numbers := []int32{1, 5, 3, 6, 2, 20, 5, 100, 2, 1, 5, 3, 6, 2, 20, 5, 100}
for _, number := range numbers {
if err := stream.Send(&pb.MaxRequest{Number: number}); err != nil {
log.Fatalf("error sending request: %v", err)
}
time.Sleep(time.Second)
}
stream.CloseSend()
<-waitc
}
应用案例和最佳实践
应用案例
双向流模式在以下场景中非常有用:
- 实时通信:如在线游戏、实时聊天应用。
- 数据同步:如分布式系统中的数据同步。
- 流处理:如实时数据分析和处理。