Как запустить загрузочную банку spring в производственной среде?
Spring предпочтительный метод развертывания загрузки - через исполняемый файл jar, который содержит tomcat внутри.
Запускается с простым java -jar myapp.jar
.
Теперь я хочу развернуть эту банку на моем Linux-сервере на EC2, мне что-то не хватает или мне действительно нужно создать init script для правильного запуска приложения в качестве демона?
Если я просто вызываю java -jar
, приложение умирает, когда я выхожу из системы.
Я мог бы запустить его на экране или nohup, но это не очень элегантно, и перезагрузка на моем сервере заставит меня войти в систему и запустить процесс вручную.
Итак, есть ли что-то уже для задачи в spring boot?
Ответы
Ответ 1
Обратите внимание, что с Spring Boot 1.3.0.M1 вы можете создавать полностью исполняемые баночки, используя maven и gradle.
Для maven просто включите следующее в свой pom.xml
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<executable>true</executable>
</configuration>
</plugin>
Для gradle добавьте следующий фрагмент к вашему build.gradle
springBoot {
executable = true
}
Эти полностью исполняемые банки содержат дополнительный script в начале файла, который позволяет просто символизировать ваш загрузочный jar файл Spring для init.d или использовать systemd script
пример init.d:
$ln -s /var/yourapp/yourapp.jar /etc/init.d/yourapp
Это позволяет запускать, останавливать и перезапускать приложение, например:
$/etc/init.d/yourapp start|stop|restart
Или используйте systemd script
[Unit]
Description=yourapp
After=syslog.target
[Service]
ExecStart=/var/yourapp/yourapp.jar
[Install]
WantedBy=multi-user.target
Дополнительная информация по следующей ссылке:
http://docs.spring.io/spring-boot/docs/1.3.0.BUILD-SNAPSHOT/reference/htmlsingle/#deployment-service
Ответ 2
В моем загрузочном приложении Spring есть два инициализатора. Один для развития, другой для производства. Для разработки я использую основной метод следующим образом:
@SpringBootApplication
public class MyAppInitializer {
public static void main(String[] args) {
SpringApplication.run(MyAppInitializer .class, args);
}
}
Мой инициализатор для рабочей среды расширяет SpringBootServletInitializer и выглядит следующим образом:
@SpringBootApplication
public class MyAppInitializerServlet extends SpringBootServletInitializer{
private static final Logger log = Logger
.getLogger(SpringBootServletInitializer.class);
@Override
protected SpringApplicationBuilder configure(
SpringApplicationBuilder builder) {
log.trace("Initializing the application");
return builder.sources(MyAppInitializerServlet .class);
}
}
Я использую gradle, а в файле build.gradle применяется плагин WAR. Когда я запускаю его в среде разработки, я использую задачу bootrun. Где, когда я хочу развернуть его для производства, я использую собирать задачу для создания WAR и развертывания.
Я могу работать как обычное приложение Spring в производстве без дисконтирования преимуществ, предоставляемых встроенным котом при разработке. Надеюсь, это поможет.
Ответ 3
В рабочей среде вы хотите, чтобы ваше приложение запускалось снова при перезагрузке компьютера и т.д., создав /etc/init.d/ script и связавшись с соответствующим уровнем запуска для запуска и остановки, это правильный подход. Spring Загрузка не будет распространяться на это, так как это специфическая настройка операционной системы, а также тонны других параметров, вы хотите, чтобы она работала в тюрьме chroot, нужно ли останавливаться/запускать перед другим программным обеспечением и т.д.
Ответ 4
Если вы используете gradle, вы можете просто добавить это в свой build.gradle
springBoot {
executable = true
}
Затем вы можете запустить приложение, набрав. /your -app.jar
Кроме того, вы можете найти полное руководство для настройки своего приложения как службы
56.1.1 Установка в качестве службы init.d(System V)
http://docs.spring.io/spring-boot/docs/current/reference/html/deployment-install.html
веселит
Ответ 5
На сегодняшний день самым простым и надежным способом запуска Spring Загрузочных приложений в производстве является Docker. Используйте Docker Compose, Docker Swarm или Kubernetes, если вам нужно использовать несколько подключенных сервисов.
Вот простой Dockerfile
из официального Spring Руководство по загрузке докеров, чтобы начать работу:
FROM frolvlad/alpine-oraclejdk8:slim
VOLUME /tmp
ADD YOUR-APP-NAME.jar app.jar
RUN sh -c 'touch /app.jar'
ENV JAVA_OPTS=""
ENTRYPOINT [ "sh", "-c", "java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar /app.jar" ]
Здесь пример командной строки для запуска контейнера в качестве демона:
docker run \
-d --restart=always \
-e "SPRING_PROFILES_ACTIVE=prod" \
-p 8080:8080 \
prefix/imagename
Ответ 6
Я запускаю приложения, которые я хочу запустить настойчиво или, по крайней мере, полу-постоянно через экран -dmS NAME/path/to/ script. Насколько мне известно, это самое элегантное решение.
Ответ 7
Вы можете использовать приложение Supervisor.
В конфигурации супервизора вы можете определить несколько служб и способы их выполнения.
Для приложений загрузки Java и Spring команда будет
java -jar springbootapp.jar
.
Параметры могут быть предоставлены, чтобы поддерживать работу приложения всегда. Поэтому, если перезапуск EC2 затем Supervisor перезапустит ваше приложение
Я нашел Supervisor простым в использовании по сравнению с установкой сценариев запуска в /etc/init.d/. Сценарии запуска зависали или переходили в состояние ожидания в случае ошибок.
Ответ 8
Это просто, вы можете использовать плагин w760 для загрузки maven для завершения развертывания кода.
Конфигурация плагина:
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<jvmArguments>-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=${debug.port}
</jvmArguments>
<profiles>
<profile>test</profile>
</profiles>
<executable>true</executable>
</configuration>
</plugin>
И, jvmArtuments
добавляет для вас jvm. profiles
выберет профиль для запуска вашего приложения. executable
может сделать ваше приложение бесцельно запущенным.
и если вы добавите mvnw
в свой проект или у вас есть maven enveriment. Вы можете просто вызвать ./mvnw spring-boot:run
для mvnw или mvn spring-boot:run
для maven.
Ответ 9
В ОС Windows без обслуживания.
start.bat
@ECHO OFF
call run.bat start
stop.bat:
@ECHO OFF
call run.bat stop
run.bat
@ECHO OFF
IF "%1"=="start" (
ECHO start myapp
start "myapp" java -jar -Dspring.profiles.active=staging myapp.jar
) ELSE IF "%1"=="stop" (
ECHO stop myapp
TASKKILL /FI "WINDOWTITLE eq myapp"
) ELSE (
ECHO please, use "run.bat start" or "run.bat stop"
)
pause