Рубрики
Без рубрики

Асинхронная генерация кода API: Микросервисы, использующие поток Spring Cloud

Генерация кода – непростой подвиг. Существует много сложностей, когда дело доходит до генерирования использования… Помечено как утешение, асинхронный api, java, spring.

Генерация кода – непростой подвиг. Существует множество сложностей, когда дело доходит до создания полезного кода приложения. В этом посте я расскажу вам о создании собственных микросервисов с использованием Spring Cloud Stream и генератора кода Async API. Эти инструменты должны помочь упростить процесс определения и реализации ваших асинхронных приложений. Я объяснил ту же идею в видео, которое вы можете посмотреть здесь , и все артефакты доступны на GitHub .

Асинхронный API: Что Это Такое?

Прежде чем мы погрузимся в генерацию кода, давайте начнем с основ – что такое AsyncAPI? За последние несколько лет AsyncAPI стал отраслевым стандартом для определения асинхронных API-интерфейсов, управляемых событиями; вы можете думать об этом как об OpenAPI для асинхронного мира. Это инициатива с открытым исходным кодом, которая предоставляет как спецификацию для описания и документирования ваших асинхронных приложений в машиночитаемом формате, так и инструменты (такие как генераторы кода), облегчающие жизнь разработчикам, которым поручено их реализовать.

Я не собираюсь вдаваться в подробности спецификации, но для контекста вы должны знать, что она определяет метаданные о вашем асинхронном API, каналах, доступных для отправки/получения сообщений, и компонентах, таких как схемы, которые определяют сообщения, которыми обмениваются. Для получения дополнительной информации о спецификации вы можете прочитать об этом здесь .

Определение приложения, которое Вы хотите разработать: Документ Асинхронного API

Первым шагом в создании кода с помощью Async API является получение документа Async API, определяющего приложение, которое вы хотите разработать. Согласно спецификации, этот документ представлен в виде объектов JSON и должен соответствовать стандартам JSON. YAML, являющийся надмножеством JSON, также может быть использован. Существует два основных способа получения этого документа: создать документ вручную или использовать портал событий.

Если вы решите создать документ вручную после ознакомления со спецификацией, не волнуйтесь – вы не начнете с чистого листа. Инициатива Async API предоставила удобный интерактивный инструмент под названием Игровая площадка Async API , чтобы упростить эту задачу. В левой части игровой площадки вы можете ознакомиться со спецификацией и внести изменения в реальный документ AsyncAPI, и при этом правая часть экрана обновляется, чтобы показать, как документ анализируется в более удобочитаемый формат.

Второй способ – использовать портал событий. Например, портал событий Solace PubSub + позволяет архитекторам и разработчикам сотрудничать с помощью графического интерфейса для разработки вашей архитектуры, управляемой событиями. Команда определит приложения, существующие в системе, а также события, которыми обмениваются, и схемы, которые их определяют. Наличие каталога хорошо организованных каналов и мероприятий для повторного использования также сэкономит вам время и головные боли во время совместной работы, вместо того, чтобы просматривать кучу файлов в разных местах.

После создания дизайна портал событий PubSub+ позволяет разработчику выбрать приложение, за разработку которого он отвечает, и загрузить документ AsyncAPI в формате JSON или YAML.

* *

Создавайте Управляемые Событиями Микросервисы С Использованием Spring Cloud Stream Без Изучения API Обмена Сообщениями

Теперь, когда у нас есть документ Async API, описывающий ваше приложение, пришло время разработать приложение. Асинхронный API Генератор кода поддерживает шаблоны для генерации кода для множества различных языков и протоколов, но для этого примера мы будем использовать шаблон Spring Cloud Stream . Следует отметить, что шаблон генерирует проект Maven.

Платформа Spring Cloud Stream предоставляет простой способ начать работу с микросервисами, управляемыми событиями, предоставляя связующие, которые позволяют разработчику создавать свои микросервисы без необходимости изучать API обмена сообщениями.

Загрузите и запустите генератор асинхронного API

Первым шагом, конечно же, является установка самого генератора асинхронного API. Если у вас установлен NodeJS, для этого потребуется всего одна простая команда npm , как показано ниже. Вы можете найти необходимые версии в Генераторе кода на github.

npm install -g @asyncapi/generator

После установки генератора вы можете запустить его с помощью команды ag . Как минимум, вы должны указать документ Async API для его запуска и шаблон для использования, как показано ниже.

ag ~/AsyncApiDocument.yaml https://github.com/asyncapi/java-spring-cloud-stream-template.git

В большинстве случаев вам захочется воспользоваться преимуществами параметров и расширений спецификаций, которые указаны в используемом шаблоне. Например, шаблон Spring Cloud Stream, который я использую в этом примере, позволяет мне настраивать множество параметров , включая связующее средство Spring Cloud Stream , которое я хочу использовать – например, связующее средство Solace.

