WildFly Presentation
WildFly Presentation
WildFly Presentation
FORMATION
WILDFLY -
Administration
JPA
JMX
Business Container
Physical Service Layer JAAS
server 2 Local EJB Session
Remote EJB Session
Message Driven Bean JAX-WS
Other
Physical
EIS Topic/ Legacy
Queue Database LDAP
servers Tier System
• JPA (Java Persistence API)
Mapper des objets Java vers des tables de base de données et vice versa (Mapping O/R)
JPA est une spécification qui a plusieurs implémentations ; Hibernate, EclipseLink ,OpenJPA etc
…
• JSON
Une API Java pour parser, transformer et requêter des données JSON.
• WebSocket
Une API Java pour intégrer les WebSockets dans Java EE.
• Concurency
A partir de JEE 7 il est possible d’exécuter des tâches en parallèle dans un conteneur JEE , chose
qu’était dangereuse avant.
Utilisation du ManagedExecutorService comme étant une resource gérée par le conteneur pour
exécuter des tâches asynchrones.
• JTA (Java Transaction API)
Une API pour gérer les transactions, elle permet de créer , commiter et rollbacker les
transaction.
JTA peux gérer plusieur resources transactionelles comme exemple une base de données et un
serveur JMS.
L’implémentation de JTA est fournie par le serveur d’application mais il est possible d’inclure
une gestionnaire de transactions JTA dans une application standalone.
• Batch
Batch Processing for Java Platform a été introduit à partir de JEE 7.
Définit une modèle de programmation pour les applications Batch (Job, Step, Item Reader, Item
Processor, Item Writer ) largement inspirer de Spring Batch.
Les typologies des applications Java EE
• Application WEB Java EE
Java
Servlets JSP JSF EL JSTL
Bean
Managed
EJB JAX-RS JAX-WS JPA
Bean
Prérequis de l’installation
Installation de WildFly
Démarrage de WildFly
Création d’un Administrateur
Arrêt de WildFly
Installation de WildFly en Service
Prérequis d’installation WildFly
Il est recommandé d’utiliser JDK 9 ou plus.
Téléchargement JDK 12
https://www.oracle.com/technetwork/java/javase/downloads/index.html
WildFly Labs-1
Installer JDK dur C:\WildFlyTraing\tools\java\jdk-12
Créer la variable d’environnement JAVA_HOME
Installation WildFly
Téléchargement WildFly http://www.wildfly.org
Dé-zipper l’archive sous C:\WildFlyTraing\tools\server\wildfly-16
Créer la variable d’environnement $JBOSS_HOME =
C:\WildFlyTraing\tools\server\wildfly-16
Structure des répertoires WildFly
Deux parties principales : une pour le mode serveur standalone et l’autre pour le mode
serveur domaine.
Le répertoire modules est commun entre les deux et il contient le cœur du système.
appclient est utilisé pour démarrer un conteneur léger de de wildfly pour déployer des
applications afin de leur permettre d’utiliser les services WildFly tel que Dependency
Injection (DI)
bin contient les scripts de démarrage et leur de fichiers de configuration ainsi que plusieurs
scripts utilitaires tel que add-user.bat. Dans le sous-répertoire client se trouve le jar
nécessaire pour les clients non-maven.
docs/schema contient les schémas xsd de définitions des fichiers xml de configuration.
doc/examples/config contient quelques exemples de configuration en mode standalone.
modules contient tous les modules installés dans le serveur d’application.
standalone contient les fichiers de configuration, le répertoire de déploiement et d’autre
zone modifiable comme les logs utilisés par le server en mode standalone.
domaine contiens les fichiers de configuration , le répertoire de déploiement et d’autre
zone modifiable comme les logs utilisés par le serveur en mode domain.
welcome-content contient les ressources utilisées (html, images) par l’application web.
Démarrer WildFly
Il existe deux modes de serveur standalone et domain
La différence n’est pas au niveau des fonctionnalités mais eu niveau du management du
serveur d’application.
le mode domaine est utilisé pour gérer plusieurs instances de WildFly à partir d’un seul
point d’entrée.
WildFly Labs-2
/standalone.bat
/domain.bat
WildFly-Labs 3
Créer un administrateur
En suivant les étapes affichées
Arrêter WildFly
La manière recommandée est d’utiliser le Command Line Interface (CLI)
Pour le faire , juste exécuter la commande jboss-cli.bat dans le répertoire $JBOSS_HOME/bin.
WildFly-Labs 4
Mode Remote
Si vous êtes connectez à un serveur distant alors un mot de passe est nécessaire pour exécuter la
commande CLI
Installation de WildFly en Service sous Windows
WildFly peut être installé comme un service pour qu’il soit lancé automatiquement au
démarrage de la machine.
WildFly-Labs 5
Dans le mode standalone chaque instance du serveur est un process indépedant, les
fichiers de configuration sont dans $JBOSS_HOME/standalone/configuration
Dans le mode domaine vous pouvez lancer plusieurs serveurs d’application et les
gérer à partir d’un point central. Un domaine pourrais se composer de plusieurs
machine (physique ou virtuelle). Chaque machine peut avoir plusieurs instances du
serveur d’application qui sont sous le contrôle d’un du process Host Controller, les
fichiers de configuration sont dans $JBOSS_HOME/domain/configuration
Les deux outils de configuration
La console d’administration
Il existe une autre manière de configurer le serveur par modification directe du fichier XML de
configuration, il n’est pas recommander de l’utiliser car peut générer des erreurs au démarrage
du serveur d’application.
Comprendre les éléments de configuration du
serveur
Dans cet exemple, si le serveur est installé dans /opt alors le path sera traduit en /opt/wildfly-
14.0.0.Final/standalone/data/example
Interfaces
Les interfaces contient la configuration des adresses IP ou les noms des serveurs sur lesquels le serveur
d’application peut être exposé.
Deux interfaces réseaux sont définis par défaut : management et public.
L’interface management est utilisé pour l’administration du serveur (comme par exemple CLI)
L’interface public est utilisé pour accéder au services du serveur d’application.
Dans cette exemple les interfaces public et management sont exposé respectivement aux propriétés
system jboss.bind.address.management et jboss.bind.address, il est possible de les modifier au
démarage par
L’attribut jboss.socket.binding.port-offset sert à décaler les définitions de port avec un nombre fixe,
dans le cas où plusieurs instances tournent sur la même machine.
System Properties
Les propriétés système peuvent être configurés dans les scripts de démarrage ou dans
le fichier de configuration.
Il est possible de définir les propriétés système par les outils de management ou
passer un argument au script de démarrage
Si la liste des propriétés est longue, il est possible de les définir dans un fichier et les
charger au r du serveur d’application
Profile
Un profile est un ensemble de subsystems, chaque subsystem est une collection de
fonctionnalités du serveur d’application.
WildFly-Labs 6
WildFly-Labs 7
Socket Binding permet de modifier les ports utilisés par les interfaces.
Il y a deux types de Socket Binding : Inbound pour les connections entrantes et
Outbound pour les connections sortantes comme par exemple les connections mail
pour envoyer des mails à l’extérieure.
WildFly-Labs 9
WildFly-Labs 10
Par ailleurs , il peut pointer sur une autre référence déjà définie :
Configuration WildFly en mode Domain
Un domaine est un ensemble de groupes de serveurs.
Un groupe de serveurs est un ensemble de serveurs.
Un groupe de serveurs est souvent utilisé pour associer une configuration unique à un
ensemble de serveurs : profile , paramètres JVM, sockets bindings ou applications
déployées.
Du point de vue process, un domaine se compose :
① Master Controller
Host Controller 1
Host Controller 2
Configuration WildFly en mode Domain
Part3 : host.xml du slave
Ensuite, nous avons besoin de spécifier comment le Host Controller se connectera au
Domain Controller
En plus nous spécifions l’utilisateur qui sera utilisé pour se connecter au Domain
Controller, c’est l’utilisateur wildflyadmin qu’on a créé avant.
Finalement , nous spécifions le mot de passe qui sert à identifier l’utilisateur auprès
du Domain Controller (server identity)
La dernière étape est de définir les serveurs de chaque host :
Host Controller 1
Host Controller 2
Notez le flag auto-start qui indique que le serveur ne sera pas démarré
automatiquement au démarrage du Host Controller
Le port-offset sert à éviter les conflits de port , avec ce paramètre on peut utiliser le
même socket binding group pour plusieurs serveurs sur le même host.
Avec cette configuration , nous allons pouvoir démarrer les Host Controller
Host Controller 1
Host Controller 2
Si vous regardez la console du Domain Controller (le master), vous verrez que les deux
host controllers sont connéctés.
Cette configuration à donné l’architecture suivante:
Jboss.domain.master.address= 127.0.0.2
Jboss.domain.master.port:9999
Administration de WildFly en Mode Domain
WildFly- Labs 12
Se connecter au domain controller via CLI :
Par exemple changer le time-out des EJB dans le subsystem ejb3 inclus dans le profile
full
Administration des serveurs du domaine
Il est possible d’effectuer les opérations suivantes sur les nœuds (serveur
d’application) : start, stop, suspend, resume et restart
Configuration : C’est la partie la plus importante qui permet de configurer les services
offerts par le serveur d’application.
Runtime : Permet de consulter les statistiques sur les services en cous d’exécutions ou
les statistiques de la JVM du serveur d’application.
Access Contrôl : Permet de définir les rôles d’autorisation qui contrôlent l’accès au
serveur d’application et ses ressources.
Une règle générale (valable aussi pour la configuration à plusieurs niveaux comme System
Properties, Path et Interfaces) , la configuration la plus spécifique prime sur la
configuration la plus générale, par exemple la configuration de la JVM Server Group prime
sur la configuration du Host alors que la configuration Server prime sur celle du Server
Group.
Configuration de la JVM du Host
Configuration de la JVM du Host
Ci-dessous la JVM par défaut que vous pouvez modifier la configuration ou rajouter
d’autres JVM pour le Host en question.
Configuration de la JVM du Server Group
Configuration de la JVM du Server Group
Ci-dessous la JVM par défaut que vous pouvez modifier la configuration ou rajouter
d’autres JVM pour le Server Group en question.
Configuration de la JVM du Serveur
Configuration de la JVM du Serveur
Ci-dessous la JVM par défaut que vous pouvez modifier la configuration ou rajouter
d’autres JVM pour serveur en question.
Quand La Console Admin est bien utile ?
Dans certains cas La console d’admin est bien plus pratique plus que CLI :
C’est une approche qui est réalisable uniquement dans le mode standalone, si vous
voulez installer dans un mode domaine il vaut mieux utiliser les interface managements
(la console d’admin ou CLI
WildFly-Lab 15
Copier l’exemple fourni avec le support de la formation example-war dans le
répertoire $JBOSS_HOME/standalone/deployments
Vérifier que l’application est disponible dans les trois serveurs du main-server-group
Server-one Server-three
Server-five
Déploiement via CLI
Le déploiement via CLI se fait via la commande deploy.
Voici comment déployer en mode standalone :
Si l’application est présente sur d’autre server group , il ne faut pas supprimer
l’artifcat dans le repository :
Déploiement de DataSource
La configuration de DataSource se fait par le subsystème datasource qui utilise la couche
JCA (Java Connector Architecture) du serveur d’application.
Pour commencer, nous avons besoin d’installer une base de données , pour cela nous
utiliserons une image docker MYSQL:
Déploiement de DataSource via CLI
en mode Standalone
La création d’une datasource via CLI est pratique lorsque nous avons besoin de créer
l’arborescence du module du driver.
CLI est recommandé aussi si nous voulons préparer un script qui sera automatisé.
La commande suivante installe le module com.mysql
Vous pouvez vérifier que la datasource a été correctement installée par la commande
suivante :
Déploiement de DataSource via CLI
en mode Domaine
La commande CLI add module n’est pas disponible en mode domaine, par conséquent, il
est recommandé de créer le module manuellement sur chaque host en copiant le fichier
jar avec son fichier module.xml dans le répertoire modules, par exemple pour le driver
MySQL JBOSS_HOME/modules/com/mysql/main/
En mode domaine , le Host Controller envoie ses logs vers le fichier host-controller.log
Le Process Controller lancé par le Host Controller envois ses logs vers process-controller.log
Chaque serveur du domaine envoie ses logs vers
JBOSS_HOME/domain/servers/[servername]/server.log
Les Log Handlers
Un Handler reçoit les logs et les exportent vers une destination.
Il est existe deux Handlers par défaut : le Console Handler qui log vers la console du serveur
et le Periodic Rotation File Handler qui log vers un fichier selon un rotation basée sur le
temps.
Il existe huit types de handlers :
Console Handler : log vers la console du serveur.
File : log vers un fichier sans contraintes de temps ou de taille.
Periodic : log vers un fichier selon la contrainte de rotation basée sur le temps.
Size : : log vers un fichier selon la contrainte de rotation basée sur la taille.
Periodic/Size : log vers un fichier selon la contrainte de rotation basée sur le temps ou
quand le fichier atteint une certaine taille.
Async : log vers un fichier d’une manière asynchrone , ce qui permet d’optimiser les
performances.
Custom : Permet d’implémenter sa propre Class de Logging (extends
java.util.logging.Handler)
SysLog : Permet de logger vers le Syslog (journal d’événements) du système d’opération.
Les Log Handlers
Voici les différents Log Handlers configurés par défaut dans la Web Console.
Les Log Handlers
La configuration par defaut du Periodic Handler
Ajouter un Log Handler
Size Rotating Handler
Ajouter un Log Handler
Size Rotating Handler
Cliquez sur le boutton Add pour ajouter un Size Rotating Log Handler
Ajouter un Log Handler
Size Rotating Handler
Renseignez les attributs du Handler et cliquez sur Add :
Ajouter un Log Handler
Size Rotating Handler
Associez le log handler ajouté au Root Logger
Ajouter un Log Handler
Size Rotating Handler
Vérifiez que le nouveau fichier de log existe bien :
Lire les fichiers logs via CLI
Il est possible de lire les fichiers logs du serveur via CLI
Lire les fichiers logs via CLI
Une autre option intéressante est de filtrer le contenu du fichier log selon certains
paramètres, comme par exemple lire les 10 premières lignes du log :
Configurer Log4J pour les applications
Il ne faut pas dépasser 50% de la mémoire physique pour laisser assez de mémoire au
système d’exploitation.
Dans les systèmes 64 bits , il ne faut pas aller au-delàs de 32 GB car cela réduit la
performance du CPU et pénalise le GC, en règle générale 26GB est la valeur idéale.
Le Xms a moins d’impact sur la performance, si votre SLA (Service Level Agreement) n’est
pas strict , il est recommandé de lui attribuer la même valeur que Xmx pour éviter le
gaspillage des ressources VM pour augmenter le Heap.
JVM – Trouver les bons paramètres
Le Java Heap est la mémoire alloué à l’application Java, elle partagée entre les threads.
Quand elle n’est plus utilisée , elle est supprimée par le Grabage Collector.
Configurée via le –Xms option qui définit la taille initiale du Heap et le –Xmx qui définit la
taille maximale du Heap
La valeur du Xmx doit être assez suffisante pour éviter que le Garbage Collecor passe
beaucoup de temps de s’exécuter et pénaliser l’exécution de l’application.
En pratique , observer le Heap de l’application en cours de test de charges, supposons que le
pic atteint est de 1G, alors il faut rajouter de 25% à 30% pour laisser un peu de marge à la
JVM
Il ne faut pas dépasser 50% de la mémoire physique pour laisser assez de mémoire au
système d’exploitation.
Dans les systèmes 64 bits , il ne faut pas aller au-delàs de 32 GB car cela réduit la
performance du CPU et pénalise le GC, en règle générale 26GB est la valeur idéale.
Le Xms a moins d’impact sur la performance, si votre SLA (Service Level Agreement) n’est
pas strict , il est recommandé de lui attribuer la même valeur que Xmx pour éviter le
gaspillage des ressources VM pour augmenter le Heap.
HEAP – Choisir les bon rations
Young Generation est l’espace où les nouveaux objets sont créés, quand il est plein , une
Minor garbage collecion est déclenchée,
Une phase très rapide si le taux de mortalité des nouveaux objets est élevé.
Old Generation est l’espace des anciens objets survivants au plusieurs passages du GC,
quand il est plein une Major garabage collection est déclenchée.
Cette phase est assez lente car elle concerne tous les objets survivants.
Metaspace est un espace pour stocker les metadata des classes et methodes.
Pour les applications Web , il est intéressant de spécifier un espace Young Generation assez
large car la plupart des objets ne survivent pas longtemps (scope request).
En règle générale du 1/3 à 1/2 du heap est la taille optimale, cela ne doit pas dépasser la
moitié car ça devient improductif.
Utiliser les options NewSize et MaxNewSize pour spécifier l’espace Youn Gen et
SurvivorRatio pour définir le ratio avec l’espace Youn Gen.
Choisir le bon Garbage Collector
Garbage Collector passe par trois étapes :
1. Mark : Définir les objets en vie et les objets morts (non référencés)
2. Sweep/Delete : Supprimer les objets morts.
3. Compacting : Eliminer les fragments et déplacer les objets d’une manière contiguë.
Parallel Collector : Il utilise les CPUs de la machine pour s’exécuter en parallèle mais il est
aussi « Stop The World » Colllector car il arrête toutes les autres applications pendant le GC.
Il se déclenche quand le Heap est à 90% de sa taille maximale.
Pour l’activer, il faut utiliser l’option suivante :
-XX:+UseParNewGC : pour une exécution en parallèle.
-XX:UseParallelGC : Pour les Heap de grande taille (plus que 10 GB)
Il est recommandé dans pour les applications qui qui tournent sur des machines
multiprocesseurs et demandent un bon Throughput et n’ont pas de contraintes de latence.
CMS (Concurent Mark Sweep) Garbage Collector : Il utilise plusieurs threads pour s’exécuter
en parallèle avec l’application.
Réduit juste un peu le temps de réponse mais il dégrade pas la performance globale de
l’application.
Il n’attend pas que le Heap soit plein car il tourne tout le temps.
Activé par l’option -XX:+UseConcMarkSweepGC
Il est recommandé dans les cas suivants :
La JVM possède assez de mémoire (entre 1 et 16 GB)
Responsive Applications (Exemple : Applications financières)
G1 Garbage Collector (Garbage First) : Il est conçu pour les applications qui tournent dans
des machines multi-processor avec un grand Heap, il est inclut à partir de JDK 7u4.
Il remplace CMS comme collector par défaut à partir de JDK 9.
Il est le mélange des deux collectors (CMS et Parllel).
Une première phase de Marking en parallèle pour désigner les objets vivants et les objets
morts.
Ensuite il commence par supprimer les objets morts (Garbage First) , après il fait une
défragmentation de l’espace (Compacting).
Pour l’activer , utiliser l’option -XX:+UseG1GC
Il est recommandé pour les Heaps de plus de 16GB bien qu’il minimise aussi le temps de
réponse/latence.
Plugin Visual GC
DataSource Tuning
Ouvrir une connexion à une base de donnée distance coute en terme de temps et
ressources système.
Pour cette raison chaque serveur d’application doit implémenter un pool de connections
pour minimiser ce cout de création de connexion.
DataSource Tuning
Activer les statistiques de datasource:
Si le peak-concurrent-invocations est
égale à pool-max-size alors il faut
augmenter la valeur slsb-strict-max-
pool ou mdb-strict-max-pool (en
fonction du type de EJB ) :
EJB Thread Tuning
Par défaut les EJB sont des composant synchrones mais il est possible de les invoquer d’une
manière asynchrone via un Thread.
Un Thread EJB utilise un Thread Pool Executor qui alloue un thread pour chaque tâche à
exécuter.
Un pool de threads a un core size et une queue , quand une tâche arrive, si le nombre de
threads en cours d’exécution est moins que le core size alors une nouveau thread est créé
sinon la tâche est mise dans la queue.
Voici comment récupérer les statistiques du pool de threads :
Objectifs de la sécurisation.
Sécurisation des interfaces d’administration.
Gestion des autorisations et des authentifications pour
les applications.
Sécurisation des échanges avec SSL.
Les Objectifs
L'authentification : L'authentification consiste à assurer l'identité d'un utilisateur,
c'est-à-dire de garantir à chacun des correspondants que son partenaire est bien
celui qu'il croit être. Un contrôle d'accès peut permettre (par exemple par le moyen
d'un mot de passe qui devra être crypté) l'accès à des ressources uniquement aux
personnes autorisées.
L’autorisation : Limiter l’accès à des ressources à un groupe bien définit
d’utilisateurs ce qui assure que ces derniers possèdent bien les permissions
nécessaires d’effectuer des opérations ou d’accéder à des données.
La confidentialité : consiste à rendre l'information inintelligible à d'autres
personnes que les seuls acteurs de la transaction.
L'intégrité : Vérifier l'intégrité des données consiste à déterminer si les données
n'ont pas été altérées durant la communication (de manière fortuite ou
intentionnelle).
La disponibilité ou La Qualité du Service (QoS) : L'objectif de la disponibilité est de
garantir l'accès à un service ou à des ressources.
La non-répudiation : La non-répudiation de l'information est la garantie qu'aucun
des correspondants ne pourra nier la transaction.
Sécurisation des interfaces d’administration
Quand une application est déployée , elle est associée avec le security domain « Other» qui
utilise le ApplicationRealm.
Remoting login module est utilisé en interne quand une connexion remoting est reçue
(généralement des appels EJB).
RealmDirect login module est utilisé quand ce n’est pas une Remoting connexion
(généralement une authentification d’une application web).
RealmDirect module est le plus simple des modules d’authetification et il est utilisé quand la
connexion n’est pas de type Remoting.
Pas besoin de configuration d’un store d’identité car il repose sur le ApplicationRealm
Facile à rajouter d’autre utilisateurs via la commande add-user.
Après avoir définit la sécurité du serveur, il est temps de sécuriser l’application
La configuration se fait dans deux endroits :
168