Comment déployer les services ?
Comment gérer la configuration des services ?
Comment analyser l'enchaînement des appels ?
Comment connaître l'état de l'application ?
Une application Java dans un assemblage de services Cloud
Permet d'exécuter un service dans multiples environnements sans modifications
Plusieurs stratégies
Profils
spring.profiles.active
SPRING_PROFILES_ACTIVE
Permet de charger un fichier application-{profile}.properties
en plus du application.properties
.
Exemples: application-local.properties
et application-prod.properties
contenant
des ports/connexions BDD différentes.
Variables d'environnement
Toutes les properties Spring peuvent être surchargées par des variables d'environnement
.
sont remplacés par des _
._
Variables d'environnement
Exemples:
server.port=8080
➡️ SERVER_PORT=8080
trainer.service.username=vegeta
➡️ TRAINER_SERVICE_USERNAME=vegeta
trainer.serviceUrl=https://someurl:8080
➡️ TRAINER_SERVICE_URL=https://someurl:8080
Interpolation de properties
Il est possible dans des properties d'en utiliser d'autres
trainer.service.host=someHost
trainer.service.port=8080
trainer.service.url=https://${trainer.service.host}:${trainer.service.port}
Dans un environnement load-balancé, les requêtes d'un utilisateur peuvent être traitées par n'importe quel serveur.
Dans un environnement cloud, on ne peut pas forcément accéder aux machines pour consulter les fichiers de log.
Dans un environnement conteneurisé, on ne peut pas forcément accéder aux logs des containers (kubernetes...)
On envoie tous les logs dans un service dédié
Pour rendre les logs _requêtables_, ils sont souvent parsés :
2023-11-28T14:05:57.429+01:00 INFO 62385 --- [ main] c.miage.altea.tp.trainer_api.TrainerApi : Started TrainerApi in 2.891 seconds (process running for 3.219)
On configure parfois les loggers pour émettre du JSON directement utilisable en centralisation.
Produit connus :
Stack "ELK"
Observer la séquencialité des appels
Observer les logs d'un même utilisateur
Trouver des points de contention
Aide au debugging
Correlation des appels via des Headers HTTP
Création d'un id pour chaque requête reçue
Transmission de l'id à chaque requête envoyée
Envoi des traces à un outil centralisé
Spring Cloud Sleuth permet de gérer ces correllation (il modifie les RestTemplate pour transmettre ces fameux headers).
Zipkin permet de collecter/consulter ce type d'information
Observer la santé des services
Métriques métier (~analytics)
Exposition des métriques dans une application spring-boot
Utilisation de spring-boot-actuator
Expose des métriques basiques de nos applications/api
Comme pour les logs, les métriques peuvent être envoyées à un serveur dédié pour être consultées
Centralisation des métriques
Même principe que pour les logs
Produits connus :
Stack "Prometheus/Grafana"
Agir en fonction des métriques
Pris en charge par les orchestrateurs de containers (kubernetes par exemple)