GRPC流模式
简单模式
又称为一元 RPC,类似于常规的 http 请求,客户端发送请求,服务端响应请求
服务端流模式
stream.proto
syntax = "proto3";
option go_package=".;proto";
service Greeter {
rpc GetStream(StreamReqData) returns (stream StreamResData) {} // 服务端流模式
rpc PutStream(stream StreamReqData) returns (StreamResData) {} // 客户端流模式
rpc AllStream(stream StreamReqData) returns (stream StreamResData) {} // 双向流模式
}
message StreamReqData {
string data = 1;
}
message StreamResData {
string data = 1;
}
//protoc --go_out=. --go_opt=paths=source_relative \
//--go-grpc_out=. --go-grpc_opt=paths=source_relative \
//stream.proto
server.go
type server struct { proto.UnimplementedGreeterServer } //GetStream 服务端流模式实现 func (s *server) GetStream(data *proto.StreamReqData, streamServer proto.Greeter_GetStreamServer) error { for i := 0; i < 10; i++ { _ = streamServer.Send(&proto.StreamResData{ Data: data.Data+strconv.Itoa(i), }) time.Sleep(time.Second * 2) } return nil } func main() { lis,err := net.Listen("tcp",PORT) if err != nil { panic(err) } s := grpc.NewServer() proto.RegisterGreeterServer(s,&server{}) err = s.Serve(lis) if err != nil { log.Fatalf("failed to serve: %v", err) } }
client.go
func main() { conn,err := grpc.Dial(":50052",grpc.WithInsecure()) if err != nil { panic(err) } defer conn.Close() c := proto.NewGreeterClient(conn) res,_ := c.GetStream(context.Background(),&proto.StreamReqData{ Data: "看看", }) for { a,err := res.Recv() if err != nil { panic(err) } fmt.Println(a) } }
客户端流模式
server.go
// PutStream 客户端流模式 func (s *server) PutStream(streamServer proto.Greeter_PutStreamServer) error { for{ if a,err := streamServer.Recv(); err != nil { fmt.Println(err.Error()) break } else { fmt.Println(a) } } return nil }
client.go
func main() { conn,err := grpc.Dial(":50052",grpc.WithInsecure()) if err != nil { panic(err) } defer conn.Close() c := proto.NewGreeterClient(conn) res,_ := c.PutStream(context.Background()) for i := 0; i < 10; i++ { res.Send(&proto.StreamReqData{ Data: "我来自客户端"+strconv.Itoa(i), }) time.Sleep(time.Second) } }
双向流模式
serer.go
func (s *server) AllStream(streamServer proto.Greeter_AllStreamServer) error { wg := sync.WaitGroup{} wg.Add(2) // 收客户端消息 go func() { for { data,_ := streamServer.Recv() if data != nil { fmt.Println(data.Data) } } wg.Done() }() // 发客户端消息 go func() { for i := 0; i < 10; i++ { _ = streamServer.Send(&proto.StreamResData{ Data: "我来自服务端" + strconv.Itoa(i), }) time.Sleep(time.Second) } wg.Done() }() wg.Wait() return nil }
client.go
func main() { conn,err := grpc.Dial(":50052",grpc.WithInsecure()) if err != nil { panic(err) } defer conn.Close() c := proto.NewGreeterClient(conn) res,_ := c.AllStream(context.Background()) wg := sync.WaitGroup{} wg.Add(2) // 收服务端消息 go func() { wg.Done() for { data,_ := res.Recv() if data != nil { fmt.Println(data.Data) } } }() // 发服务端消息 go func() { for i := 0; i < 10; i++ { _ = res.Send(&proto.StreamReqData{ Data: "我来自客户端" + strconv.Itoa(i), }) time.Sleep(time.Second) } wg.Done() }() wg.Wait() }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器