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

Существует не так много параметров конфигурации. Вот файл конфигурации приложения (site-service.yml), хранящийся на сервере конфигурации. Он хранит только порт запуска HTTP и URL-адрес Eureka. сайт-сервис.yml Вот код с реализацией класса REST controller. ШАГ 4: Откройте симулированную связь между микросервисами с помощью spring Теперь мы добавим еще один микросервис (пользовательский сервис), который необходим пользовательской службе для получения списка сайтов для данного идентификатора пользователя. Вот почему нам нужно включить дополнительную зависимость для tSpring Cloud Open Feign – это декларативный клиент REST, который использует тесты производительности загрузки iSpring с Tomcat, Undertow и Webflux. Я также был бы очень признателен за любые исправления! Я был бы очень признателен за любые комментарии и отзывы о том, есть ли что-нибудь, что можно было бы прояснить или объяснить лучше. Был ли этот пост полезен для вас? Я обновлю этот пост ссылкой, когда он выйдет в эфир! В следующем посте мы начнем расс

Существует не так много параметров конфигурации. Вот файл конфигурации приложения (site-service.yml), хранящийся на сервере конфигурации. Он хранит только порт запуска HTTP и URL-адрес Eureka. сайт-сервис.yml Вот код с реализацией класса REST controller. ШАГ 4: Откройте симулированную связь между микросервисами с помощью spring Теперь мы добавим еще один микросервис (пользовательский сервис), который необходим пользовательской службе для получения списка сайтов для данного идентификатора пользователя. Вот почему нам нужно включить дополнительную зависимость для tSpring Cloud Open Feign – это декларативный клиент REST, который использует ITэто сообщение является эталоном производительности Tomcat, Undertow и Webflux, работающих под управлением Azure. Тесты производительности Spring Boot с Tomcat, Undertow и Webflux Я также был бы очень признателен за любые исправления! Я был бы очень признателен за любые комментарии и отзывы о том, есть ли что-нибудь, что можно было бы прояснить или объяснить лучше. Был ли это

