Напишите полное приложение gRPC на Golang

Что такое gRPC?

Это платформа, разработанная Google для обработки удаленных вызовов процедур (RPC).

Сегодня gRPC используется технологическими лидерами, такими как Google, Cisco, Dropbox, Netflix, IBM и т. д.

Для получения официальной документации посетите grpc.io.

Преимущества

gRPC использует HTTP/2 в качестве транспортного протокола. Несмотря на совместимость с HTTP 1.1, HTTP/2 обладает множеством дополнительных возможностей:

  • Облегченные сообщения. Сообщения, закодированные с помощью gRPC, могут быть на 60–80 % меньше, чем сообщения JSON.
  • Генерация кода. gRPC имеет автоматизированную генерацию кода, которая охватывает такие языки, как C#, C++, Java, Go, Kotlin, Node, PHP, Python, Ruby и другие.
  • Поддерживает потоковую передачу. gRPC также обеспечивает потоковую передачу данных: потоковая передача на стороне сервера, потоковая передача на стороне клиента и двунаправленная потоковая передача.
  • Сверхбыстрый. gRPC в 7 или даже 8 раз быстрее, чем связь REST+JSON.

Что такое протокольные буферы?

Буферы протокола — это независимый от языка и платформы расширяемый механизм Google для сериализации структурированных данных — представьте XML, но меньше, быстрее и проще.

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

Вы можете определить сообщение protobuf в файле .proto следующим образом:

Предпосылки

Голанг

У вас должна быть установлена ​​одна из трех последних основных версий Go.

Компилятор буфера протокола

Чтобы скомпилировать определение протокола (.proto file), мы должны установить компилятор буфера протокола, а также плагины golang для компилятора протокола.

Компилятор protobuf представляет собой исполняемый файл, который можно загрузить здесь (официальная страница).

Например, в Linux вы загрузите

protoc-21.6-linux-x86_64.zip

Затем следуйте файлу readme (он отличается от Windows, Linux и OSX).

По сути, вы должны поместить содержимое папки bin (двоичный файл protoc) в свой PATH.

Плагины Go

Затем вам нужно установить подключаемые модули Go для компилятора протокола:

$ go install google.golang.org/protobuf/cmd/protoc-gen-go
$ go install google.golang.org/grpc/cmd/protoc-gen-go-grpc

и, наконец (если вы еще этого не сделали), вам нужно обновить PATH, чтобы включить go/bin, чтобы protocмог найти только что установленные вами плагины.

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

теперь у вас есть все инструменты, необходимые для создания сервера gRPC 😃

Первые шаги

Во-первых, вы должны запустить проект golang (назовите его как хотите, я называю свой grpctutorial)

$ go mod init grpctutorial

Затем вам нужно установить пакет grpc-go

$ go get -u google.golang.org/grpc

Теперь пишем основную функцию (и файл main.go)

Затем вам нужно создать свой первый файл протокола и поместить его в каталог с именем tutorial.

Скомпилировать прото файл

Теперь, когда мы определили наш прототип, нам нужно скомпилировать его в код Golang.

Перейдите с помощью терминала в папку, содержащую ваш файл .proto, и выполните эту команду.

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

По сути, эта команда получит все файлы *.proto в папке, в которой вы сейчас находитесь, и скомпилирует их с двоичным файлом protoc, который мы установили ранее с плагином grpc.

Мой проект после компиляции выглядит так:

Примечание. Я поместил файл tutorial.proto в папку/пакет учебника.

Файл tutorial_grpc.pb.goявляется результатом tutorial.protoфайла, скомпилированного с помощью protoc (с плагином grpc).

Внутри tutorial_grpc.pb.go file находятся все наши типы, определенные в файле proto, а также серверный и клиентский код.

Реализация сервера gRPC

Перед запуском сервера gRPC мы должны реализовать методы, которые мы определили в файле .protofile.

В нашем примере мы должны реализовать

rpc SayHello (HelloRequest) returns (HelloReply) {}

Чтобы запустить сервер gRPC, мы должны реализовать этот интерфейс (вы можете найти его в tutorial_grpc.pb.gofile)

Сначала мы создаем файл server.gofile вместе с файлом .protofile.

Теперь нам нужно запустить сервер и обслуживать его через порт TCP в файле main.go.

Теперь вы готовы запустить сервер на порту 9000😃 😃

$ go run .

Давайте протестируем наш сервер gRPC с помощью BloomRPC (GUI-клиент для сервисов RPC).

Вы можете скачать Bloom со страницы github.

После установки вы должны добавить прототип, который вы определили в своем проекте (в моем случае tutorial.proto), а затем вы можете протестировать свои API.

Наш сервер работает 😃

Последние мысли

Теперь вы, наконец, создали свой первый сервер gRPC.

Если вы зашли так далеко, надеюсь, вам понравилось!

Пожалуйста, оставьте комментарий, если у вас есть какие-либо вопросы.

Спасибо за чтение.

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