Другие параметры включают:

  • Информация о Maven: Артефакт и группИд
  • Пакет Java: Пакет java
  • Информация о подключении брокера: хост , имя пользователя , пароль и msg Vpn

Используя эти параметры, моя команда ag может выглядеть примерно так, где -o указывает выходной каталог:

ag -o ExpenseIntegration -p binder=solace -p view=provider -p actuator=true -p artifactId=ExpenseIntegration -p groupId=acme.rideshare -p javaPackage=acme.rideshare.expense -p host=localhost:55555 -p username=default -p password=default -p msgVpn=default ~/Downloads/ExpenseIntegration.yaml @asyncapi/java-spring-cloud-stream-template

После запуска вывод будет выглядеть примерно так:

Добавьте Свою Бизнес-Логику

На этом этапе генератор создал каталог Интеграция расходов , содержащий проект Maven. Мы можем использовать выбранную среду разработки и импортировать проект Maven для добавления бизнес-логики.

Как видно на изображении ниже, после импорта проект выглядит как обычный Java-проект Spring Boot с сгенерированными классами в JavaPackage , который был определен ранее, и файлом application.yml для конфигурации. Сгенерированные классы в Пакете java включают простые старые объекты Java (POJO), определенные из схем в документе Async API, и |/Приложение.java , который содержит фактические функции Spring Cloud, в которые мы добавим вашу бизнес-логику.

Сгенерированные POJO, такие как Квитанция о поездке на изображении выше, определяют вашу модель данных для схем, включенных в документ Async API. Эти POJOS содержат переменные с геттерами и сеттерами для каждого атрибута, определенные для того, чтобы разработчики могли быстро кодировать без необходимости вручную создавать сами объекты, а также для Spring Cloud Stream для автоматического преобразования сообщений непосредственно в POJOS.

Затем у нас есть приложение .java класс, который можно переименовать с помощью параметра java Class . Генератор добавит функции для обработки сообщений, доставляемых по каналам, определенным в документе Async API , как описано в шаблоне .

В приведенном ниже примере мы видим одну java.util.функцию. Потребитель был с тех пор, как наш документ Async API описывает наше приложение как подписчика на сообщения, полезная нагрузка которых определяется схемой RideReceipt . Обратите внимание на комментарий, в котором говорится//Добавьте бизнес-логику здесь; здесь разработчик может добавить свою бизнес-логику.

@SpringBootApplicationpublic class Application {private static final Logger logger = LoggerFactory.getLogger(Application.class);public static void main(String[] args) {SpringApplication.run(Application.class);}@Beanpublic Consumer acmeRideshareBillingReceiptCreated001Consumer() {// Add business logic here.return null;}}

Вы можете сказать: “Марк, это здорово, но как, черт возьми, эта функция на самом деле привязана к каналам обмена сообщениями!? ” Вот тут-то и вступает в игру файл application.yml .

Сгенерированный файл application.yml определяет несколько вещей, как указано в документе Async API или в параметрах, переданных в генератор. Во-первых, он определяет список функций, о которых он хочет, чтобы Spring Cloud Stream знал в разделе spring.cloud.stream.функция.определение . Во-вторых, он сообщает потоку Spring Cloud, к каким каналам привязывать эти функции в разделе spring.cloud.streams.привязки . Наконец, он содержит информацию о подключении к системе обмена сообщениями. Информация о соединении указывается различными параметрами в зависимости от выбранного вами связующего, но в данном случае она определена в разделе solace.java .

spring: cloud: stream: function: definition: acmeRideshareBillingReceiptCreated001Consumer bindings: acmeRideshareBillingReceiptCreated001Consumer-in-0: destination: acme/rideshare/billing/receipt/created/0.0.1solace: java: host: 'localhost:55555' msgVpn: default clientUsername: default clientPassword: defaultlogging: level: root: info org: springframework: info

Обратите внимание, что все это было сделано для разработчика, поэтому им не нужно было отслеживать, какие параметры SCSt необходимо установить, сопоставлять функции с привязками и т.д. Им просто нужно добавить свою бизнес-логику вместо проекта и нажать “Запустить”! В этом случае, поскольку это проект Spring Boot, вы можете “запустить как приложение Spring Boot” в своей среде разработки или даже запустить из командной строки, используя mvn spring-boot:выполнить .

Полезные параметры и расширения спецификаций для создания микросервисов с использованием шаблона Async API Spring Cloud Stream

Как я уже упоминал, существует множество сложностей, когда дело доходит до создания полезного кода приложения из микросервиса. Из-за этих сложностей я подумал, что назову несколько советов, хитростей и болевых точек при использовании шаблона Async API Spring Cloud Stream.

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

