用 Go 语言快速尝试 gRPC 的方法
摘要
在本地测试Go语言gRPC的客户端⇔服务器通信。
1. 安装准备
– 安装protoc(请参考此处)
go install google.golang.org/protobuf/cmd/protoc-gen-go@latest
go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@latest
2. 创建项目和各个目录
mkdir example
mkdir -p example/proto
mkdir -p example/grpc_sample
mkdir -p example/server
mkdir -p example/client
3. 创建go.mod文件
cd example
go mod init github.com/example
创建2个proto文件
cd proto
将以下的sample.proto保存到proto目录中。
syntax = "proto3";
package sample;
option go_package = "../grpc_sample";
message Message {
string body = 1;
}
service SampleService {
rpc GetData(Message) returns (Message) {}
}
从proto文件生成protoc-gen-go/protoc-gen-go-grpc文件。
protoc --go_out=. --go-grpc_out=require_unimplemented_servers=false:. sample.proto
创建服务器程序
cd ../server
请将以下的main.go保存到server目录中。
package main
import (
"github.com/example/grpc_sample"
"golang.org/x/net/context"
"google.golang.org/grpc"
"log"
"net"
)
func main() {
log.Print("main start")
// 9000番ポートでクライアントからのリクエストを受け付けるようにする
listen, err := net.Listen("tcp", ":9000")
if err != nil {
log.Fatalf("failed to listen: %v", err)
}
grpcServer := grpc.NewServer()
// Sample構造体のアドレスを渡すことで、クライアントからGetDataリクエストされると
// GetDataメソッドが呼ばれるようになる
grpc_sample.RegisterSampleServiceServer(grpcServer, &Sample{})
// 以下でリッスンし続ける
if err := grpcServer.Serve(listen); err != nil {
log.Fatalf("failed to serve: %s", err)
}
log.Print("main end")
}
type Sample struct {
name string
}
func (s *Sample) GetData(
ctx context.Context,
message *grpc_sample.Message,
) (*grpc_sample.Message, error) {
log.Print(message.Body)
return &grpc_sample.Message{Body: "レスポンスデータ"}, nil
}
编写客户端程序
cd ../client
将以下的main.go保存到client目录中。
package main
import (
"github.com/example/grpc_sample"
"golang.org/x/net/context"
"google.golang.org/grpc"
"log"
)
func main() {
var conn *grpc.ClientConn
conn, err := grpc.Dial(":9000", grpc.WithInsecure())
if err != nil {
log.Fatalf("did not connect: %s", err)
}
c := grpc_sample.NewSampleServiceClient(conn)
response, err := c.GetData(context.Background(), &grpc_sample.Message{Body: "送信データ"})
if err != nil {
log.Fatalf("Error when calling SayHello: %s", err)
}
log.Print(response.Body)
defer conn.Close()
}
下载软件包
cd ../
go mod tidy
确保动作正确执行

