Go中的gRPC通信实现
初始化项目
# 新建文件夹
mkdir rpcpkg && cd rpcpkg
# 初始化go.mod
go mod init rpcpkg
# 添加依赖
go get google.golang.org/grpc
# 创建存放proto的包
mkdir pb
在pb下新建user.proto文件
pb/user.proto
syntax = "proto3";
package pb ;
option go_package = ".;pb";
message Req {
string kwd = 1;
int32 page = 2;
int32 pageSize=3;
}
message Resp{
int32 code =1;
string msg =2;
string data =3;
}
service BaseSer{
rpc SimpleRequest(Req) returns (Resp);
}
执行命令
生成pb.go,在pb目录下
# 生成user.pb.go
protoc --go_out=. user.proto
# 生成user_grpc.pb.go,如发生错误,请安装插件
# 安装 protoc-gen-go 和 protoc-gen-go-grpc
# go install google.golang.org/protobuf/cmd/protoc-gen-go@latest
# go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@latest
protoc --go-grpc_out=. user.proto
编写server.go
package main
import (
"context"
"fmt"
"google.golang.org/grpc"
"net"
"rpcpkg/pb"
"time"
)
// 定义类 BaseSerServer
type UserImpl struct {
pb.UnimplementedBaseSerServer
}
// SimpleRequest(context.Context, *Req) (*Resp, error)
func (u *UserImpl) SimpleRequest(ctx context.Context, req *pb.Req) (*pb.Resp, error) {
fmt.Println("SimpleRequest ctx:", ctx, "\n req:", req)
return &pb.Resp{
Code: 200,
Msg: "success" + time.Now().String(),
}, nil
}
func main() {
// 1.初始化grpc对象
svr := grpc.NewServer()
// 2.注册服务
pb.RegisterBaseSerServer(svr, new(UserImpl))
// 3.设置监听,指定ip port
lis, err := net.Listen("tcp", ":8081")
if err != nil {
fmt.Println("listen error:", err)
return
}
defer lis.Close()
err = svr.Serve(lis)
if err != nil {
panic(err)
return
}
}
编写client.go
package main
import (
"context"
"fmt"
"google.golang.org/grpc"
"google.golang.org/grpc/credentials/insecure"
"rpcpkg/pb"
"time"
)
func main() {
// 1.建立连接
conn, err := grpc.NewClient("127.0.0.1:8081",
grpc.WithTransportCredentials(insecure.NewCredentials()))
if err != nil {
fmt.Println("conn create err:", err)
return
}
defer conn.Close()
// 2.创建rpc客户端
client := pb.NewBaseSerClient(conn)
// 3.远程调用方法
for {
resp, err := client.SimpleRequest(context.Background(), &pb.Req{
Kwd: "张三",
Page: 2,
PageSize: 50,
})
if err != nil {
continue
}
fmt.Println("resp:", resp)
time.Sleep(5 * time.Second)
}
}
本文来自博客园,作者:一个小笨蛋,转载请注明原文链接:https://www.cnblogs.com/paylove/p/19290863

浙公网安备 33010602011771号