Привет всем, я Букай Чен~
Spring Boot 3.2 Выпущено вчера, давайте воспользуемся Java 21、GraalVM ивиртуальный потокприди и попробуй。
Spring Boot 3.2 поддерживает:
Мы с нетерпением ждем выхода Java 21, который выйдет 19 сентября 2023 года, а Spring Boot 3.2 уже полностью поддерживается.
Как уже говорилось, Java 21 обеспечивает тысячи улучшений производительности, стабильности и безопасности, включая улучшения платформы, чтобы помочь разработчикам стать более продуктивными и стимулировать инновации и рост во всей организации.
Одно из наиболее важных обновлений — виртуальный. поток, это Project Loom Предусмотренные функции. Мы не будем вдаваться в подробности, это официально. JEP Дано хорошее объяснение:
https://openjdk.org/jeps/444
GraalVM — это высокопроизводительный JDK, который использует альтернативный JIT-компилятор для повышения производительности приложений на основе Java и JVM.
Native Image Это своего рода аванс Java код Технология, которая компилируется в отдельный исполняемый файл (называемый собственным образом). Исполняемый файл включает класс прикладной программы, классы в его зависимостях, классы библиотеки времени выполнения и классы из JDK Статическая привязка собственного кода. его там нет Java VM Он работает в другой системе времени выполнения, но содержит необходимые компоненты из разных систем времени выполнения, такие как управление памятью, планирование потоков и т. д. и JVM Полученная программа имеет более быстрое время запуска и меньшие затраты памяти во время выполнения, чем
Начнем с установки Java 21.0.1 graal. Самый простой способ — использовать SDKMAN и указать его в качестве версии Java по умолчанию для вашего компьютера:
Другой способ установки — загрузка вручную.
https://www.graalvm.org/downloads/
Мы будем использовать страницу Spring Initializr для создания нового проекта Spring Boot с зависимостями Spring Boot 3.2.0, Java 21, Gradle-Groovy и Spring Web и собственной поддержкой GraalVM.
быть в Spring Boot 3.2 включено ввиртуальный поток, нам просто нужно application.yml или application.properties Установите свойство в файле:
spring.threads.virtual.enabled:true
Что делает эта конфигурация:
Итак, мы попробуем использовать это 3 интеграция для достижения виртуального поток。
также,Некоторые конкретные интеграции будут реализованы в виртуальном потоке.,Например RabbitMQ/Kafka слушатель, и Spring Data Redis/Apache pulsar Сопутствующие интеграции. Однако эти интеграции выходят за рамки этой статьи. Желающие могут обратиться к . Spring Boot 3.2 Официальный пример.
1. Для входящих HTTP-запросов от Tomcat создаём простой контроллер:
@RestController
@RequestMapping("/test")
public class TestController {
private static final Logger log = LoggerFactory.getLogger(TestController.class);
@GetMapping
public void test() {
log.info("Rest controller method has been called {}", Thread.currentThread());
}
}
2. Асинхронные задачи
Мы вызовем его метод «run» при запуске приложения.
@Component
public class AsyncTaskExecutorService {
private static final Logger log = LoggerFactory.getLogger(AsyncTaskExecutorService.class);
@Async
public void run() {
log.info("Async task method has been called {}", Thread.currentThread());
}
}
3.Запланированные задачи по времени
Простой метод, вызываемый каждые 15 секунд.
@Component
public class SchedulerService {
private static final Logger log = LoggerFactory.getLogger(SchedulerService.class);
@Scheduled(fixedDelayString = "15000")
public void run() {
log.info("Scheduled method has been called {}", Thread.currentThread());
}
}
Давайте запустим наше приложение:
./gradlew bootRun
и позвоните в нашу конечную точку
curl — Расположение — просить GET 'localhost:8085/test'
Что мы получаем:
Starting AppApplication using Java 21.0.1 with PID 38126
Started AppApplication in 1.131 seconds (process running for 1.491)
Async task method has been called VirtualThread[#52,task-1]/runnable@ForkJoinPool-1-worker-5
Scheduled method has been called VirtualThread[#46,scheduling-1]/runnable@ForkJoinPool-1-worker-1
Rest controller method has been called VirtualThread[#62,tomcat-handler-0]/runnable@ForkJoinPool-1-worker-1
Scheduled method has been called VirtualThread[#46,scheduling-1]/runnable@ForkJoinPool-1-worker-1
Мы видим, что журналы нашего метода связаны с общедоступным пулом потоков ForkJoinPool.
Согласно JEP: Ожидаемое поведение:
JDK извиртуальный Программа диспетчеризации потока украдена ForkJoinPool, который начинается с FIFO режим работы. Степень параллелизма для планирования программы доступна для виртуального планирования. Количество платформ для потокнить.
Теперь давайте запустим его на GraalVM.
Сначала нам нужно создать собственный образ GraalVM: (эта команда может занять несколько минут). Затем запустить: (используйте имя вашего приложения вместо «приложение»)
./gradlew nativeCompile
./build/native/nativeComplie/app
Он также работает и имеет гораздо более быстрое время запуска, что согласуется с утверждением: «Полученная программа имеет более быстрое время запуска и меньшие затраты памяти во время выполнения по сравнению с JVM».
Здесь вы можете найти исходный код репозитория, содержащего код, используемый в этой статье:
https://github.com/egor-ponomarev/spring-boot3.2-with-graalvm-virtual-threads-example
Spring Boot 3.2 Это то, чего мы ждали! Есть виртуальный Собственный образ потока позволяет нам написать программу, которая предоставляет Go аналогичные уровни производительности и масштабируемости, что позволяет поддерживать JVM сильная экосистема.
Однако нужно учитывать, что не все библиотеки адаптировали свой код для работы с виртуальными. поток нормальный Работа (в большинстве случаев используется ReentrantLock замените блок "синхронизировать"), будьте осторожны виртуальный поток будет использовать логику.