Существует не так много параметров конфигурации. Вот файл конфигурации приложения (site-service.yml), хранящийся на сервере конфигурации. Он хранит только порт запуска HTTP и URL-адрес Eureka. сайт-сервис.yml Вот код с реализацией класса REST controller. ШАГ 4: Откройте симулированную связь между микросервисами с помощью spring Теперь мы добавим еще один микросервис (пользовательский сервис), который необходим пользовательской службе для получения списка сайтов для данного идентификатора пользователя. Вот почему нам нужно включить дополнительную зависимость для tSpring Cloud Open Feign – это декларативный клиент REST, который использует тесты производительности загрузки ITomcat vs Undertow vs Webflux Spring с Tomcat, Undertow и Webflux с тегами java, azure, spring, performance. Этот пост представляет собой тест производительности Tomcat, Undertow и Webflux, работающих под управлением Azure. Тесты производительности Spring Boot с Tomcat, Undertow и Webflux Я также был бы очень признателен за любые исправления! Я был бы очень признателен за любые комментарии и отзывы о том, есть ли что-нибудь, что можно было бы прояснить или объяснить лучше. Был ли этот пост полезен для вас? Я обновлю этот пост ссылкой, когда он выйдет в эфир! В следующем посте мы начнем рассматривать проблемы, связанные с компиляцией и запуском нашего первого Java-приложения. Но, по крайней мере, теперь мы знаем намного больше о том, как Java работает в нашей системе! Послушай, я || предупреждал || тебя, что это будет грязно. Подожди секунду… || двоичный файл в каталоге || JavaVM.framework || ранее. Или, возможно, вы заметили, что также был || java_home Я предполагаю, что выбор по умолчанию ||/usr/libexec/java_home || отражает то, что происходит, когда вы запускаете одно из приложений-заглушек в ||/System/Library/Frameworks/JavaVM.framework/или эквивалент.zshrc ваш || .bashrc ||/|| Для более постоянного решения, которое вам нужно будет использовать, конечно, выполнение команды || export || в вашей оболочке будет длиться только в течение срока службы этого экземпляра оболочки. Нет, я в порядке – я останусь здесь, ваше здоровье. Повеселись. Идите прямо вперед. Хотите вновь пережить безмятежные дни JDK 1.6? || , когда он установлен, имеет приоритет над порядком по умолчанию ||/usr/libexec/java_home || JAVA_HOME Между тем, флаг || -v || (нижний регистр) вернет путь к указанной JVM, который затем может быть установлен в качестве переменной окружения || JAVA_HOME ||. Вы можете просмотреть все ваши текущие установленные версии с помощью флага || -V || (с заглавной буквы). и тому подобное. jshell javac || , ||| | java || , || java_home ||, похоже, по умолчанию отдает предпочтение более свежим версиям JDK, поэтому, если у вас установлено 12, он заменит 11 при запуске. Я потерял только часть своего здравомыслия, поэтому я приму это как победа./Library/Java/JavaVirtualMachines Мы наконец-то добрались до || Fantastic. Хорошо! Давайте просто загрузим его. Я только знаю, что мы не были бы разработчиками Java, если бы заботились о такой последовательности. Это открытый вопрос: я понятия не имею. Неужели они просто наполовину удалили поддержку Java из ОС, оставив нас слегка привязанными к нелюбимому, не поддерживаемому призраку в машине? Только я почти уверен, что Apple удалила приложение Java Preferences несколько лет назад, но это неважно. Путь выводится на стандартный вывод. По умолчанию, если никакие ограничения не соответствуют доступному списку виртуальных машин, используется порядок по умолчанию. Для фильтрации списка доступных виртуальных машин могут быть предусмотрены дополнительные ограничения. Он определяет этот путь из включенных и предпочитаемых JVM пользователя в приложении Java Preferences. возвращает путь, подходящий для установки переменной окружения JAVA_HOME. java_home || , который , согласно его странице || man ||: Еще немного поисков в Интернете показывает || , потому что я этого не сделал. Вы когда-нибудь видели что-нибудь подобное раньше? Но еще немного покопавшись в || Stack Overflow, можно предположить, что это приложения-заглушки ||, которые определяют версию используемой JVM. Заметь, все по-прежнему не складывается. Это не символические ссылки, так что это хорошо. || каталог мы можем видеть все наши знакомые Java-файлы. И если у нас есть возможность заглянуть в || JavaVM.framework, что ж, это что-то новенькое. Это не первое наше родео! Но этот файл имеет размер 74 байта, что, если вы спросите меня о контрольном сигнале, означает символическую ссылку. ОК. Итак, предположительно, наша оболочка будет указывать на наш каталог || java.home ||? Все выглядит радужно. Это последняя версия, и, к счастью, это не Oracle JDK. У нас установлена Java. Ладно, круто. И затем мы можем заглянуть внутрь нашего || java.home |||| системного свойства || изнутри || jshell || . Давайте начнем с самого начала: Вас предупредили. Погружение в его сердце тьмы – это гарантия того, что ты закончишь как Курц. Пристегнитесь, потому что спускаться через установку Java – это все равно, что смотреть Ктулху в лицо в течение двух недель. Где на самом деле установлена Java? Linux и Windows неизбежно будут отличаться друг от друга и, вероятно, будут иметь своих собственных гремлинов. Предостережение ||: это специфично для macOS прямо сейчас. Давайте разберемся с этим. Но почему? и ты будешь вести себя хорошо. ||/Библиотека/Java/JavaVirtualMachines/например || jdk-12.jdk || – в **tl;dr: || * скопируйте несжатый каталог OpenJDK – мне показалось, что || Тед Дэнсон || Стив Гуттенберг в/| Трое мужчин и ребенок || . OpenJDK || , насколько я могу судить, дает вам каталог нелюбимых двоичных файлов, в котором практически нет указаний на то, что вы должны с ними делать. Загрузка || В первый раз я быстро справился с установкой OpenJDK 12, и я даже не могу сказать вам, как я это сделал. Время для судебного путешествия. Первые шаги: абсолютные основы. В конце этой серии мы все должны иметь гораздо более четкое представление о том, что происходит под капотом всех наших инструментов, и гораздо больше уверенности в том, чтобы возиться с нашими сборками проектов. Затем мы перейдем к включению того же приложения с помощью Gradle, популярного инструмента сборки, и закончим включением нашего проекта в IntelliJ IDE. Приложение Hello World ||, использующее внешние библиотеки и несколько файлов, чтобы мы могли разобраться в стандартной структуре каталогов Java и в том, как создавать наше приложение из командной строки. В течение нескольких постов мы собираемся узнать немного больше о том, как Java устанавливается на нашей локальной машине, прежде чем создавать простой (и лишь несколько надуманный) || Поэтому, прежде чем начать свой второй проект Java, я хотел лучше понять, что, черт возьми, происходит. В принципе, я обнаружил, что понимание инструментария Java серьезно озадачивает. Нет, я называю это || падение со стилем || . Размахивая им? Я нажал достаточно кнопок в IntelliJ, чтобы все запустилось, и (к счастью) они запустились, и я провел остаток проекта, постоянно находясь в нежных объятиях IntelliJ. Хорошо, реальный разговор: я закончил свой первый Java-проект как, например, || полностью || профессиональный разработчик, не имея ни малейшего представления о том, ну, о чем-либо, связанном с экосистемой Java build/tooling. Начало работы со средой Java на macOS с пометкой beginners, java. Разве неправильно признавать, что я понятия не имею, как Java на самом деле установлена в моей системе?. Начало работы со средой Java на macOS para mais detalhes. Вежа о аркиво || ЛИЦЕНЗИЯ Esse projeto está sob a licença MIT. 📝 Лицензия на получение лицензии на использование Java для рекурсивной формы и на рекурсивную форму. Fatorial em Java, recursivo e não recursivo. franciscoao/fatorial-em-java Código fonte no Github: StackOverflowError || . consumir muita memória da máquina e ocorrera um erro conhecido por Então criaremos um metodo que retorne um inteiro e receba como parâmetro um valor para ser calculado, lembrando que qualquer metodo que não seja || пустота || реторная водоросль, доблесть или объект, нет особых условий для парада, или сея, quando esta кондисан для вердадейры, повторяющийся парад, с кондисаном парада для фальшивой реторны о месмо-методо в конце параметра в противоположность кондисану вердадейры, деве-се томар куидадо пара эста кондисан нао с торнаром ума повторяется бесконечно, се кондисан нунка для вердадейры о методе ира Для реализации форм рекурсивного теремоса, который может быть использован для расчета доблести. Запрос на саблю о том, как сделать нумеро 5 для рекурсивной формы: Рекурсивная форма Vamos вычислительный о том, как сделать нумеро 5 для интерактивной формы: Интерактивное взаимодействие Ола пессоал, ирей мострар алгумас формас де реализаторский em Java. F-em Java с тегами для начинающих, бразильские разработчики, java, учебное пособие. Фатальный интерактив… Ола пессоал, ирей мострар алгумас формас де реализар губернаторства на Яве. F) em Java Описанные выше шаги, если они будут выполняться прилежно, позволят вам внедрить распределенную трассировку в ваши архитектуры микросервисов и иметь возможность визуализировать ваши журналы через kibana и выполнять поиск по ним с помощью elasticsearch. Следующая конфигурация, которую нужно добавить, – это создать файл с именем logback.xml в папке ресурсов каждого микросервиса со следующим содержимым: Отправка журналов микросервиса в logstash требует добавления следующих зависимостей к каждому микросервису. ШАГ 7: Настройка микросервисов для отправки журналов в logstash При условии, что сервер zipkin отвечает на localhost на порту 9411, Затем добавьте следующее в файл yml каждого микросервиса на сервере конфигурации: Чтобы настроить zipkin, добавьте приведенную ниже зависимость к каждому микросервису pom.xml файл На самом деле, единственное, что вы нужно сделать, это добавить starter spring-cloud-starter-sleuth к зависимостям каждого отдельного микросервиса и шлюза. Сопоставлять журналы между различными микросервисами с помощью Spring Cloud Sleuth очень просто. ШАГ 6: Сопоставление журналов между различными микросервисами с помощью spring cloud sleuth и zipkin t сохраняет только порт запуска HTTP и URL-адрес Eureka. Вот файл конфигурации приложения (edge-service.yml), хранящийся на сервере конфигурации. Нам также необходимо включить клиент обнаружения, поскольку пограничная служба интегрируется с Eureka, чтобы иметь возможность выполнять маршрутизацию к нижестоящим службам. Во-первых, мы должны включить starter spring-cloud-starter-netflix-zuul в зависимости проекта. API-шлюз реализован внутри модуля edge-service.

