Il n'est pas exagéré de dire qu'Actuator est la fonctionnalité la plus modifiée de Spring Boot 2.0. Si vous augmentez les détails, il n'y aura pas d'arêtes vives, donc pour le moment, voici quelques points à prendre en compte lors de la migration depuis 1.x.
L'erreur la plus courante dans Actuator lors de la mise à niveau d'une application existante faite avec Boot 1.x vers 2.0 est "404 Not Found" (du moins je l'ai fait). En fait, depuis 2.0, tous les points de terminaison de l'actionneur ont été préfixés par «/ actionneur». En d'autres termes, l'URL qui était précédemment spécifiée comme «localhost: 8080 / info» doit être remplacée par «localhost: 8080 / actuator / info».
Ce préfixe peut être modifié avec les propriétés suivantes.
application.Exemples de propriétés
#La valeur par défaut est"/actuator"
management.endpoints.web.base-path=/admin
Vous pouvez également modifier le numéro de port du point de terminaison de l'actionneur et ajouter un chemin de contexte. Veuillez noter que si vous ne spécifiez pas le numéro de port, le chemin du contexte ne sera pas joint.
application.Exemples de propriétés
management.server.port=9999
management.server.servlet.context-path=/admin-context
En d'autres termes, si vous écrivez les trois paramètres ci-dessus, le point de terminaison de l'actionneur sera quelque chose comme localhost: 9999 / admin-context / admin / info
.
/ info
et / health
sont publiés par défautCela provoque également une erreur 404. / env
, / beans
, etc. ne sont pas publiés par défaut.
Définissez le point de terminaison que vous souhaitez publier comme suit.
application.Exemples de propriétés
management.endpoints.web.exposure.include=env,beans,loggers
Si vous en spécifiez ne serait-ce qu'une seule, elle ne sera publiée que si vous spécifiez explicitement
/ info
et/ health
.
Spécifiez «*» si vous souhaitez publier tous les points de terminaison.
application.Exemples de propriétés
management.endpoints.web.exposure.include=*
Inversement, les points de terminaison qui ne sont pas exposés sont spécifiés dans management.endpoints.web.exposure.exclude
. Par exemple, si vous écrivez comme suit, tous les points de terminaison sauf / env
et / info
seront publiés.
application.Exemples de propriétés
management.endpoints.web.exposure.include=*
management.endpoints.web.exposure.exclude=env,info
Les points de terminaison configurés pour publier mais qui ne sont pas activés individuellement ne seront pas publiés. Par exemple, si vous écrivez comme suit, seuls / beans
et / health
seront publiés. Bien que / auditevents
soit spécifié comme public, il ne sera pas publié car il a été désactivé.
application.Exemples de propriétés
management.endpoints.web.exposure.include=auditevents,beans,health
# /auditevents sont désactivés et ne seront pas publiés
management.endpoint.auditevents.enabled=false
Chaque point final peut être activé avec
management.endpoint.xxxxx.enabled
(xxxxx
est le nom du point final)
Depuis Spring Boot 1.5, les points de terminaison sensibles de l'actionneur ont été protégés (seuls les utilisateurs avec le rôle ʻACTUATOR` peuvent y accéder).
Avec Spring Boot 2.0, le concept de sensible a disparu en premier lieu, et tous les points de terminaison accessibles au public ne sont plus protégés. Pour sécuriser le point de terminaison, vous devez explicitement inclure Spring Security et écrire les paramètres de sécurité dans Java Config.
pom.xml
...
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!--Ajout de Spring Security!-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
...
</dependencies>
...
Exemple JavaConfig
@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
//Créez des utilisateurs généraux et des utilisateurs pour accéder à l'actionneur
//(Le nom d'utilisateur, le mot de passe, le nom du rôle sont facultatifs)
auth.inMemoryAuthentication()
.passwordEncoder(NoOpPasswordEncoder.getInstance()) //NoOpPasswordEncoder est interdit en production!
.withUser("actuator").password("password").roles("ACTUATOR").and()
.withUser("user").password("password").roles("USER");
}
@Override
protected void configure(HttpSecurity http) throws Exception {
//Activer l'authentification BASIC
http.httpBasic();
//Les extrémités de l'actionneur ne sont accessibles que par le rôle ACTUATOR,
//Les autres sont accessibles par n'importe quel rôle tant que vous êtes connecté
http.authorizeRequests()
.requestMatchers(EndpointRequest.toAnyEndpoint()).hasRole("ACTUATOR")
.anyRequest().authenticated();
//Ne désactivez pas CSRF en production!
http.csrf().disable();
}
}
Notez qu'il existe deux classes ʻEndpointRequest
, une pour les servlets et une pour les réactifs. Puisque nous supposons une base de servlet cette fois, veuillez utiliser la classe ʻEndpointRequest
du package ʻorg.springframework.boot.actuate.autoconfigure.security.servlet`.
Exemple d'accès avec curl
$ curl -v -u actuator:password localhost:8080/actuator/health | jq
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0* Trying ::1...
* TCP_NODELAY set
* Connected to localhost (::1) port 8080 (#0)
* Server auth using Basic with user 'actuator'
> GET /actuator/health HTTP/1.1
> Host: localhost:8080
> Authorization: Basic YWN0dWF0b3I6cGFzc3dvcmQ=
> User-Agent: curl/7.54.0
> Accept: */*
>
< HTTP/1.1 200
< Set-Cookie: JSESSIONID=C472F3844F17FC8EBC779A35DEFB085F; Path=/; HttpOnly
< X-Content-Type-Options: nosniff
< X-XSS-Protection: 1; mode=block
< Cache-Control: no-cache, no-store, max-age=0, must-revalidate
< Pragma: no-cache
< Expires: 0
< X-Frame-Options: DENY
< Content-Type: application/vnd.spring-boot.actuator.v2+json;charset=UTF-8
< Transfer-Encoding: chunked
< Date: Fri, 09 Mar 2018 07:03:55 GMT
<
{ [20 bytes data]
100 15 0 15 0 0 165 0 --:--:-- --:--:-- --:--:-- 166
* Connection #0 to host localhost left intact
{
"status": "UP"
}
Si vous faites attention aux trois points ci-dessus, vous devriez être en mesure de mettre à niveau l'application créée dans 1.x vers 2.0 et de l'exécuter pour le moment. Cependant, il y a beaucoup d'autres changements dans Actuator, alors assurez-vous de lire le chapitre Actuator dans la documentation officielle! https://docs.spring.io/spring-boot/docs/current/reference/html/production-ready.html J'aimerais écrire un blog de commentaires à ce sujet ... eh bien, attendez patiemment!
Recommended Posts