安装
安装 Protocol Buffers
https://github.com/protocolbuffers/protobuf/releases
安装 gRPC 库
go get google.golang.org/grpc
安装 protocol 编译器
go install google.golang.org/protobuf/cmd/protoc-gen-go@latest
go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@latest
使用
编写 .proto 文件
proto/hello.proto
syntax = "proto3";
// 生成文件目录,生成文件的包名
option go_package = ".;service";
service Greeter {
rpc SayHello(HelloRequest) returns (HelloResponse) {}
}
// 1表示在message中的位置
message HelloRequest {
string name = 1;
}
message HelloResponse {
string message = 1;
}
生成 .go 文件
protoc --go_out=. hello.proto
protoc --go-grpc_out=. hello.proto
编写 server 端
package main
import (
"context"
pb "gdemo/server/proto"
"google.golang.org/grpc"
"log"
"net"
)
type server struct {
pb.UnimplementedGreeterServer
}
func (s *server) SayHello(ctx context.Context, in *pb.HelloRequest) (*pb.HelloResponse, error) {
return &pb.HelloResponse{Message: "Hello " + in.Name}, nil
}
func main() {
// 监听端口
ln, err := net.Listen("tcp", ":8080")
if err != nil {
log.Fatalf("failed to listen: %v", err)
}
// 创建grpc服务
grpcServer := grpc.NewServer()
// 在grpc服务中注册
pb.RegisterGreeterServer(grpcServer, &server{})
// 启动
err = grpcServer.Serve(ln)
if err != nil {
log.Fatalf("failed to serve: %v", err)
}
}
编写 client 端
package main
import (
"context"
"fmt"
pb "gdemo/client/proto"
"google.golang.org/grpc"
"google.golang.org/grpc/credentials/insecure"
"log"
)
func main() {
// 连接服务端,此处禁用安全传输,没有加密和验证
conn, err := grpc.NewClient(
"127.0.0.1:8080",
grpc.WithTransportCredentials(insecure.NewCredentials()),
)
if err != nil {
log.Fatal(err)
}
defer conn.Close()
// 连接
client := pb.NewGreeterClient(conn)
// 执行rpc调用
resp, err := client.SayHello(context.Background(), &pb.HelloRequest{Name: "world"})
fmt.Println(resp, err)
}
- Prev: golang socket
- Next: ja-netfilter