Существует не так много параметров конфигурации. Вот файл конфигурации приложения (site-service.yml), хранящийся на сервере конфигурации. Он хранит только порт запуска HTTP и URL-адрес Eureka. сайт-сервис.yml Вот код с реализацией класса REST controller. ШАГ 4: Откройте симулированную связь между микросервисами с помощью spring Теперь мы добавим еще один микросервис (пользовательский сервис), который необходим пользовательской службе для получения списка сайтов для данного идентификатора пользователя. Вот почему нам нужно включить дополнительную зависимость для tSpring Cloud Open Feign – это декларативный клиент REST, который использует IJHipster используется тысячами людей для создания готовых к работе приложений Spring Boot. Tomcat vs Undertow vs Webflux Тесты производительности Spring Boot с Tomcat, Undertow и Webflux с тегами java, azure, spring, performance. Этот пост представляет собой тест производительности Tomcat, Undertow и Webflux, работающих под управлением Azure. Тесты производительности Spring Boot с Tomcat, Undertow и Webflux Я также был бы очень признателен за любые исправления! Я был бы очень признателен за любые комментарии и отзывы о том, есть ли что-нибудь, что можно было бы прояснить или объяснить лучше. Был ли этот пост полезен для вас? Я обновлю этот пост ссылкой, когда он выйдет в эфир! В следующем посте мы начнем рассматривать проблемы, связанные с компиляцией и запуском нашего первого Java-приложения. Но, по крайней мере, теперь мы знаем намного больше о том, как Java работает в нашей системе! Послушай, я предупреждал тебя, что это будет грязно. Подожди секунду…

