用 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

确保动作正确执行

server.png
client.png
广告
将在 10 秒后关闭
bannerAds