Подтвердить что ты не робот

Как запустить загрузочную банку spring в производственной среде?

Spring предпочтительный метод развертывания загрузки - через исполняемый файл jar, который содержит tomcat внутри.

Запускается с простым java -jar myapp.jar.

Теперь я хочу развернуть эту банку на моем Linux-сервере на EC2, мне что-то не хватает или мне действительно нужно создать init script для правильного запуска приложения в качестве демона?

Если я просто вызываю java -jar, приложение умирает, когда я выхожу из системы.

Я мог бы запустить его на экране или nohup, но это не очень элегантно, и перезагрузка на моем сервере заставит меня войти в систему и запустить процесс вручную.

Итак, есть ли что-то уже для задачи в spring boot?

4b9b3361

Ответ 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