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)
	}
}
posted @ 2025-11-30 23:42  一个小笨蛋  阅读(7)  评论(0)    收藏  举报