gRPC双向流示例项目教程

gRPC双向流示例项目教程

go-grpc-bidirectional-streaming-examplegRPC bidirectional streaming example written in golang项目地址:https://gitcode.com/gh_mirrors/go/go-grpc-bidirectional-streaming-example

项目介绍

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
}

应用案例和最佳实践

应用案例

双向流模式在以下场景中非常有用:

  • 实时通信:如在线游戏、实时聊天应用。
  • 数据同步:如分布式系统中的数据同步。
  • 流处理:如实时数据分析和处理。

go-grpc-bidirectional-streaming-examplegRPC bidirectional streaming example written in golang项目地址:https://gitcode.com/gh_mirrors/go/go-grpc-bidirectional-streaming-example

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

宫萍润

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值