web-dev-qa-db-fra.com

Conteneur intégré ou fichier de guerre de démarrage initial dans un conteneur externe pour la production

Je suis parfaitement capable de configurer Spring Boot dans les deux cas. La question est de savoir lequel d’entre eux est le plus robuste et le plus recommandé, car je n’ai pas trouvé dans la documentation de Spring Boot la méthode recommandée pour le déployer dans un environnement de production. , mes préoccupations concernant l’utilisation du conteneur incorporé sont les suivantes:

  1. Si je veux le définir en tant que service Windows ou Linux, le fichier JAR est-il la meilleure option?
  2. Si j'utilise le fichier jar, je ne vais pas avoir accès au redémarrage du serveur.
  3. Peut-être que dans le futur, j'ai besoin de plus d'applications dans le même conteneur.
  4. Si je redémarre la machine, je dois exécuter à nouveau le fichier Java -jar.

La question générale est de savoir quel est le meilleur moyen d'utiliser le fichier jar et de l'exécuter en tant que Java -jar. Jarname.jar en production ou de modifier le conditionnement en war, définissez le Tomcat tel que fourni et définissez la guerre générée dans un Tomcat vide.

J'espère que vous pouvez m'aider.

---MODIFIER---

Plusieurs fois, la réponse dépend, il s’agit d’une application Web normale ou d’un service Web de repos. 

jar packaging est parfaitement adapté à la production et vous devriez plutôt vous replier sur war uniquement si vous en avez vraiment besoin - ce qui est souvent le cas lorsque vous ne pouvez pas contrôler votre environnement de déploiement (ce qui est souvent le cas). cas dans les grandes entreprises). 

Spring Boot Reference contient un chapitre sur la configuration d’une application Spring Boot en tant que service Unix/Linux/Windows: Installation des applications Spring Boot .

En ce qui concerne votre préoccupation:

Peut-être que dans le futur, j'ai besoin de plus d'applications dans le même conteneur.

Avec les conteneurs intégrés si vous avez besoin de plus d'applications s'exécutant sur la même machine, vous devez démarrer deux applications séparément, chacune fonctionnant sur un port différent. Vous obtiendrez ainsi deux conteneurs en cours d'exécution - ce qui est bien, les applications sont mieux isolées l'une de l'autre.

11
Maciej Walkowiak

Il y a environ un mois, la question ressemblait à la vôtre. Permettez-moi de vous faire part de ma conclusion:

1) JAR:

  • Vous pouvez exécuter indépendamment chaque application avec différents ports (sous linux, Java -jar ...> app_logs.log & ) et vous pouvez l’acheminer (par exemple, nginx). Notez que le redémarrage n'est pas un problème. Vous pouvez écrire un script bash personnalisé (comme ceci: ps aux | grep appname et kill par PID)
  • Mais il y a quelques problèmes avec la configuration de l'application de production. Les fichiers de propriétés seront archivés dans jar.

2) GUERRE

  • Vous pouvez déployer dans un conteneur et simplement l'exécuter. Gestion facile sur le serveur. Si vous souhaitez reconfigurer l'application, ouvrez le fichier de propriétés à partir du dossier non archivé dans le conteneur, modifiez-le selon vos besoins et redémarrez le conteneur. Ainsi, gérer et configurer sera facile.
  • Toutefois, si vous souhaitez exécuter une autre application sur ce serveur avec un autre port, vous devez installer une autre copie du conteneur et le configurer.

Donc, dans ma pratique, utiliser une application de guerre plus facile que jar à gérer et à reconfigurer.

2
Mirjalol Bahodirov

Une raison de plus pour utiliser le fichier "war" dans la production. Springboot a masqué une erreur que Jetty a jetée alors que WAR déployé dans Jetty l’a correctement saisi (bien que le problème ci-dessous soit encore à l’étude).

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

0
nondescript

Je ne sais pas grand chose au sujet des serveurs, mais ma recommandation est 

  • Si vous utilisez Monolithic application, utilisez plutôt war avec External Tomcat.

  • Si vous utilisez pour Micro Service applications, utilisez Tomcat intégré Avec un port différent. Et chaque application de service est Indépendante l’une de l’autre.

0
Mani Kasi
  1. Je ne connais pas grand chose aux services Windows, mais sous Linux, vous pouvez ajouter l’exécution d’un fichier jar à un script RC (et ainsi faire démarrer l’application à un certain niveau d’exécution). Pour une application de démarrage printanier, il vous suffit de créer un lien symbolique vers le fichier jar et vous pouvez démarrer/arrêter/etc comme tout autre service, voir: Application Spring Boot en tant que service

  2. redémarrer la machine ou la machine virtuelle Java? Un mécanisme d'arrêt est intégré à Spring Boot, il vous suffit de l'activer (et d'activer le mécanisme de sécurité afin que personne ne puisse le faire), voir: Comment arrêter correctement une application Spring Boot?

  3. Spring-Boot active les microservices - l’idée est donc d’avoir un conteneur Webapp intégré pour chaque application Web/microservice. Cela réduit le risque de perdre tous les services quand un seul baisse.

  4. Oui. et vous devez exécuter catalina.sh|bat start après chaque redémarrage. Ou vous ajoutez un script de démarrage approprié (voir 1.)

Je sens que vous préférez le faire à l'ancienne. Malgré la réponse «question de goût», il existe un argument de poids: la seule dépendance est la machine virtuelle! Le reste (le conteneur d'applications Web, les pilotes de base de données, d'autres bibliothèques) fait partie du paquet que vous livrez. Et si vous décidez de changer de conteneur pour la prochaine version, il en sera de même.

0
Andy