Существует не так много параметров конфигурации. Вот файл конфигурации приложения (site-service.yml), хранящийся на сервере конфигурации. Он хранит только порт запуска HTTP и URL-адрес Eureka. сайт-сервис.yml Вот код с реализацией класса REST controller. ШАГ 4: Откройте симулированную связь между микросервисами с помощью spring Теперь мы добавим еще один микросервис (пользовательский сервис), который необходим пользовательской службе для получения списка сайтов для данного идентификатора пользователя. Вот почему нам нужно включить дополнительную зависимость для tSpring Cloud Open Feign – это декларативный клиент REST, который использует его. Это своего рода обсуждение, которое очень часто происходит в сообществе JHipster: с таким количеством людей, вносящих свой вклад, мы часто тестируем и пробуем альтернативы нашему текущему подходу. Мы используем Undertow уже много лет и с большим успехом, но поскольку мы планируем выпуск JHipster 7, мы начали обсуждать || переход от Undertow || . JHipster || используется тысячами людей для создания готовых к работе приложений Spring Boot. Tomcat vs Undertow vs Webflux Тесты производительности Spring Boot с Tomcat, Undertow и Webflux с тегами java, azure, spring, performance. Этот пост представляет собой тест производительности Tomcat, Undertow и Webflux, работающих под управлением Azure. Тесты производительности Spring Boot с Tomcat, Undertow и Webflux Я также был бы очень признателен за любые исправления! Я был бы очень признателен за любые комментарии и отзывы о том, есть ли что-нибудь, что можно было бы прояснить или объяснить лучше. Был ли этот пост полезен для вас? Я обновлю этот пост ссылкой, когда он выйдет в эфир! В следующем посте мы начнем рассматривать проблемы, связанные с компиляцией и запуском нашего первого Java-приложения. Но, по крайней мере, теперь мы знаем намного больше о том, как Java работает в нашей системе! Послушай, я || предупреждал || тебя, что это будет грязно. Подожди секунду… || двоичный файл в каталоге || JavaVM.framework || ранее. Или, возможно, вы заметили, что также был || java_home Я предполагаю, что выбор по умолчанию ||/usr/libexec/java_home || отражает то, что происходит, когда вы запускаете одно из приложений-заглушек в ||/System/Library/Frameworks/JavaVM.framework/или эквивалент.zshrc ваш || .bashrc ||/|| Для более постоянного решения, которое вам нужно будет использовать, конечно, выполнение команды || export || в вашей оболочке будет длиться только в течение срока службы этого экземпляра оболочки. Нет, я в порядке – я останусь здесь, ваше здоровье. Повеселись. Идите прямо вперед. Хотите вновь пережить безмятежные дни JDK 1.6? || , когда он установлен, имеет приоритет над порядком по умолчанию ||/usr/libexec/java_home || JAVA_HOME Между тем, флаг || -v || (нижний регистр) вернет путь к указанной JVM, который затем может быть задается как переменная окружения || JAVA_HOME ||. Вы можете просмотреть все ваши текущие установленные версии с помощью флага || -V || (с заглавной буквы). и тому подобное. jshell javac || , ||| | java || , || java_home ||, похоже, по умолчанию отдает предпочтение более свежим версиям JDK, поэтому, если у вас установлено 12, он заменит 11 при запуске. Я потерял только часть своего здравомыслия, поэтому я приму это как победа./Library/Java/JavaVirtualMachines Мы наконец-то добрались до || Fantastic. Хорошо! Давайте просто загрузим его. Я только знаю, что мы не были бы разработчиками Java, если бы заботились о такой последовательности. Это открытый вопрос: я понятия не имею. Неужели они просто наполовину удалили поддержку Java из ОС, оставив нас слегка привязанными к нелюбимому, не поддерживаемому призраку в машине? Только я почти уверен, что Apple удалила приложение Java Preferences несколько лет назад, но это неважно. Путь выводится на стандартный вывод. По умолчанию, если никакие ограничения не соответствуют доступному списку виртуальных машин, используется порядок по умолчанию. Для фильтрации списка доступных виртуальных машин могут быть предусмотрены дополнительные ограничения. Он определяет этот путь из включенных и предпочитаемых JVM пользователя в приложении Java Preferences. возвращает путь, подходящий для установки переменной окружения JAVA_HOME. java_home || , который , согласно его странице || man ||: Еще немного поисков в Интернете показывает || , потому что я этого не сделал. Вы когда-нибудь видели что-нибудь подобное раньше? Но еще немного покопавшись в || Stack Overflow, можно предположить, что это приложения-заглушки ||, которые определяют версию используемой JVM. Заметь, все по-прежнему не складывается. Это не символические ссылки, так что это хорошо. || каталог мы можем видеть все наши знакомые Java-файлы. И если у нас есть возможность заглянуть в || JavaVM.framework, что ж, это что-то новенькое. Это не первое наше родео! Но этот файл имеет размер 74 байта, что, если вы спросите меня о контрольном сигнале, означает символическую ссылку. ОК. Итак, предположительно, наша оболочка будет указывать на наш каталог || java.home ||? Все выглядит радужно. Это последняя версия, и, к счастью, это не Oracle JDK. У нас установлена Java. Ладно, круто. И затем мы можем заглянуть внутрь нашего || java.home |||| системного свойства || изнутри || jshell || . Давайте начнем с самого начала: Вас предупредили. Погружение в его сердце тьмы – это гарантия того, что ты закончишь как Курц. Пристегнитесь, потому что спускаться через установку Java – это все равно, что смотреть Ктулху в лицо в течение двух недель. Где на самом деле установлена Java? Linux и Windows неизбежно будут отличаться друг от друга и, вероятно, будут иметь своих собственных гремлинов. Предостережение ||: это специфично для macOS прямо сейчас. Давайте разберемся с этим. Но почему? и ты будешь вести себя хорошо. ||/Библиотека/Java/JavaVirtualMachines/например || jdk-12.jdk || – в **tl;dr: || * скопируйте несжатый каталог OpenJDK – мне показалось, что || Тед Дэнсон || Стив Гуттенберг в/| Трое мужчин и ребенок || . OpenJDK || , насколько я могу судить, дает вам каталог нелюбимых двоичных файлов, в котором практически нет указаний на то, что вы должны с ними делать. Загрузка || В первый раз я быстро справился с установкой OpenJDK 12, и я даже не могу сказать вам, как я это сделал. Время для судебного путешествия. Первые шаги: абсолютные основы. В конце этой серии мы все должны иметь гораздо более четкое представление о том, что происходит под капотом всех наших инструментов, и гораздо больше уверенности в том, чтобы возиться с нашими сборками проектов. Затем мы перейдем к включению того же приложения с помощью Gradle, популярного инструмента сборки, и закончим включением нашего проекта в IntelliJ IDE. Приложение Hello World ||, использующее внешние библиотеки и несколько файлов, чтобы мы могли разобраться в стандартной структуре каталогов Java и в том, как создавать наше приложение из командной строки. В течение нескольких постов мы собираемся узнать немного больше о том, как Java устанавливается на нашей локальной машине, прежде чем создавать простой (и лишь несколько надуманный) || Поэтому, прежде чем начать свой второй проект Java, я хотел лучше понять, что, черт возьми, происходит. В принципе, я обнаружил, что понимание инструментария Java серьезно озадачивает. Нет, я называю это || падение со стилем || . Размахивая им? Я нажал достаточно кнопок в IntelliJ, чтобы все запустилось, и (к счастью) они запустились, и я провел остаток проекта, постоянно находясь в нежных объятиях IntelliJ. Хорошо, реальный разговор: я закончил свой первый Java-проект как, например, || полностью || профессиональный разработчик, не имея ни малейшего представления о том, ну, о чем-либо, связанном с экосистемой Java build/tooling. Начало работы со средой Java на macOS с пометкой beginners, java. Разве неправильно признавать, что я понятия не имею, как Java на самом деле установлена в моей системе?. Начало работы со средой Java на macOS para mais detalhes. Вежа о аркиво || ЛИЦЕНЗИЯ Esse projeto está sob a licença MIT. 📝 Лицензия на получение лицензии на использование Java для рекурсивной формы и на рекурсивную форму. Fatorial em Java, recursivo e não recursivo. franciscoao/fatorial-em-java Código fonte no Github: StackOverflowError || . consumir muita memória da máquina e ocorrera um erro conhecido por Então criaremos um metodo que retorne um inteiro e receba como parâmetro um valor para ser calculado, lembrando que qualquer metodo que não seja || пустота || реторная водоросль, доблесть или объект, нет особых условий для парада, или сея, quando esta кондисан для вердадейры, повторяющийся парад, с кондисаном парада для фальшивой реторны о месмо-методо в конце параметра в противоположность кондисану вердадейры, деве-се томар куидадо пара эста кондисан нао с торнаром ума повторяется бесконечно, се кондисан нунка для вердадейры о методе ира Для реализации форм рекурсивного теремоса, который может быть использован для расчета доблести. Запрос на саблю о том, как сделать нумеро 5 для рекурсивной формы: Рекурсивная форма Vamos вычислительный о том, как сделать нумеро 5 для интерактивной формы: Интерактивное взаимодействие Ола пессоал, ирей мострар алгумас формас де реализаторский em Java. F-em Java с тегами для начинающих, бразильские разработчики, java, учебное пособие. Фатальный интерактив… Ола пессоал, ирей мострар алгумас формас де реализар губернаторства на Яве. F) em Java Описанные выше шаги, если они будут выполняться прилежно, позволят вам внедрить распределенную трассировку в ваши архитектуры микросервисов и иметь возможность визуализировать ваши журналы через kibana и выполнять поиск по ним с помощью elasticsearch. Следующая конфигурация, которую нужно добавить, – это создать файл с именем logback.xml в папке ресурсов каждого микросервиса со следующим содержимым: Отправка журналов микросервиса в logstash требует добавления следующих зависимостей к каждому микросервису. ШАГ 7: Настройка микросервисов для отправки журналов в logstash При условии, что сервер zipkin отвечает на localhost на порту 9411, Затем добавьте следующее в файл yml каждого микросервиса на сервере конфигурации: Чтобы настроить zipkin, добавьте приведенную ниже зависимость к каждому микросервису pom.xml файл На самом деле, единственное, что вы нужно сделать, это добавить starter spring-cloud-starter-sleuth к зависимостям каждого отдельного микросервиса и шлюза. Сопоставлять журналы между различными микросервисами с помощью Spring Cloud Sleuth очень просто. ШАГ 6: Сопоставление журналов между различными микросервисами с помощью spring cloud sleuth и zipkin t сохраняет только порт запуска HTTP и URL-адрес Eureka.

