Golang环境下Protobuf和gRPC安装配置及使用
Protobuf简介
Protobuf 是Protocol Buffer 的简称,它是Google公司于2008年开源的一种高效的平台无关、语言无关、可扩展的数据格式(协议 )【与JSON 、XML 数据格式一样用于数据传输时使用】,目前Protobuf作为接口规范的描述语言,可以作为Go语言RPC调用的协议。
Protobuf下载安装
需要先下载protoc执行器
1、到 https://github.com/protocolbuffers/protobuf/releases 分别下载Windows和Linux环境的执行器 2、选择最新版本的protoc下载 3、将下载的文件解压,将包中bin目录下的protoc.exe放到GOPATH/bin下。
Protobuf下Go、GRPC插件的安装
go install google.golang.org/protobuf/cmd/protoc-gen-go@v1.26
go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@v1.1
至此使用Protobuf的准备工作就做完了。
Protobuf结合Grpc的使用
项目结构
├─practice
│ │ go.mod
│ │ go.sum
│ │
│ ├─client
│ │ ├─sample_client
│ │ │ client.go
│ │
│ ├─proto
│ │ │ helloworld.proto
│ │
│ └─server
│ ├─simple_server
│ │ server.go
│
1、编辑helloword.proto
syntax = "proto3";
package proto; // 包名
option go_package = '/grpc/service'; // 指定生成的go代码所存放的路径,不用提前创建
service Greeter {
rpc SayHello (HelloRequest) returns (HelloReply) {}
}
message HelloRequest {
string name = 1;
}
message HelloReply {
string message = 1;
}
2、将helloword.proto生成go代码
cd proto
protoc --go_out=. --go-grpc_out=. *.proto
3、生成后的目录结构
├─practice
│ │ go.mod
│ │ go.sum
│ │
│ ├─client
│ │ ├─sample_client
│ │ │ client.go
│ │
│ ├─proto
│ │ │ helloworld.proto
│ │ │
│ │ └─grpc
│ │ └─service
│ │ helloworld.pb.go
│ │ helloworld_grpc.pb.go
│ │
│ └─server
│ ├─simple_server
│ │ server.go
│
4、编辑client.go
package main
import (
"context"
"flag"
"google.golang.org/grpc"
"log"
pb "practice/proto/grpc/service"
"time"
)
const (
defaultName = "world"
)
var (
addr = flag.String("addr", "localhost:50051", "the address to connect to")
name = flag.String("name", defaultName, "Name to greet")
)
func main() {
flag.Parse()
// 建立连接
conn, err := grpc.Dial(*addr, grpc.WithInsecure())
if err != nil {
log.Fatalf("did not connect: %v", err)
}
defer conn.Close()
// 实例化client
c := pb.NewGreeterClient(conn)
// 调用rpc,等待同步响应
ctx, cancel := context.WithTimeout(context.Background(), time.Second)
defer cancel()
r, err := c.SayHello(ctx, &pb.HelloRequest{Name: *name})
if err != nil {
log.Fatalf("could not greet: %v", err)
}
log.Printf("Greeting: %s", r.GetMessage())
}
5、server.go
package main
import (
"context"
"flag"
"fmt"
"google.golang.org/grpc"
"log"
"net"
pb "practice/proto/grpc/service"
)
var (
port = flag.Int("port", 50051, "The server port")
)
// server is used to implement helloworld.GreeterServer.
type server struct {
pb.UnimplementedGreeterServer
}
func (s *server) SayHello(ctx context.Context, in *pb.HelloRequest) (*pb.HelloReply, error) {
return &pb.HelloReply{Message: "Hello" + in.GetName()}, nil
}
func (s *server) SayHelloAgain(ctx context.Context, in *pb.HelloRequest) (*pb.HelloReply, error) {
return &pb.HelloReply{Message: "Hello Again " + in.GetName()}, nil
}
func main() {
flag.Parse()
// 监听端口
lis, err := net.Listen("tcp", fmt.Sprintf("localhost:%d", *port))
if err != nil {
log.Fatalf("failed to listen: %v", err)
}
// 实例化server
s := grpc.NewServer()
pb.RegisterGreeterServer(s, &server{})
log.Printf("server listening at %v", lis.Addr())
if err := s.Serve(lis); err != nil {
log.Fatalf("failed to serve: %v", err)
}
}
6、运行
启动服务端
go run server/simple_server/server.go
2021/11/29 19:22:27 server listening at 127.0.0.1:50051
启动客户端
go run client/sample_client/client.go --name cui
2021/11/29 19:23:25 Greeting: Hellocui
|