Генерация кода – непростой подвиг. Существует множество сложностей, когда дело доходит до создания полезного кода приложения. В этом посте я расскажу вам о создании собственных микросервисов с использованием 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 ConsumeracmeRideshareBillingReceiptCreated001Consumer() {// 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.
- Убедитесь, что сгенерированные POJO имеют типы Java, которые вы ожидаете для сгенерированных переменных! Например, если ваша схема JSON определяет тип атрибута как
число
илицелое число
, они сопоставляются сДвойной
илиЦелое число
в Java соответственно. Если вам нужен другой тип, например float или long, вы захотите внести это изменение. Также важно убедиться, что вы уделяете пристальное внимание данным, представляющим даты и/или время, поскольку они, скорее всего, будут представлены просто строкой| по умолчанию.
Динамические темы еще не поддерживаются генератором кода AsyncAPI SCST. Мы будем стремиться улучшить их оба для поддержки динамических тем в будущем, но сейчас вы захотите удалить динамические фрагменты темы из своих каналов в документе AsyncAPI и впоследствии добавить их в код. - При создании микросервиса Spring Cloud Stream, который
- не содержит java.util.функцию. Поставщик
включает веб-сервер, чтобы микросервис продолжал работать и прослушивал сообщения для обработки.
Это можно сделать, включив параметр -pдля включения функций пружинного привода, для которых сам по себе требуется веб-сервер, а также предоставляет некоторые интересные возможности управления и мониторинга. В качестве альтернативы вы можете просто добавить
spring-boot-starter-webstarter в свой 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”