Это руководство поможет вам начать работу с 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
Читайте также:
Комментариев нет:
Отправить комментарий