JuShaTa — это Java-контейнер, который обеспечивает модульное разделение и возможность горячей загрузки модулей.
Большинство разработчиков Java знакомы с Tomcat, поскольку ранее основным методом развёртывания приложений было упаковка их в WAR-файлы и размещение в директории webapps вместе с Tomcat. В контексте Tomcat каждый веб-приложение имеет свой экземпляр загрузчика классов, что позволяет изолировать классы и JAR-файлы каждого приложения от конфликтов между ними.
Конечно, после того как Spring/SpringBoot стали фактическим стандартом Java, стало возможным интегрировать встроенные контейнеры веб-серверов, такие как Tomcat или Jetty, прямо в приложение, позволяя ему запуститься. Преимущества такого подхода очевидны: депloiroment сразу же можно использовать для эксплуатации, что полностью соответствует идеологии DevOps.
Исправление ошибки в последнем слове:
Большинство разработчиков Java знакомы с Tomcat, поскольку ранее основным методом развёртывания приложений было упаковка их в WAR-файлы и размещение в директории webapps вместе с Tomcat. В контексте Tomcat каждый веб-приложение имеет свой экземпляр загрузчика классов, что позволяет изолировать классы и JAR-файлы каждого приложения от конфликтов между ними.
Конечно, после того как Spring/SpringBoot стали фактическим стандартом Java, стало возможным интегрировать встроенные контейнеры веб-серверов, такие как Tomcat или Jetty, прямо в приложение, позволяя ему запуститься. Преимущества такого подхода очевидны: деплоймент сразу же можно использовать для эксплуатации, что полностью соответствует идеологии DevOps.Однако, когда в одном Java-приложении содержится несколько сервисов Spring Boot, эти сервисы могут обращаться к различным версиям JAR-файлов. Это может привести к возникновению исключений типа NoSuchMethodException во время запуска или выполнения программы. Особенно если некоторые JAR-файлы имеют различные версии, проблемы могут возникнуть в продакшене из-за различных порядков загрузки этих JAR-файлов, что затрудняет диагностику и воспроизведение ошибок. Также возможно, что в разных сервисах есть бины с одинаковым именем, что вызывает конфликты при запуске.Поэтому мы предлагаем Java-контейнер JuShaTa, аналогичный Tomcat. В контейнере JuShaTa каждый сервис Spring Boot является самостоятельным модулем. Разделение осуществляется за счёт использования пользовательского загрузчика классов, где каждый модуль использует свой загрузчик классов для решения проблем с конфликтами JAR-файлов; а также через изоляцию контекста Spring, где каждому модулю соответствует свой контекст, чтобы решить конфликты бинов.
В повседневной разработке часто встречаются ситуации командной работы, когда одновременно работают несколько человек над одним или несколькими крупными проектами. Обычно практика состоит в том, чтобы разделить бизнес-функциональность на несколько подпроектов или микросервисов. При этом процесс разделения неизбежно сталкивается со следующими проблемами:* Размер сервисов слишком велик, что приводит к тому, что связанные слабо функции помещаются в один модуль, что противоречит принципу высокой внутренней связанности и низкой внешней связанности.
При размещении нескольких модулей внутри контейнера могут возникнуть следующие проблемы:
NoSuchMethodException
.xxxService
, то возникают конфликты бинов (хотя можно решить эту проблему путём установки свойства allowBeanDefinitionOverriding
, но это приведёт к новым проблемам).Поэтому контейнер должен решать эти две проблемы:
Устранять конфликты JAR-пакетов, используя пользовательскую реализацию ClassLoader
, где каждый модуль загружается отдельным экземпляром ClassLoader
.
Изолировать конфликты бинов, используя контексты Spring, где каждому модулю соответствует свой контекст, а контексты могут иметь зависимости друг от друга.#### 3. Динамическая загрузка
Контейнер предоставляет возможность горячей загрузки, периодически проверяя наличие модулей в указанной директории или через API контейнера для управления модулями.
Общая архитектура контейнера JuShaTa представлена ниже, где модули изолируются друг от друга с помощью ClassLoader и контекстов Spring.
pom.xml
проекта, скомпилируйте ваш Spring Boot проект в fat-jar и поместите его в определенную директорию, затем установите значение параметра "jushata.modules-file"
равным пути к этой директории для запуска проекта.<dependency>
<groupId>com.didiglobal.jushata</groupId>
<artifactId>jushata-boot</artifactId>
<version>1.0.0</version>
</dependency>
jushata-samples
для демонстрации примеров использования (перед тестированием выполните mvn package
для создания пакетов модулей):jushata-sample-standard
демонстрирует совместимость с нативными модулями Spring Boot Starter;jushata-sample-child1
и jushata-sample-child2
демонстрируют изоляцию контекста и классов в fat-jar модулях;Для получения более подробной информации о разработке см. Руководство разработчика.
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )