Вы, должно быть, слышали о 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 с исходным кодом
Часть вторая - Скоро будет