Вы, должно быть, слышали о gRPC и его преимуществах. Здесь я покажу вам, как создать современный API с помощью Nest.js и gRPC в машинописном тексте.

Почему gRPC - это круто

Зачем использовать gRPC? У него масса преимуществ, таких как производительность, генерация кода, потоковая передача и т. Д. Но для меня главное - это строгая спецификация. GRPC заставляет вас писать .proto файлы, описывающие ваш API. Эта функция позволила мне и моей команде сэкономить много времени. Протофайлы - это спецификации, которые можно написать до начала разработки, и они могут быть единственным источником истины для разработчиков API.

Обзор

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

Спецификация API

Начнем с создания файла .proto. В этой статье API сможет суммировать два числа. Файлы .proto состоят из двух служб. Первый - это служба GatewayService. Служба будет точкой входа в API серверной части, она может получать запрошенную клиентом информацию из других служб. Вторая служба - это SummatorService. Он предоставит Sum метод, который суммирует все полученные числа.

Сумматор

Эта служба должна предоставлять функцию с именем Sum, которая может суммировать все заданные числа и возвращать результат. Начнем с определения функции bootstrap для запуска приложения.

Бутстрап

Чтобы запустить микросервис в Nest.js, он должен быть настроен с указанием типа транспорта, URL-адреса, на котором он будет размещаться, пути к файлу .proto со спецификацией службы и имени пакета.

Контроллер

В нашем случае контроллер содержит только один метод с именем Sum. Чтобы сделать метод обработчиком gRCP, следует использовать аннотацию GrpcMethod с параметрами имени службы (SummatorService) в файле спецификации .proto и имени метода (Sum), который предполагается реализовать.
sum метод суммирует все числа из запроса:

Сервис Сумматор готов. Перейдем к сервису Gateway.

Шлюз

Служба шлюза - это передняя часть всего API. Часть, которая общается с внешним миром. Сервис будет использовать gRPC для связи с клиентом, а также со службой Summator.

Бутстрап

Конфигурация сервиса такая же, как и у сервиса Summator, за исключением поля url. Порт url отличается.

Модуль

Чтобы получить доступ к клиентскому объекту сервиса Summator, его необходимо предварительно зарегистрировать. Регистрация клиентского модуля выполняется методом register класса ClientsModule пакета @nestjs/microservices. Для этого требуется имя (любое имя, используемое при внедрении), транспорт (в данном случае GRPC), путь к .proto файлу спецификации внедряемой службы и URL-адрес службы.

Теперь мы можем внедрить экземпляр ClientGrpc, используя SUMMATOR_PACKAGE в качестве имени вводимого объекта.

Контроллер

В этом случае контроллер предоставит только один метод Add. Этот метод должен брать числа a и b из тела запроса и вызывать метод sum экземпляра клиента службы Summator, который был настроен в файле модуля.
К сожалению, все используемые интерфейсы запросов и клиентов gRPC являются осталось определить вручную. Например, тип запроса метода Add определен в его .proto файле, но интерфейс запроса (AddRequest) в контроллере по-прежнему должен определяться вручную. В любом большом проекте вы должны использовать инструменты для автоматической генерации таких интерфейсов, чтобы избежать всевозможных опечаток. Protobuf.js - хороший.

В конструктор внедряется ClientGrpc, который ранее был импортирован в файл модуля. При инициализации модуля мы получаем объект SummatorServiceClient из внедренного ClientGrpc.

Важно уточнить, что SummatorServiceClient интерфейс определяется как отдельный интерфейс вручную. Он отображает .proto Сумматор в машинописный текст.

В основном методы gRPC Nest.js возвращают rxjs Observables. Вы можете работать с ними реактивно или преобразовывать их в обещание, используя метод toPromise.

Резюме

Надеюсь, эта статья поможет вам понять, насколько прост и полезен gRPC. Я настоятельно рекомендую вам попробовать и погрузиться в это.

Во части второй я покажу вам, как интегрировать gRPC API с клиентским приложением в React.

Репозиторий Github с исходным кодом

Часть вторая - Скоро будет