java - relativa - ¿Cómo ejecuto un contenedor ejecutable de arranque de primavera en un entorno de producción?
ruta de ejecucion (9)
El método de implementación preferido de Spring Spring es a través de un archivo jar ejecutable que contiene tomcat adentro.
Se inicia con un simple java -jar myapp.jar
.
Ahora, quiero implementar ese contenedor en mi servidor Linux en EC2, ¿me falta algo o realmente necesito crear un script de inicio para iniciar correctamente la aplicación como daemon?
Si simplemente llamo a java -jar
la aplicación muere cuando java -jar
la sesión.
Podría iniciarlo en pantalla o nohup pero no es muy elegante y un reinicio en mi servidor me obligaría a iniciar sesión y comenzar el proceso manualmente.
Entonces, ¿hay algo para la tarea en el arranque de primavera?
Comienzo las aplicaciones que quiero ejecutar de forma persistente o al menos de forma semipermanente a través de la pantalla -dmS NAME / path / to / script. Por lo que sé, esta es la solución más elegante.
Con mucho, la forma más fácil y confiable de ejecutar aplicaciones Spring Boot en producción es con Docker. Use Docker Compose, Docker Swarm o Kubernetes si necesita usar múltiples servicios conectados.
Aquí hay un Dockerfile
simple de la guía oficial de Spring Boot Docker para que comiences:
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" ]
Aquí hay una línea de comandos de muestra para ejecutar el contenedor como daemon:
docker run /
-d --restart=always /
-e "SPRING_PROFILES_ACTIVE=prod" /
-p 8080:8080 /
prefix/imagename
En el sistema operativo Windows sin servicio.
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
En un entorno de producción, desea que su aplicación se inicie nuevamente en un reinicio de máquina, etc., crear un script /etc/init.d/ y vincularlo al nivel de ejecución apropiado para iniciar y detener es el enfoque correcto. Spring Boot no se extenderá para cubrir esto ya que es una configuración específica del sistema operativo y hay toneladas de otras opciones, ¿quieres que funcione en una cárcel chroot, necesita detenerse / iniciarse antes que otro software, etc.
Esto es simple, puede usar el complemento maven de arranque de primavera para finalizar la implementación del código.
la configuración del complemento como:
<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>
Y, los jvmArtuments
son para ti jvm. profiles
elegirán un perfil para iniciar su aplicación. executable
puede hacer que tu aplicación funcione de forma directa.
y si agrega mvnw
a su proyecto, o si tiene un maven enveriment. Simplemente puede llamar a ./mvnw spring-boot:run
para mvnw o mvn spring-boot:run
para maven.
La aplicación de arranque My Spring tiene dos inicializadores. Uno para el desarrollo y otro para la producción. Para el desarrollo, utilizo el método principal de esta manera:
@SpringBootApplication
public class MyAppInitializer {
public static void main(String[] args) {
SpringApplication.run(MyAppInitializer .class, args);
}
}
Mi inicializador para el entorno de producción extiende el SpringBootServletInitializer y se ve así:
@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);
}
}
Yo uso gradle y mi archivo build.gradle aplica el plugin '' WAR ''. Cuando lo ejecuto en el entorno de desarrollo, utilizo la tarea bootrun . Donde como cuando quiero implementarlo en producción, utilizo assemble task para generar WAR y desplegar.
Puedo ejecutar como una aplicación de primavera normal en producción sin descontar las ventajas proporcionadas por el tomcat incorporado durante el desarrollo. Espero que esto ayude.
Puede usar la aplicación llamada Supervisor . En la configuración del supervisor, puede definir múltiples servicios y formas de ejecutarlos.
Para las aplicaciones de arranque de Java y Spring, el comando sería java -jar springbootapp.jar
.
Se pueden proporcionar opciones para mantener la aplicación ejecutándose siempre. Así que si el EC2 se reinicia, el Supervisor reiniciará su aplicación.
Encontré Supervisor fácil de usar en comparación con poner scripts de inicio en /etc/init.d/. Los scripts de inicio se colgarán o entrarán en estado de espera en caso de errores.
Si está utilizando gradle, puede agregarlo a su build.gradle
springBoot {
executable = true
}
Luego puede ejecutar su aplicación escribiendo ./your-app.jar
Además, puedes encontrar una guía completa aquí para configurar tu aplicación como un servicio
56.1.1 Instalación como un servicio init.d (Sistema V)
http://docs.spring.io/spring-boot/docs/current/reference/html/deployment-install.html
aclamaciones
Tenga en cuenta que desde Spring Boot 1.3.0.M1, puede crear archivos jar completamente ejecutables usando maven y gradle.
Para maven, solo incluye lo siguiente en tu pom.xml
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<executable>true</executable>
</configuration>
</plugin>
Para gradle agrega el siguiente fragmento a tu build.gradle
springBoot {
executable = true
}
Estos frascos totalmente ejecutables contienen un guión adicional en la parte frontal del archivo, que le permite vincular simbólicamente el contenedor de inicio de primavera con init.d o usar un script systemd
Ejemplo init.d:
$ln -s /var/yourapp/yourapp.jar /etc/init.d/yourapp
Esto le permite iniciar, detener y reiniciar su aplicación como:
$/etc/init.d/yourapp start|stop|restart
O use un script systemd
[Unit]
Description=yourapp
After=syslog.target
[Service]
ExecStart=/var/yourapp/yourapp.jar
[Install]
WantedBy=multi-user.target
Más información en el siguiente enlace: http://docs.spring.io/spring-boot/docs/1.3.0.BUILD-SNAPSHOT/reference/htmlsingle/#deployment-service