概述
grpc学习。
正文
安装
安装protoc
安装 protoc,protoc是protobuf编译器,可以将源文件xxx.proto 编译成开发语言文件 ,例如xxx.pb.go
下载 https://github.com/protocolbuffers/protobuf/releases/download/v3.20.0/protoc-3.20.0-win64.zip
- 解压protoc-3.20.0-win64.zip
- 将 protoc-3.20.0-win64.zip/bin设置为环境变量
安装protoc-gen-go-grpc 和 protoc-gen-go
因为protoc没有内置go生成器,想实现.proto”..go的转换的话还需要安装protobuf的golang编译器插件protoc-gen-go,用于生成go文件
1 2
| go install google.golang.org/protobuf/cmd/protoc-gen-go@latest go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@latest
|
验证 protoc-gen-go-grpc 和 protoc-gen-go
1 2
| protoc-gen-go-grpc --version protoc-gen-go --version
|
grpc使用
定义proto文件xxproject/proto/message.proto
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| syntax = "proto3"
option go_package = "../pb;pb";
message MessageResponse { string responseSomething = 1; }
message MessageRequest { string saySomething = 1; }
service MessageSender { rpc Send(MessageRequest) returns (MessageResponse) {} }
|
根据proto文件生成go代码文件, xxproject/proto/
1 2 3 4 5
|
protoc --go_out=. message.proto protoc --go-grpc_out=. message.proto
|
server端响应实现(实现proto中的方法) xxproject/serviceImpl/MessageSenderServerImpl.go
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| package serviceImpl
import ( "context" "log" "xxproject/pb" )
type MessageSenderServerImpl struct { *pb.UnimplementedMessageSenderServer }
func (MessageSenderServerImpl) Send(context context.Context, request *pb.MessageRequest) (*pb.MessageResponse, error) { log.Println("receive message:", request.SaySomething) resp := &pb.MessageResponse{} resp.ResponseSomething = "this is grpc server, roger that" return resp, nil }
|
server端启动gRPC服务,xxproject/server/server.go
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| package main
import ( "google.golang.org/grpc" "log" "net" "xxproject/pb" "xxproject/serviceImpl" )
func main() { srv := grpc.NewServer() pb.RegisterMessageSenderServer(srv, serviceImpl.MessageSenderServerImpl{}) listener, err := net.Listen("tcp", ":8002") if err != nil { log.Fatalf("failed to listen: %v", err) }
err = srv.Serve(listener) if err != nil { log.Fatalf("failed to serve: %v", err) } }
|
client端发起请求, xxproject/client/client.go
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| package main
import ( "context" "google.golang.org/grpc" "log" "xxproject/pb" )
func main() { conn, err := grpc.Dial("127.0.0.1:8002", grpc.WithInsecure()) if err != nil { log.Fatalf("did not connect: %v", err) } defer conn.Close() client := pb.NewMessageSenderClient(conn) resp, err := client.Send(context.Background(), &pb.MessageRequest{ SaySomething: "hello world", }) if err != nil { log.Fatalf("could not greet: %v", err) } log.Println("receive message:", resp.GetResponseSomething())
}
|