воскресенье, 28 марта 2021 г.

Быстрый старт с gRPC в Golang

Это руководство поможет вам начать работу с gRPC в Go на простом рабочем примере.

Предпосылки

  • Go, любой из трех последних основных выпусков Go.
  • Protocol buffer компилятор, protoc, версия 3.
  • Плагины Go для компилятора protoc:

    Установите плагины компилятора protoc для Go, используя следующие команды:

    $ export GO111MODULE=on  # Включить режим модуля
    $ go get google.golang.org/protobuf/cmd/protoc-gen-go \
             google.golang.org/grpc/cmd/protoc-gen-go-grpc
    

    Обновите свой PATH, чтобы компилятор protoc мог найти плагины:

    $ export PATH="$PATH:$(go env GOPATH)/bin"
    

Получите пример кода

Код примера является частью репозитория grpc-go.

Загрузите репо в виде zip-файла и разархивируйте его или клонируйте репозиторий:

$ git clone -b v1.35.0 https://github.com/grpc/grpc-go

Перейдите в каталог примеров:

$ cd grpc-go/examples/helloworld

Запустите пример

Из каталога examples/helloworld:

  • Скомпилируйте и выполните код сервера:

    $ go run greeter_server/main.go
    

  • С другого терминала скомпилируйте и выполните клиентский код, чтобы увидеть выходные данные клиента:

    $ go run greeter_client/main.go
    Greeting: Hello world
    

Вы только что запустили клиент-серверное приложение с gRPC.

Обновите сервис gRPC

В этом разделе вы обновите приложение дополнительным серверным методом. Служба gRPC определяется с использованием protocol buffers. На данный момент все, что вам нужно знать, это то, что и сервер, и клиентская заглушка имеют RPC-метод SayHello(), который принимает параметр HelloRequest от клиента и возвращает HelloReply с сервера, и что этот метод определен следующим образом:

// Определение службы приветствия.
service Greeter {
  // Отправляет приветствие
  rpc SayHello (HelloRequest) returns (HelloReply) {}
}

// Сообщение-запрос, содержащее имя пользователя.
message HelloRequest {
  string name = 1;
}

// Ответное сообщение с приветствием
message HelloReply {
  string message = 1;
}

Откройте helloworld/helloworld.proto и добавьте новый метод SayHelloAgain() с теми же типами запросов и ответов:

// Определение службы приветствия.
service Greeter {
  // Отправляет приветствие
  rpc SayHello (HelloRequest) returns (HelloReply) {}
  // Отправляет другое приветствие
  rpc SayHelloAgain (HelloRequest) returns (HelloReply) {}
}

// Сообщение-запрос, содержащее имя пользователя.
message HelloRequest {
  string name = 1;
}

// Ответное сообщение с приветствием
message HelloReply {
  string message = 1;
}

Не забудьте сохранить файл!

Перегенерировать код gRPC

Прежде чем вы сможете использовать новый метод сервиса, вам необходимо перекомпилировать обновленный файл .proto.

Находясь в каталоге examples/helloworld, выполните следующую команду:

$ protoc --go_out=. --go_opt=paths=source_relative \
    --go-grpc_out=. --go-grpc_opt=paths=source_relative \
    helloworld/helloworld.proto

Это перегенерирует файлы helloworld/helloworld.pb.go и helloworld/helloworld_grpc.pb.go, которые содержат:

  • Код для заполнения, сериализации и получения типов сообщений HelloRequest и HelloReply.
  • Сгенерированный клиентский и серверный код.

Обновите и запустите приложение

Вы регенерировали серверный и клиентский код, но вам все еще необходимо реализовать и вызвать новый метод в написанных человеком частях примера приложения.

Обновите сервер

Откройте greeter_server/main.go и добавьте к нему следующую функцию:

func (s *server) SayHelloAgain(ctx context.Context, in *pb.HelloRequest) (*pb.HelloReply, error) {
        return &pb.HelloReply{Message: "Hello again " + in.GetName()}, nil
}

Обновите клиент

Откройте greeter_client/main.go, чтобы добавить следующий код в конец тела функции main():

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

Не забудьте сохранить изменения.

Запустите

Запустите клиент и сервер, как и раньше. Выполните следующие команды из каталога examples/helloworld:

Запускаем сервер:

$ go run greeter_server/main.go

С другого терминала запустите клиент. На этот раз добавьте имя в качестве аргумента командной строки:

$ go run greeter_client/main.go Alice

Вы увидите следующий результат:

Greeting: Hello Alice
Greeting: Hello again Alice


Читайте также:


Комментариев нет:

Отправить комментарий