В итоге мы обсудили 3 разных сервера приложений:

  • Undertow, от Red Hat/IBM: он известен своей легкостью, и у нас есть многолетний (хороший) опыт работы с ним.
  • Tomcat от Apache Software Foundation: безусловно, самый популярный вариант. Это также решение по умолчанию, поставляемое с Spring Boot.
  • Web flux от VMware: на самом деле это не сервер приложений, это Spring Web flux, работающий поверх Netty. Это подразумевает использование реактивных API, которые должны обеспечивать более высокую производительность и масштабируемость. Это совершенно другой подход, который также поддерживается Hipster.

Тестовые приложения

Я создал репозиторий performance benchmarks GitHub с приложениями, созданными JHipster.

Эти приложения более сложны и реалистичны, чем простые приложения “привет, мир”, созданные с помощью Spring Boot. Например, они используют Spring Security и Spring Boot Actuator: эти библиотеки повлияют на время запуска приложения и производительность, но это то, что вы бы использовали в реальном мире.

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

В репозитории GitHub/| вы найдете 4 каталога: по одному для каждого приложения и один с тестами производительности.

Использование виртуальных машин Azure для тестирования

Поскольку нам нужно было настроить тестовую среду, использование облака, очевидно, было лучшим решением! Для этого теста я создал 2 виртуальные машины с их собственной частной сетью.

