Spring загружать встроенный контейнер или файл войны во внешний контейнер для производства
Я полностью могу настроить весеннюю загрузку в обоих случаях, вопрос здесь в том, какие из них более надежны и рекомендуются, потому что я не нашел в документации весенней загрузки рекомендуемый способ развертывания в производственной среде. мои опасения по поводу использования встроенного контейнера:
- Если я хочу установить его в качестве службы Windows или Linux, лучше ли использовать файл jar?
- Если я использую файл jar, у меня не будет доступа для перезапуска сервера.
- Возможно, в будущем мне понадобится больше приложений в одном контейнере.
- Если я перезагружаю машину, мне нужно снова выполнить 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, используйте встроенные
кот с другим портом. И каждый микро сервис приложений
независимы друг от друга.