Официально выпущен Spring Boot 3.2 с множеством новых функций, доступных прямо из коробки!
Официально выпущен Spring Boot 3.2 с множеством новых функций, доступных прямо из коробки!

Привет всем, я Букай Чен~

Spring Boot 3.2 Выпущено вчера, давайте воспользуемся Java 21、GraalVM ивиртуальный потокприди и попробуй。

Spring Boot 3.2 поддерживает:

  • Java 21
  • виртуальный поток
  • Собственные образы (Spring Boot поддерживает собственные образы GraalVM в производственных средах с момента выпуска Spring Boot 3.0 в ноябре 2022 г.)

Java 21

Мы с нетерпением ждем выхода Java 21, который выйдет 19 сентября 2023 года, а Spring Boot 3.2 уже полностью поддерживается.

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

виртуальный поток

Одно из наиболее важных обновлений — виртуальный. поток, это Project Loom Предусмотренные функции. Мы не будем вдаваться в подробности, это официально. JEP Дано хорошее объяснение:

https://openjdk.org/jeps/444

GraalVM и собственные образы

GraalVM — это высокопроизводительный JDK, который использует альтернативный JIT-компилятор для повышения производительности приложений на основе Java и JVM.

Native Image Это своего рода аванс Java код Технология, которая компилируется в отдельный исполняемый файл (называемый собственным образом). Исполняемый файл включает класс прикладной программы, классы в его зависимостях, классы библиотеки времени выполнения и классы из JDK Статическая привязка собственного кода. его там нет Java VM Он работает в другой системе времени выполнения, но содержит необходимые компоненты из разных систем времени выполнения, такие как управление памятью, планирование потоков и т. д. и JVM Полученная программа имеет более быстрое время запуска и меньшие затраты памяти во время выполнения, чем

Попробуйте что-то новое

Начнем с установки Java 21.0.1 graal. Самый простой способ — использовать SDKMAN и указать его в качестве версии Java по умолчанию для вашего компьютера:

  • sdk install java 21.0.1-graal
  • sdk default java 21.0.1-graal

Другой способ установки — загрузка вручную.

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 Установите свойство в файле:

код Язык:javascript
копировать
spring.threads.virtual.enabled:true

Что делает эта конфигурация:

  • Tomcat буду использоватьвиртуальный поток для обработки HTTP просить. Это означает обработку Web Запрошенный программный код приложения (например, метод в контроллере) будет находиться в виртуальном Бежать по потоку。
  • При вызове метода @Async Spring MVC Асинхронная обработка запросов и Spring WebFlux Поддержка выполнения блокировки теперь будет использовать виртуальный поток
  • Методы с пометкой @Scheduled будут находиться в виртуальном режиме. Бежать по потоку

Итак, мы попробуем использовать это 3 интеграция для достижения виртуального поток。

также,Некоторые конкретные интеграции будут реализованы в виртуальном потоке.,Например RabbitMQ/Kafka слушатель, и Spring Data Redis/Apache pulsar Сопутствующие интеграции. Однако эти интеграции выходят за рамки этой статьи. Желающие могут обратиться к . Spring Boot 3.2 Официальный пример.

код

1. Для входящих HTTP-запросов от Tomcat создаём простой контроллер:

код Язык:javascript
копировать
@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» при запуске приложения.

код Язык:javascript
копировать
@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 секунд.

код Язык:javascript
копировать
@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());
    }
}

Давайте запустим наше приложение:

код Язык:javascript
копировать
./gradlew bootRun

и позвоните в нашу конечную точку

код Язык:javascript
копировать
curl — Расположение — просить GET 'localhost:8085/test'

Что мы получаем:

код Язык:javascript
копировать
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: (эта команда может занять несколько минут). Затем запустить: (используйте имя вашего приложения вместо «приложение»)

код Язык:javascript
копировать
./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 замените блок "синхронизировать"), будьте осторожны виртуальный поток будет использовать логику.

boy illustration
Mybatis-plus использует typeHandler для преобразования объединенных строк String в списки списков.
boy illustration
Не удалось установить программное обеспечение Mitsubishi. Возможно, возникла проблема с реестром.
boy illustration
Разрешение ошибок проекта SpringBoot 3 mybatis-plus: org.apache.ibatis.binding.BindingException: неверный оператор привязки
boy illustration
Более краткая проверка параметров. Для проверки параметров используйте SpringBoot Validation.
boy illustration
Поиграйтесь с интеграцией Spring Boot (платформа запланированных задач Quartz)
boy illustration
Несколько популярных режимов интерфейса API: RESTful, GraphQL, gRPC, WebSocket, Webhook.
boy illustration
Redis: практика публикации (pub) и подписки (sub)
boy illustration
Подробное объяснение пакета Golang Context
boy illustration
Краткое руководство: создайте свое первое приложение .NET Aspire
boy illustration
Краткое обсуждение метода пакетной вставки MyBatis: обработка 100 000 фрагментов данных занимает всего 2 секунды.
boy illustration
[Инструмент] Используйте nvm для управления переключением версий nodejs, это так здорово!
boy illustration
HTML можно преобразовать в word_html для отображения текстовых документов.
boy illustration
Статья Spring Security 6.x для быстрого понимания принципов настройки
boy illustration
Не забудьте изменить имя каждого модуля RUOYI один раз, чтобы избежать мошенничества ~~~
boy illustration
Научите вас шаг за шагом, как интегрировать систему обслуживания клиентов Hunyuan AI Q&A от 0 до 1.
boy illustration
Подробное объяснение Gzip: принципы и применение алгоритмов сжатия.
boy illustration
Скачать Tomcat - ссылка для скачивания на официальном сайте tomcat7, tomcat8, tomcat9
boy illustration
Развертывание IIS.NetCore
boy illustration
[Оптимизация памяти Android] Общие функции инструмента Android Profiler (мониторинг памяти | снимок памяти)
boy illustration
Встроенная в Springboot пользовательская конфигурация временного каталога, связанного с Tomcat.
boy illustration
Краткое руководство по началу работы с Element-UI
boy illustration
Руководство пользователя ГОРМ
boy illustration
Одна статья для понимания артефакта развязки внутренних компонентов Spring Event (событие Spring)
boy illustration
Java перехватывает строку после определенного символа_java, как перехватить строку
boy illustration
Давайте кратко поговорим о технологии копирования на записи.
boy illustration
Выполнение собственных условий SQL-запроса в MyBatis Plus
boy illustration
Напоминание о выпуске общедоступной учетной записи WeChat (интерфейс сообщения шаблона общедоступной учетной записи WeChat)
boy illustration
5 шагов для установки среды протокола
boy illustration
Наиболее полные коды состояния HTTP
boy illustration
На основе языка Go мы шаг за шагом научим вас внедрять структуру системы управления серверной частью.