  • Параметр связующее | позволяет указать связующее Spring Cloud Stream, которое вы хотели бы использовать. В настоящее время генератор поддерживает кафку , кролик и утешение . Расширение спецификации
  • info.x-view может быть установлено на уровне информации в вашем документе Async API. Это расширение позволяет вам определить, как документ следует рассматривать с точки зрения приложения. По умолчанию спецификация асинхронного API принимает вид клиент , где операции (публикация/подписка), определенные в документе, представляют то, что принимает приложение (или как вы будете взаимодействовать с этим приложением). Однако для генерации кода вам может потребоваться сгенерировать то, что на самом деле делает приложение. Именно здесь происходит настройка параметра вид . Если вы установите для view значение поставщик , операции, определенные в документе, будут рассматриваться как то, что на самом деле делает приложение. Обратите внимание, что это расширение также можно установить с помощью view параметр в некоторых шаблонах генератора, таких как Java Spring Cloud Stream. Расширение operation.x-scs-имя функции
  • расширение спецификации может быть установлено в вашей публикации или операции подписки в документе AsyncAPI, позволяющие не только назвать сгенерированную функцию, но и связать две операции вместе, чтобы сформировать функцию, которая подписывается на один канал и публикуется в другом, когда используется одно и то же имя. Например, если ваш документ Async API выглядел как изображение ниже java.util.function. Будет сгенерирована функция , называемая “рассчитать процент”, которая подписывается на входной канал и публикуется в выходном канале.
channels: 'input': subscribe: x-scs-function-name: calculatePercentage message: $ref: '#/components/messages/CovidTracking\_SingleStateCurrentDataUpdate' 'output': publish: x-scs-function-name: calculatePercentage message: $ref: '#/components/messages/CovidTracking\_SingleStateTestPercentagesUpdate'
  • Расширение спецификации x-scs-назначение может быть указано в операции подписки , что позволяет переопределить значение назначения по умолчанию, которое обычно соответствует каналу. Это полезно, когда вы используете связующее утешение и следуете шаблону Утешения публикации в темах и потребления из очередей. В этом случае значение x-scs-destination будет рассматриваться как имя очереди, из которой будет использоваться ваш микросервис, а имя канала в документе AsyncAPI будет добавлено в качестве подписки на тему в эту очередь. Расширение спецификации
  • x-scs-group также может быть указано в операции подписки , что позволяет добавлять группу в созданный поток Spring Cloud/| привязка . Это позволяет использовать группы потребителей и приведет к созданию длительной очереди при использовании связующего утешения.

Советы По Использованию Генератора Кода Для Создания Управляемых Событиями Микросервисов С Использованием Spring Cloud Stream

Помимо параметров конфигурации, есть еще несколько вещей, которые следует иметь в виду при использовании генератора для создания управляемых событиями микросервисов с использованием Spring Cloud Stream.

  1. Убедитесь, что сгенерированные POJO имеют типы Java, которые вы ожидаете для сгенерированных переменных! Например, если ваша схема JSON определяет тип атрибута как число или целое число , они сопоставляются с Двойной или Целое число в Java соответственно. Если вам нужен другой тип, например float или long, вы захотите внести это изменение. Также важно убедиться, что вы уделяете пристальное внимание данным, представляющим даты и/или время, поскольку они, скорее всего, будут представлены просто строкой | по умолчанию. Динамические темы еще не поддерживаются генератором кода AsyncAPI SCST. Мы будем стремиться улучшить их оба для поддержки динамических тем в будущем, но сейчас вы захотите удалить динамические фрагменты темы из своих каналов в документе AsyncAPI и впоследствии добавить их в код.
  2. При создании микросервиса Spring Cloud Stream, который
  3. не содержит java.util.функцию. Поставщик включает веб-сервер, чтобы микросервис продолжал работать и прослушивал сообщения для обработки. Это можно сделать, включив параметр -p для включения функций пружинного привода, для которых сам по себе требуется веб-сервер, а также предоставляет некоторые интересные возможности управления и мониторинга. В качестве альтернативы вы можете просто добавить spring-boot-starter-web starter в свой pom после его создания. Обратите внимание, что это не проблема с шаблоном генератора асинхронного API, а просто ошибка в связующем потоке Solace Spring Cloud, которая будет актуальна для людей, использующих генератор.

Я надеюсь, что эти советы окажутся полезными и сэкономят вам время на устранение неполадок!

Вывод

Я надеюсь, что этот пост был полезен, и вы сможете быстро приступить к созданию собственных микросервисов, управляемых событиями, с помощью Spring Cloud Stream и генератора кода AsyncAPI после изучения примера, описанного выше.

Вы можете начать прямо сейчас и использовать портал событий Solace PubSub + для БЕСПЛАТНОГО создания документа Async API, зарегистрировавшись в новой облачной учетной записи !

Если у вас есть дополнительные вопросы или вы хотите поделиться своим опытом работы с инструментами, вы можете сообщить нам об этом на форуме сообщества Solace или рассмотреть возможность присоединиться к нам и внести непосредственный вклад в инициативу AsyncAPI.

Сообщение Генерация кода асинхронного API: Микросервисы с использованием Spring Cloud Stream появилось впервые на Solace .

Оригинал: “https://dev.to/solacedevs/asyncapi-code-generation-microservices-using-spring-cloud-stream-4cj2”