Я использовал:

На одной из машин размещался сервер приложений, а другая использовалась для запуска набора тестов производительности.

Виртуальные машины были созданы с использованием образа Ubuntu, предоставленного по умолчанию Azure, на который я установил последнюю версию LTS AdoptOpenJDK JVM ( openjdk версии "11.0.6" 2020-01-14 ).

Чтобы легко настроить ваши виртуальные машины, я поддерживаю этот скрипт, который может вам пригодиться: https://github.com/jdubois/jdubois-configuration .

Время запуска

Время запуска сейчас в моде, но в JHipster мы обычно придаем большее значение производительности во время выполнения. Например, именно по этой причине мы используем Afterburner : это замедляет время запуска, но обеспечивает примерно на 10% более высокую производительность во время выполнения по сравнению с “обычным” приложением Spring Boot.

Вот результаты после 10 раундов для каждого сервера приложений:

5237 4285 4879 1
5125 4225 4847 2
5103 4221 4889 3
5129 4232 5013 4
5134 4271 484 5
5141 4191 5007 6
5214 4147 4868 7
5032 4251 4826 8
5069 4274 4856 9
5078 4128 4908 10
51262 42225 48933 Означать
4,76% -13,71% Разница

Как и ожидалось, Undertow легче, чем у конкурентов, но разница довольно невелика.

