【GO开发工程师】grpc入门#golang
推荐个人主页:席万里的个人空间
文章目录
1、什么是grpc和protobuf?
下载protobuf:gitub下载protobuf3.13.0
下载go的依赖包:
go get -u google.golang.org/protobuf
2、protobuf
下载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
3、grpc
3.1、流模式
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)
}
}