go grpc protobuf 使用

 

1.下载protoc https://github.com/protocolbuffers/protobuf/releases,解压出 protoc.exe  放到到GOROOT目录下

 

 

 

 

 

 

 

 

2.下载   protoc-gen-go 文件

go install github.com/golang/protobuf/protoc-gen-go@latest

会在<GOPATH>/bin下生成protoc-gen-go.exe文件,

 

 

 3.下载依赖包


# 安装 golang 的proto工具包
# go get -u github.com/golang/protobuf/proto
# 安装 goalng 的proto编译支持
# go get -u google.golang.org/protobuf
# 安装 GRPC 包 # go get -u google.golang.org/grpc

4.编写proto文件

syntax = "proto3";
package services;
option go_package = "./;proto";
service Greeter {
  rpc SayHello (HelloRequest) returns (HelloReply);
}
message HelloRequest {
  string name = 1;
}
message HelloReply {
  string message = 1;
}

5.生成 pd.go 文件

cd到proto目录下
命令:protoc -I . hello.proto   --go_out=plugins=grpc:.
命令解释:
protoc -I .:在当前路径下寻找hello.proto文件
--go_out=plugins=grpc:.  :生成go语言的proto文件放在当前路径下

 6.server 和client 通信

  

├─client
│      client.go
│
├─proto
│      hello.pb.go
│      hello.proto
│
└─server
        server.go

 7.server.go  服务端文件

package main

import (
	"context"
	"net"
	"test/grpc/proto"

	"google.golang.org/grpc"
)

type Server struct{}

// 业务逻辑
func (s *Server) SayHello(ctx context.Context, request *proto.HelloRequest) (*proto.HelloReply, error) {
	res := &proto.HelloReply{
		Message: "hello " + request.Name,
	}
	return res, nil
}

// 启动rpc的server服务
func start() {
	// 1.实例化server
	g := grpc.NewServer()
	// 2.注册逻辑到server中
	proto.RegisterGreeterServer(g, &Server{})
	// 3.启动server
	lis, err := net.Listen("tcp", "127.0.0.1:8081")
	if err != nil {
		panic("监听错误:" + err.Error())
	}

	err = g.Serve(lis)
	if err != nil {
		panic("启动错误:" + err.Error())
	}
}
func main() {
	start()
}

  8.client.go 客户端文件

package main

import (
	"context"
	"fmt"
	"test/grpc/proto"

	"google.golang.org/grpc"
)

// rpc调用
func clientRpc(body map[string]string) (res *proto.HelloReply, err error) {
	name := body["name"]
	conn, err := grpc.Dial("127.0.0.1:8081", grpc.WithInsecure())
	if err != nil {
		return nil, err
	}
	defer conn.Close()
	rpc := proto.NewGreeterClient(conn)
	response, err := rpc.SayHello(context.Background(), &proto.HelloRequest{Name: name})
	if err != nil {
		return nil, err
	}
	return response, nil
}

// 业务代码
func start() {
	body := make(map[string]string)
	body["name"] = "jeff"
	response, err := clientRpc(body)
	if err != nil {
		fmt.Println("rpc调用失败:", err)
		return
	}
	fmt.Println(response.Message)
}
func main() {
	start()
}

  

 

  

posted on 2022-07-15 15:17  running-fly  阅读(208)  评论(0编辑  收藏  举报

导航