it-roy-ru.com

Spring boot встроенный контейнер или файл war во внешний контейнер для производства

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

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

В целом вопрос заключается в том, какой лучше использовать файл jar и выполнять его как Java -jar jarname.jar в производственном процессе или изменить упаковку на war, установить Tomcat как предоставленный и установить сгенерированную войну в пустой Tomcat.

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

---Правка---

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

14
Alejandro Agapito Bautista

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

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

Что касается вашего беспокойства:

Может быть, в будущем мне нужно больше приложений в том же контейнере.

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

11
Maciej Walkowiak

Около месяца назад у меня был такой же вопрос, как и у вас. Позвольте мне поделиться своим выводом:

1) JAR:

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

2) ВОЙНА

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

Так что в моей практике использовать приложение war проще, чем jar, чтобы управлять им и переконфигурировать.

2
Mirjalol Bahodirov

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

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

0
nondescript

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

  • Если вы используете Monolithic application, лучше использовать war с External Tomcat.

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

0
Mani Kasi
  1. Я не так много знаю о службах Windows, но в Linux вы можете добавить выполнение jar к RC-сценариям (и, таким образом, заставить приложение запускаться на определенном уровне выполнения). Для приложения с весенней загрузкой вам просто нужно вставить символическую ссылку на jar, и вы можете запускать/останавливать/etc, как и любой другой сервис, см .: Приложение Spring Boot как служба

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

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

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

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

0
Andy