Spring загружать встроенный контейнер или файл войны во внешний контейнер для производства

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

  1. Если я хочу установить его в качестве службы Windows или Linux, лучше ли использовать файл jar?
  2. Если я использую файл jar, у меня не будет доступа для перезапуска сервера.
  3. Возможно, в будущем мне понадобится больше приложений в одном контейнере.
  4. Если я перезагружаю машину, мне нужно снова выполнить Java -jar.

В общем, вопрос в том, что лучше использовать файл jar и запускать его как java -jar jarname.jar в производственном процессе или изменить упаковку на war, установить tomcat как предусмотрено и установить сгенерированную войну в пустой tomcat.

Я надеюсь, что вы можете мне помочь.

--- EDIT ---

Много раз ответ зависит, это для обычного веб-приложения или веб-службы REST.

Ответ 1

Упаковка

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

В Spring "Справочник по загрузке" содержится ссылка на настройку Spring приложения на основе загрузки как службы Unix/Linux/Windows: Установка Spring Загружать приложения.

Относительно вашей озабоченности:

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

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

Ответ 2

Примерно месяц назад у меня возник вопрос вроде твоего. Позвольте мне поделиться своим заключением:

1) JAR:

  • Вы можете запускать независимо каждое приложение с разными портами (в linux, java -jar... > app_logs.log &), и вы можете маршрутизировать его (например, nginx). Обратите внимание, что перезапуск не является проблемой. Вы можете написать пользовательский bash script (например: ps aux | grep appname и убить с помощью PID)
  • Но есть некоторые проблемы с настройкой производственного приложения. Файлы свойств будут заархивированы в банку.

2) WAR

  • Вы можете развернуть контейнер и запустить его. Простое управление на сервере. Если вы хотите перенастроить приложение, откройте файл свойств из unarchived папки внутри контейнера, измените его по мере необходимости и перезапустите контейнер. Таким образом, управление и настройка будут легкими.
  • Но если вы хотите запустить другое приложение на этом сервере с другим портом, тогда вы должны установить еще одну копию контейнера и настроить его.

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

Ответ 3

  • Я не так много знаю о службах Windows, но в Linux вы можете добавить выполнение баннера в RC-скрипты (и, таким образом, запустить приложение на определенном уровне выполнения). Для загрузочного приложения spring вам просто нужно символически привязать к банке, и вы можете запустить/остановить/etc, как и любую другую услугу, см. Spring Загрузка приложения как службы

  • перезапустить машину или JVM? Механизм выключения встроен в загрузку spring, вам просто нужно активировать ее (и вы должны включить механизм обеспечения безопасности, чтобы никто не мог этого сделать): Как завершить работу spring Загрузите приложение правильно?

  • Spring -Boot включает микросервисы - поэтому идея состоит в том, чтобы иметь один встроенный webapp-контейнер для каждого webapp/microservice. Это снижает риск потери всех сервисов, когда падает только один.

  • Да. и вы должны выполнить catalina.sh|bat start после каждого перезапуска. Или вы добавляете соответствующий запуск script (см. 1.)

Я чувствую, что вы предпочитаете это старомодно. Несмотря на ответ "вопрос вкуса", есть один аргумент про-jar: единственная зависимость - это JVM! Остальные (веб-приложение-контейнер, db-драйверы, другие библиотеки) являются частью пакета, который вы доставляете. И если вы решите изменить контейнер для следующего выпуска, так оно и будет.

Ответ 4

Еще одна причина использовать "военный" файл в производстве. Springboot замаскировала ошибку. Jetty бросил, тогда как WAR, развернутый в Jetty, правильно поймал ее (хотя проблема ниже все еще находится на рассмотрении)

https://github.com/spring-projects/spring-boot/issues/8917#issuecomment-294673487

Ответ 5

Я мало что знаю о серверных вещах, но я рекомендую

  • Если вы используете монолитное приложение, лучше использовать войну с внешний кот.

  • Если вы используете для приложений Micro Service, используйте встроенные кот с другим портом. И каждый микро сервис приложений независимы друг от друга.