
Bonjour, Habr!
Le discours de Sebastian Dashner lors d'une rencontre Java au bureau d'IBM à Moscou (a trouvé un
record d'une performance similaire) m'a incité à commencer ma connaissance des serveurs d'applications légers, en particulier, avec OpenLiberty. Et puis j'ai pensé:
- Quels sont les avantages d'un serveur d'applications léger?
- Comment la spécificité du travail change-t-elle lors de leur utilisation?
- Pourquoi emballer un serveur d'applications dans un conteneur?
En répondant à ces questions, j'ai remarqué qu'il y avait peu d'informations publiques sur ce sujet, j'ai donc décidé de les collecter et de les systématiser ici.
Je poste les résultats sous la coupe.
Quels sont les avantages d'un serveur d'applications léger?
Auparavant, les serveurs d'applications Java EE d'entreprise (tels que JBoss AS, Oracle WebLogic, IBM WebSphere AS) étaient considérés comme une conception lourde et encombrante, en particulier en ce qui concerne les temps de démarrage et de déploiement. Mais la technologie cloud capture une part de plus en plus importante de l'industrie et les exigences des serveurs d'applications évoluent.
Et maintenant, au lieu de serveurs d'applications d'entreprise complets, viennent des serveurs d'applications rapides, modulaires et petits, concentrés sur une tùche spécifique:
Thorntail ,
Payara Micro - les jeunes frĂšres WildFly et Payara;
Meecrowave est un
serveur léger JAX-RS + CDI + JSON,
KumuluzEE est un serveur qui vous permet d'étendre Java EE en utilisant Node.js, Go et autres.
Cette liste comprend également OpenLiberty - un serveur d'applications open source (distribué selon EPL-1.0) qui prend en charge les derniÚres normes Java EE / Microprofile, sur lesquelles WebSphere Liberty fonctionne.
Aperçu des fonctionnalitĂ©s d'EPL-1.0 (licence publique Eclipse version 1.0)EPL 1.0 est basĂ© sur CPL et n'est pas compatible avec la GPL, vous permet de vous conformer aux autres licences et brevets qui sont utilisĂ©s dans le travail, et donne le droit de concĂ©der sous licence le produit sous toute autre licence, une copie de la licence doit ĂȘtre incluse dans toutes les copies du programme.
Les ajouts au produit principal peuvent ĂȘtre concĂ©dĂ©s sous licence sĂ©parĂ©ment et mĂȘme sous licence commerciale. Cependant, les modifications et les ajouts qui sont des Ćuvres dĂ©rivĂ©es doivent ĂȘtre concĂ©dĂ©s sous la mĂȘme licence EPL, ce qui vous oblige Ă ouvrir le code source.
Associer un projet logiciel à un code protégé par la licence EPL (par exemple, utiliser ce code comme bibliothÚque), en général, ne fait pas de ce projet un travail dérivé et n'impose pas d'obligations correspondantes.
Un membre qui inclut le programme dans un devis doit le faire afin d'éviter toute responsabilité potentielle pour les autres membres. (renonce expressément à toute garantie ou responsabilité au nom de tous les auteurs)
Par exemple: un participant peut inclure le programme dans un devis, produit X. Ce participant est alors un participant commercial. Si ce marchand fait ensuite des réclamations sur la vitesse ou offre des garanties de produits pour X, ces réclamations et offres sont la responsabilité personnelle du marchand. En vertu de cette section, le membre commercial doit protéger les autres membres contre les réclamations relatives à la performance et aux garanties, et si le tribunal exige que tout autre membre paie les dommages en résultant, le membre commercial doit payer ces pertes.
Voyons quels avantages nous pouvons obtenir en dĂ©ployant l'application dans un conteneur avec OpenLiberty. (Vous devez avoir installĂ© n'importe quelle version de java, des Ă©tapes supplĂ©mentaires doivent ĂȘtre effectuĂ©es dans le rĂ©pertoire wlp)
Vitesse:
La vitesse est l'indicateur le plus important pour une application cloud, car pour qu'une application cloud puisse Ă©voluer rapidement, gĂ©rer et faire face Ă la charge croissante, elle doit ĂȘtre lancĂ©e en quelques secondes. Un serveur d'applications lĂ©ger peut le faire. Pour vĂ©rifier,
téléchargez le serveur OpenLiberty et exécutez bin / server run (
liste complĂšte des commandes ):
$ bin/server run defaultServer (Open Liberty 19.0.0.6/wlp-1.0.29.cl190620190617-1530) Java HotSpot(TM) 64-Bit Server VM 1.8.0_212-b10 (ru_US) [AUDIT ] CWWKE0001I: defaultServer . [AUDIT ] CWWKZ0058I: dropins . [AUDIT ] CWWKF0012I: : [el-3.0, jsp-2.3, servlet-3.1]. [AUDIT ] CWWKF0011I: defaultServer . defaultServer 1,709 .
Modularité et flexibilité
La plupart des applications n'ont pas besoin de Java EE dans son ensemble, mais nécessitent un ensemble dédié de normes, le plus souvent utilisé dans les applications d'entreprise. Grùce à OSGI, nous pouvons choisir l'ensemble de normes Java EE et / ou MicroProfile dont nous avons besoin, en ignorant tout le reste.
Par exemple, déclarez JAX-RS depuis Java EE et mpHealth depuis Microprofile en ajoutant quelques lignes au bloc featureManager usr / servers /
serverName /server.xml
<?xml version="1.0" encoding="UTF-8"?> <server description="new server"> <!-- Enable features --> <featureManager> <feature>jsp-2.3</feature> <feature>mpHealth-1.0</feature> <feature>jaxrs-2.1</feature> </featureManager> <!-- To access this server from a remote client add a host attribute to the following element, eg host="*" --> <httpEndpoint id="defaultHttpEndpoint" httpPort="9080" httpsPort="9443" /> <!-- Automatically expand WAR files and EAR files --> <applicationManager autoExpand="true"/> </server>
Mise Ă jour dynamique
Pendant le développement, le code du programme et la configuration changent constamment.
Le serveur d'applications est configuré pour surveiller les modifications et, si nécessaire, reconfigure et déploie l'application à la volée. Par exemple, une réaction aux changements récents:
[AUDIT ] CWWKG0016I: . [AUDIT ] CWWKG0017I: 0,475 . [AUDIT ] CWWKF0012I: : [cdi-2.0, jaxrs-2.1, jaxrsClient-2.1, jndi-1.0, json-1.0, jsonp-1.1, mpHealth-1.0, servlet-4.0]. [AUDIT ] CWWKF0013I: : [servlet-3.1]. [AUDIT ] CWWKF0008I: 0,476 .
Taille et assemblage de l'image
La taille des serveurs d'applications a considérablement diminué et vous permet désormais de déployer
chaque application sur un serveur d'applications distinct pour les emballer dans des conteneurs, ce qui donne la plus grande flexibilité. De plus, puisque l'image est constituée de couches, lors du réassemblage et de la distribution d'artefacts, seule la couche d'application est copiée, le systÚme d'exploitation, le runtime et le serveur d'applications sont mis en cache.
Dockerhub a des images prédéfinies contenant un serveur OpenLiberty préconfiguré. Nous allons utiliser l'un d'eux et créer un Dockerfile:
FROM open-liberty COPY usr/servers/defaultServer /opt/ol/wlp/usr/servers/defaultServer ENTRYPOINT ["/opt/ol/wlp/bin/server", "run"] CMD ["defaultServer"]
Assemblons l'image:
docker build -t app .
Exécutez-le comme un conteneur:
docker run -d --name app -p 9080:9080 app
Vérifiez le résultat
http: // localhost: 9080 / health /
Pour arrĂȘter le conteneur:
docker stop app
Il existe de nombreux autres scénarios d'utilisation du conteneur, et en général, c'est une occasion pour des articles individuels, alors revenons aux questions.
Comment évolue la spécificité du travail?
Paquet de paquet
L'image du conteneur ne doit ĂȘtre collectĂ©e qu'une seule fois, puis exĂ©cutĂ©e dans tous les environnements. Par consĂ©quent, il est recommandĂ© de collecter chaque application avec le serveur d'applications. Cela simplifie le cycle de vie et le dĂ©ploiement des applications et s'intĂšgre parfaitement dans le monde moderne de la technologie des conteneurs.
Assemblage
Désormais, il n'est plus nécessaire de regrouper différents blocs techniques dans des archives distinctes. Toute la logique métier, ainsi que les services Web et les fonctionnalités de bout en bout, sont regroupés dans un seul fichier de guerre. Cela simplifie considérablement l'installation du projet, ainsi que la procédure d'assemblage. Vous n'avez plus besoin de regrouper l'application dans plusieurs niveaux de hiérarchie, puis de la décompresser à nouveau dans une instance de serveur.
Lancement
Le serveur d'applications et l'application elle-mĂȘme sont ajoutĂ©s Ă l'image pendant le processus de gĂ©nĂ©ration. La configuration potentielle des sources de donnĂ©es, des lecteurs ou des modules de serveur est Ă©galement spĂ©cifiĂ©e pendant le processus de construction en ajoutant des fichiers de configuration spĂ©cialisĂ©s. Toutes les diffĂ©rences de configuration doivent ĂȘtre gĂ©rĂ©es non pas de l'intĂ©rieur de l'application, mais de l'extĂ©rieur. Par consĂ©quent, l'application ne doit pas ĂȘtre dĂ©ployĂ©e dans un conteneur dĂ©jĂ en cours d'exĂ©cution, mais doit y ĂȘtre ajoutĂ©e au stade de l'assemblage d'images dans le rĂ©pertoire de dĂ©ploiement automatique afin de la lancer au dĂ©marrage du conteneur.
Extension de fonctionnalité
Les conteneurs, les systÚmes de déploiement et de mise à l'échelle, les services de surveillance et les grilles de services nous ont permis de configurer la détection, la surveillance, la gestion, l'authentification, la mise à l'échelle, le traçage, la stabilité au-dessus de l'application, transférant de maniÚre transparente une grande quantité de logique à un autre niveau, facilitant l'application et simplifiant son développement.
Pourquoi emballer un serveur d'applications dans un conteneur?
Tout d'abord, en emballant un serveur d'applications dans un conteneur, vous donnez Ă chaque Ă©quipe la possibilitĂ© de configurer indĂ©pendamment son serveur d'applications et de se concentrer sur la mise en Ćuvre des fonctions, ce qui fait gagner du temps aux dĂ©veloppeurs sur les opĂ©rations manuelles, les middlewares et diverses approbations.
En prime, vous avez la possibilitĂ© de profiter pleinement des avantages des conteneurs et de tous les outils construits autour d'eux. L'application est facile Ă gĂ©rer et Ă mettre Ă l'Ă©chelle, Ă mettre Ă jour et Ă automatiser l'assemblage et le dĂ©ploiement des artefacts avec aucun temps d'arrĂȘt.
Vous trouverez plus de pratique ici.En plus de la
documentation , le site Web du projet propose un grand nombre de didacticiels: comment créer des applications Web avec maven / gradle, empaqueter et déployer des applications, déployer et configurer des microservices dans kubernetes, gérer le trafic avec istio et déployer sur
IBM Cloud Ă partir d'autres fournisseurs de cloud populaires et bien plus.
Sebastian Dashner (passionné de Java & OSS, Java Champion, IBMer, membre JCP, committer Jakarta EE) publie des articles utiles sur la façon d'utiliser OpenLiberty, tels que la
surveillance d'Open Liberty avec Prometheus et Grafana , dans son
blog et son livre
Architecting Modern Java EE Applications a été utilisé dans la préparation de cet article.
Liberty-maven-plugin (alternative Ă
gradle ) peut grandement simplifier votre travail. Soit dit en passant, les manuels contiennent de bons exemples de son utilisation.
Vous pouvez également contribuer au
projet .