LoginSignup
1
2

More than 3 years have passed since last update.

gRPC の使い方 (Go)

Last updated at Posted at 2020-02-07

参考ページ
Go Quick Start

設定ファイル、サーバープログラム、クライアントプログラムの3つが必要です。

.
├── greeter_client
│   └── main.go
├── greeter_server
│   └── main.go
└── helloworld
    └── helloworld.proto

設定ファイル

helloworld/helloworld.proto
こちらと同じ
gRPC の使い方 (python)

サーバープログラム

greeter_server/main.go

package main

import (
    "context"
    "log"
    "net"

    "google.golang.org/grpc"
    pb "../helloworld"
)

const (
    port = ":50051"
)

// server is used to implement helloworld.GreeterServer.
type server struct {
    pb.UnimplementedGreeterServer
}

// SayHello implements helloworld.GreeterServer
func (s *server) SayHello(ctx context.Context, in *pb.HelloRequest) (*pb.HelloReply, error) {
    log.Printf("SayHello Received: %v", in.GetName())
    return &pb.HelloReply{Message: "Test Hello " + in.GetName()}, nil
}

func (s *server) SayHello2(ctx context.Context, in *pb.HelloRequest) (*pb.HelloReply, error) {
    log.Printf("SayHello2 Received: %v", in.GetName())
        return &pb.HelloReply{Message: "Test2 Hello again " + in.GetName()}, nil
}

func main() {
    lis, err := net.Listen("tcp", port)
    if err != nil {
        log.Fatalf("failed to listen: %v", err)
    }
    s := grpc.NewServer()
    pb.RegisterGreeterServer(s, &server{})
    if err := s.Serve(lis); err != nil {
        log.Fatalf("failed to serve: %v", err)
    }
}

クライアントプログラム

greeter_client/main.go

package main

import (
    "context"
    "log"
    "os"
    "time"

    "google.golang.org/grpc"
    pb "../helloworld"
)

const (
    address     = "localhost:50051"
    defaultName = "Tom"
)

func main() {
    // Set up a connection to the server.
    conn, err := grpc.Dial(address, grpc.WithInsecure(), grpc.WithBlock())
    if err != nil {
        log.Fatalf("did not connect: %v", err)
    }
    defer conn.Close()
    c := pb.NewGreeterClient(conn)

    // Contact the server and print out its response.
    name := defaultName
    if len(os.Args) > 1 {
        name = os.Args[1]
    }
    ctx, cancel := context.WithTimeout(context.Background(), time.Second)
    defer cancel()
    name = "John"
    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())


    name = "Tom"
    r, err = c.SayHello2(ctx, &pb.HelloRequest{Name: name})
    if err != nil {
            log.Fatalf("could not greet: %v", err)
    }
    log.Printf("Greeting: %s", r.GetMessage())
}

gRPC のコードを作成します。

スクリプト

protoc -I helloworld/ helloworld/helloworld.proto --go_out=plugins=grpc:helloworld

実行後

$ tree
.
├── greeter_client
│   └── main.go
├── greeter_server
│   └── main.go
└── helloworld
    ├── helloworld.pb.go
    └── helloworld.proto

サーバープログラムの起動

go run greeter_server/main.go

クライアントプログラムの実行

$ go run greeter_client/main.go 
2020/02/07 11:21:59 Greeting: Test Hello John
2020/02/07 11:21:59 Greeting: Test2 Hello again Tom

サーバーのコンソールには次のようなメッセージが出ます。

$ go run greeter_server/main.go 
2020/02/07 11:21:59 SayHello Received: John
2020/02/07 11:21:59 SayHello2 Received: Tom

Arch Linux でのコマンドのインストール方法

sudo pacman -S protobuf
1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2