Littlewing : Ajouter un mode « maintenance » à votre API grâce à Spring boot
jeudi 10 juin 2021 à 17:01Quand vous avez une API, et a fortiori une application, il peut être parfois nécessaire de passer l’application en mode « maintenance ».
Pour certaines applications il est parfois inutile de le traiter au niveau applicatif, car ça peut être pris géré par certaines couches de sécurité ou frontaux web par ex. (Apache HTTPD, WAF,…)
Kubernetes a introduit ( ou popularisé ) les notions de « probes » et plus particulièrement les livenessProbes et readinessProbes.
Le premier nous indique si l’application est en état de fonctionnement, le second nous permet de savoir si cette dernière est apte à recevoir des requêtes (ex. lors d’un démarrage).
Je vais exposer dans cet article comment utiliser au mieux ces probes et les APIs SPRING pour intégrer dans une API un mode « maintenance »
Stack utilisée
Dans l’exemple que j’ai développé, j’ai pu utiliser les briques suivantes:
- OpenJDK 11.0.10
- Spring Boot 2.5.0 (web, actuator)
- Maven 3.8.1
Bref, rien de neuf à l’horizon
Configuration de Spring Actuator
Pour activer les différents probes, vous devez activer Actuator.
Dans le fichier pom.xml, vous devez ajouter le starter correspondant:
org.springframework.boot spring-boot-starter-actuator
Puis vous devez déclarer ces differentes propriétés:
management.endpoints.enabled-by-default=true management.health.livenessstate.enabled=true management.health.readinessstate.enabled=true management.endpoint.health.show-details=always management.endpoint.health.probes.enabled=true management.endpoint.health.enabled=true
Après avoir redémarré votre application, vous pourrez connaître son statut grâce à un appel HTTP
curl -s http://localhost:8080/actuator/health/readiness
Comment récupérer le statut des probes?
Avec Spring, vous pouvez modifier les différents statuts avec les classes ApplicationEventPublisher et ApplicationAvailability.
Par exemple, pour connaître le statut "Readiness"
vous pouvez exécuter le code suivant:
@ApiResponses(value = { @ApiResponse(responseCode = "200", description = "Checks if the application in under maitenance")}) @GetMapping public ResponseEntityretreiveInMaintenance() { var lastChangeEvent = availability.getLastChangeEvent(ReadinessState.class); return ResponseEntity.ok(new MaintenanceDTO(lastChangeEvent.getState().equals(ReadinessState.REFUSING_TRAFFIC), new Date(lastChangeEvent.getTimestamp()))); }
Et la modification ?
Grâce à la même API, on peut également modifier ce statut dans via du code:
@ApiResponses(value = { @ApiResponse(responseCode = "204", description = "Put the app under maitenance")}) @PutMapping public ResponseEntityinitInMaintenance(@NotNull @RequestBody String inMaintenance) { AvailabilityChangeEvent.publish(eventPublisher, this, Boolean.valueOf(inMaintenance) ? ReadinessState.REFUSING_TRAFFIC : ReadinessState.ACCEPTING_TRAFFIC); return ResponseEntity.noContent().build(); }
Conclusion
On a pu voir comment intéragir simplement avec les APIS SPRING pour gérer le statut de l’application pour répondre à cette question :Est-elle disponible ou non?
Bien évidemment, selon le contexte, il conviendra d’ajouter un peu de sécurité pour que cette API ne soit pas disponible à tout le monde
Le code exposé ici est disponible sur Github. Le Readme est suffisamment détaillé pour que vous puissiez tester et réutiliser le code.
Original post of Littlewing.Votez pour ce billet sur Planet Libre.
Articles similaires
- Littlewing : Tracer (facilement) les entrées sorties d’une API REST (01/12/2018)
- Littlewing : Programmmation par aspect avec Spring AOP (05/11/2019)
- Littlewing : Utilisation des API Google (23/07/2010)
- Littlewing : Améliorer le Boot sous Debian 9 (20/01/2018)
- Littlewing : Oracle rachète SUN (20/04/2009)