Як запустити виконувану банку з пружинним завантаженням у виробничому середовищі?


105

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

Це починається з простого java -jar myapp.jar.

Тепер я хочу розгорнути цю банку на моєму сервері Linux на EC2, чи мені щось не вистачає чи мені дійсно потрібно створити сценарій init, щоб правильно запустити програму як демон?

Якщо я просто зателефоную, java -jarпрограма загине, коли вийду з системи.

Я міг би запустити його на екрані чи nohup, але це не дуже елегантно, і перезапуск на моєму сервері змусить мене ввійти та запустити процес вручну.

Отже, чи є вже щось для завдання у весняному завантаженні?


1
nohup / screen (брудний метод), init / systemd / upstart (належний метод)

@RC Так, я знаю, як я вже згадував, / sbin / init зі спеціальним сценарієм в /etc/init.d, зробив би цю роботу, але чи справді ідея, що кожен повинен створити свій власний сценарій для управління демон (запуск, зупинка, перезапуск, стан)? Відчувається, що щось не вистачає в цьому рішенні.
Клібер Гонкалвес

Я відчуваю, що у весняних черевиках чогось не вистачає (це дійсно "свіжий" проект btw), просто зверніться до відповідальної команди та зробіть еволюційну пропозицію.

Ну, якщо ви генеруєте архів війни, ви можете використовувати версію вашого дистрибутива на Tomcat, в якій буде готовий сценарій init. З іншого боку, якщо ви використовуєте підхід до виконуваного файлу jar, ви повинні придумати власний сценарій init. Не впевнений, чи це в царині завантаження, але явно відсутнє, що начебто дивно, тому я запитую у випадку, якщо я щось пропустив. Буде пінг їх.
Клібер Гонкалвес

1
Ознайомтесь із наявними дискусіями та ідеями.
Дейв Сайер

Відповіді:


96

Зверніть увагу, що починаючи з 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
}

Повна виконувана банка містить додатковий скрипт в передній частині файлу, що дозволяє просто символізувати вашу банку Spring Boot init.dабо використовувати systemdсценарій.

init.d приклад:

$ln -s /var/yourapp/yourapp.jar /etc/init.d/yourapp

Це дозволяє запустити, зупинити та перезапустити програму, наприклад:

$/etc/init.d/yourapp start|stop|restart

Або скористайтеся systemdсценарієм:

[Unit]
Description=yourapp
After=syslog.target

[Service]
ExecStart=/var/yourapp/yourapp.jar
User=yourapp
WorkingDirectory=/var/yourapp
SuccessExitStatus=143

[Install]
WantedBy=multi-user.target

Більше інформації за наступними посиланнями:


4
Вам також може знадобитися зробити, $ chmod +x /etc/init.d/yourappщоб мати можливість запустити / зупинити / перезапустити
Rohith Nandakumar

Ви завжди повинні надавати користувачеві послуги дозвіл на читання та виконання файлу jar. Вам також потрібно налаштувати Java за замовчуванням для серверів та змінних середовища Java, щоб вони працювали.
Мікаро

Це не працює! Я спробував це, і я отримав таку помилку: Не вдалося запустити MyApp.service: Блок MyApp.service не знайдено
Martijn Hiemstra

9

На сьогодні найпростіший і надійний спосіб запуску програм Spring Boot у виробництві - це Docker. Використовуйте Docker Compose, Docker Swarm або Kubernetes, якщо вам потрібно використовувати декілька підключених служб.

Ось простий Dockerfileз офіційного керівництва Spring Boot Docker, щоб розпочати:

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

3

У моїй програмі Spring boot є два ініціалізатори. Один для розвитку, а інший для виробництва. Для розробки я використовую такий основний метод:

@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 . Де, як коли я хочу розгорнути його на виробництво, я використовую завдання збирання для створення ВІЙНИ та розгортання.

Я можу працювати як звичайне весняне застосування у виробництві, не знижуючи переваг, які надає вбудований Tomcat під час розвитку. Сподіваюся, це допомагає.


2

У виробничому середовищі ви хочете, щоб ваш додаток було запущено знову при машинному перезапуску тощо, створивши сценарій /etc/init.d/ та зв’язавшись із відповідним рівнем запуску та зупинившись, це правильний підхід. Spring Boot не поширюватиметься на покриття цього, оскільки це специфічна установка для операційної системи і є тоннами інших варіантів, чи хочете ви, щоб він працював у в'язниці chroot, чи потрібно його зупиняти / запускати перед деяким іншим програмним забезпеченням тощо.


2

Ви можете використовувати програму під назвою Supervisor . У конфігурації супервізора ви можете визначити кілька служб та способи їх виконання.

Для програм Java та Spring для завантаження команда була б java -jar springbootapp.jar.

Можна надати варіанти, щоб програма завжди працювала. Якщо EC2 перезавантажиться, то Supervisor перезапустить вашу програму

Я вважав, що Supervisor простий у використанні порівняно з розміщенням сценаріїв запуску в /etc/init.d/. Сценарії запуску зависають або переходять у стан очікування у разі помилок.


2

Якщо ви використовуєте gradle, ви можете просто додати це до свого build.gradle

springBoot {
    executable = true
}

Потім можна запустити свою програму, ввівши ./your-app.jar

Також тут ви можете знайти повний посібник, щоб налаштувати додаток як послугу

56.1.1 Встановлення як послуга init.d (система V)

http://docs.spring.io/spring-boot/docs/current/reference/html/deployment-install.html

ура


Насправді це виявляється, це повинно бути bootRepackage { executable = true }див. Docs.spring.io/spring-boot/docs/current/reference/html/…
Філіп

2

В ОС 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

1

Я запускаю програми, які хочу запускати наполегливо або принаймні напівперманентно через екран -dmS NAME / path / to / script. Наскільки мені відомо, це найелегантніше рішення.


0

Це простий, ви можете використовувати плагін весняного завантаження 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до свого проекту, або у вас є сприятливе середовище. Ви можете просто зателефонувати ./mvnw spring-boot:runна mvnw або mvn spring-boot:runна maven.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.