走近科学

tien的随笔

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
很久没使用grpc,命令及写法发生了变化:
mac 安装 protoc: brew install protobuf
项目:go get google.golang.org/grpc

go install google.golang.org/protobuf/cmd/protoc-gen-go@latest
go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@latest

1、生成xx.pb.go, xx_grpc.pb.go文件的两种命令:
  1、 protoc --go_out=paths=source_relative:. --go-grpc_out=paths=source_relative:. 路径/文件名.proto
  2、 protoc -I=. --go_out=paths=source_relative:. --go-grpc_out=./ --go-grpc_opt=paths=source_relative 路径/文件名.proto
2、编写自定义的grpc server处理继承时,需要引入生成的xx_grpc.pb.go 的UniplementedXxxServer
proto文件内容:
syntax = "proto3"; package protocol; option go_package = "./proto"; message RpcGetUserInfoRequest { string user_id = 1; } message RpcGerUserInfoResponse { string name = 1; string created_time = 2; } service UserService { rpc GetUserInfo(RpcGetUserInfoRequest) returns (RpcGerUserInfoResponse) {} }
自定义实现的server服务端:
package protoserver import ( "context" "param/models" "param/proto" ) type RpcUserService struct { proto.UnimplementedUserServiceServer // 引入这个文件才算继承 } // 实现方法 func (sf RpcUserService) GetUserInfo(c context.Context, request *proto.RpcGetUserInfoRequest) (*proto.RpcGerUserInfoResponse, error) { uid := request.UserId var user = new(models.User) err := sf.DB("users").Where("user_id", uid).Take(&user) response := proto.RpcGerUserInfoResponse{ Name: user.Name, CreatedTime: user.CreatedTime, } return &response, err }
main.go 处理grpc部分:
func rpcInit() {
	defer func() {
		if err := recover(); err != nil {
			fmt.Println("err rpc", err)
		}
	}()

	lis, err := net.Listen("tcp", ":8031")
	if err != nil {
		fmt.Printf("failed to listen: %v", err)
		return
	}

	rpcServer := grpc.NewServer()
	proto.RegisterUserServiceServer(rpcServer, &protoserver.RpcUserService{})

	if err = rpcServer.Serve(lis); err != nil {
		fmt.Printf("failed to serve: %v", err)
	}
}
grpc客户端部分:
package protoclient

import (
	"context"
	"fmt"
	"google.golang.org/grpc"
	"google.golang.org/grpc/credentials/insecure"
	"param/proto"
	"time"
)

func GetRpcUserInfo() {
	var uid = "cbf0lqc32urbmefv47sg"

	conn, err := grpc.Dial(":8031", grpc.WithTransportCredentials(insecure.NewCredentials()))
	if err != nil {
		fmt.Println("conn fail:", err)
		return
	}
	defer conn.Close()

	ctx, cancel := context.WithTimeout(context.Background(), time.Duration(5)*time.Second)
	defer cancel()
	requestParams := &proto.RpcGetUserInfoRequest{
		UserId: uid,
	}
	rpcClient := proto.NewUserServiceClient(conn)
	info, err := rpcClient.GetUserInfo(ctx, requestParams)

	if err != nil {
		fmt.Println("GetUserInfo fail:", err)
		return
	}

	fmt.Println(fmt.Sprintf("user.name:%s user.created_time:%s", info.Name, info.CreatedTime))
}

  





posted on 2023-07-21 14:59  _tien  阅读(20)  评论(0编辑  收藏  举报