Тест производительности во время выполнения

Для нашей производительности во время выполнения нам нужен был определенный набор тестов.

Тест производительности был написан на Scala для инструмента нагрузочного тестирования Gatling . Они довольно просты (мы просто выполняем запросы POST и GET) и доступны здесь .

Этот тест выполняет следующее:

  • Каждый пользователь выполняет 100 запросов на получение и 100 запросов на отправку каждые 1,5 секунды.
  • У нас будет 10 000 пользователей, выполняющих эти запросы, с ускорением в 1 минуту.

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

Контрольные показатели производительности Undertow

Результаты Undertow были довольно хорошими: он мог обрабатывать всю нагрузку, не теряя ни одного запроса, и доставлял около 2700 запросов в секунду:

Время отклика было довольно медленным, и почти всем пользователям приходилось ждать около 3 секунд, чтобы получить ответ. Но он также был довольно стабильным (или “справедливым” для всех пользователей), поскольку 50-й процентиль не так уж далек от 99-го процентиля (или даже “максимального” времени!):

Контрольные показатели производительности Tomcat

У Tomcat было около 5% неудачных запросов:

Эти неудачи объясняют, почему приведенный ниже график выглядит не очень хорошо. Кроме того, он доставлял всего около 2100 запросов в секунду (по сравнению с 2700 запросами в секунду для Undertow).:

