赞
踩
gRPC(gRPC Remote Procedure Call)是一种高性能、开源的远程过程调用(RPC)框架,由Google开发并基于HTTP/2协议实现。它支持多种编程语言,并提供了强大的功能,如双向流、流控制、认证和可插拔的序列化器等。
Protocol Buffers(protobuf)是一种轻量级、高效的数据序列化框架,也由Google开发。它用于将结构化数据序列化为可传输的格式,以便在网络上传输或存储到磁盘。protobuf定义了一种简洁的语言来描述数据结构,以及生成代码来读写这些数据结构。在gRPC中,protobuf通常用来定义RPC服务接口和消息格式。
因此,gRPC和protobuf通常一起使用,gRPC用于定义远程服务接口,并使用protobuf来序列化和传输数据。这种结合使用的方式使得开发分布式系统变得更加简单和高效。
下载protobuf:gitub下载protobuf3.13.0
下载go的依赖包:
go get -u google.golang.org/protobuf
profobuf 可以看作中立语言,可以用于多个语言之间对象的传递。
下载protobuf插件:
go install google.golang.org/protobuf/cmd/protoc-gen-go@latest
这是一个protobuf的文件,
syntax = "proto3";//固定语法,使用最新版本
option go_package = ".;proto";
//定义了一个 gRPC 服务接口,名为 Greeter,其中包含一个方法 SayHello,接收一个 HelloRequest 参数,返回一个 HelloReply 参数
service Greeter {
rpc SayHello (HelloRequest) returns (HelloReply);
}
//将 sessionid放入 放入cookie中 http协议
//定义了一个消息类型 HelloRequest,其中包含一个名为 name 的字符串字段,字段标识号为 1
message HelloRequest {
string name = 1;
}
//定义了另一个消息类型 HelloReply,其中包含一个名为 message 的字符串字段,字段标识号也为 1
message HelloReply {
string message = 1;
}
使用命令生成go文件:
protoc --go_out=./ *.proto
这种模式是客户端发起一次请求,服务端返回一段连续的数据流。 典型的例子是客户端向服务端发送一个股票代码,服务端就把该股票的实时数据源源不断的返回给客户端。
package main import ( "OldPackageTest/stream_grpc_test/proto" // 导入自动生成的 gRPC 代码包 "fmt" "google.golang.org/grpc" // 导入 gRPC 库 "net" "sync" "time" ) const PORT = ":50052" // 定义服务端监听的端口号 type server struct {} // 定义一个空结构体 server,用于实现 gRPC 服务端接口 // 实现 gRPC 服务端接口中的 GetStream 方法 func (s *server) GetStream(req *proto.StreamReqData, res proto.Greeter_GetStreamServer) error { i := 0 for { i++ // 向客户端发送当前时间的 Unix 时间戳 _ = res.Send(&proto.StreamResData{ Data: fmt.Sprintf("%v", time.Now().Unix()), }) time.Sleep(time.Second) // 休眠一秒钟 if i > 10 { break } } return nil } // 实现 gRPC 服务端接口中的 PutStream 方法 func (s *server) PutStream(cliStr proto.Greeter_PutStreamServer) error { for { // 接收客户端发送的数据 if a, err := cliStr.Recv(); err != nil { fmt.Println(err) break } else { fmt.Println(a.Data) } } return nil } // 实现 gRPC 服务端接口中的 AllStream 方法 func (s *server) AllStream(allStr proto.Greeter_AllStreamServer) error { wg := sync.WaitGroup{} // 创建一个 WaitGroup 用于等待 Goroutine 结束 wg.Add(2) // 启动一个 Goroutine 用于接收客户端发送的数据并打印到控制台 go func() { defer wg.Done() for { data, _ := allStr.Recv() fmt.Println("收到客户端消息:" + data.Data) } }() // 启动一个 Goroutine 用于向客户端发送数据 go func() { defer wg.Done() for { _ = allStr.Send(&proto.StreamResData{Data: "我是服务器"}) time.Sleep(time.Second) } }() wg.Wait() // 等待所有 Goroutine 结束 return nil } func main() { // 监听指定端口 lis, err := net.Listen("tcp", PORT) if err != nil { panic(err) } s := grpc.NewServer() // 创建一个 gRPC 服务器 proto.RegisterGreeterServer(s, &server{}) // 注册服务端实现 err = s.Serve(lis) // 启动 gRPC 服务 if err != nil { panic(err) } }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。