И последнее, но не менее важное: время отклика было хорошим примерно для 10% запросов, но оно было намного хуже, чем Undertow на 95-м и 99-м процентилях, что показывает, что он не мог правильно обрабатывать все запросы. Вот почему у него было такое плохое стандартное отклонение (2760 секунд!):

Контрольные показатели производительности Web flux

У Webflux было около 1% неудачных запросов:

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

Затем мы можем заметить, что после стабилизации Webflux имел некоторые странные вариации – вот почему мы видим все эти пики на синем графике ниже: он внезапно снизился с обработки почти 5000 запросов в секунду до менее чем 1000 запросов в секунду. В среднем он обрабатывал чуть более 2700 запросов в секунду, так что это то же самое, что и Undertow, но с большими вариациями, которых у Undertow не было.

Различия, которые мы заметили на предыдущем графике, также объясняют, почему по сравнению с Undertow Webflux имеет более низкий 50-й процентиль, но более высокий 95-й процентиль. И именно поэтому его стандартное отклонение намного хуже:

Вывод

Undertow определенно показал впечатляющие результаты в этих тестах! По сравнению с Tomcat оказалось, что он запускается быстрее, обрабатывает большую нагрузку, а также имеет гораздо более стабильную пропускную способность. По сравнению с Webflux, у которого совершенно другая модель программирования, разница была менее важной: Webflux запускался быстрее, но в начале теста имел 1% ошибок – похоже, у него были некоторые проблемы с обработкой нагрузки в начале, но это не было большой проблемой.

На Hipster это, вероятно, один из многих различных вариантов, которые мы сделали, которые делают приложения JHipster намного быстрее и стабильнее, чем классические приложения Spring Boot. Так что этот тест производительности, безусловно, очень важен для нашего будущего решения сохранить Undertow или отойти от него. Если вы хотите принять участие в обсуждении, потому что вы провели больше тестов или у вас есть какие-либо хорошие идеи, пожалуйста, не стесняйтесь комментировать наш тикет “Переход от Undertow” или этот пост в блоге.

Оригинал: “https://dev.to/azure/spring-boot-performance-benchmarks-with-tomcat-undertow-and-webflux-4d8k”