[JAVA] Spring Boot 2.0 Actuator, 3 Änderungen, die Sie wissen müssen, damit es funktioniert

Es ist keine Übertreibung zu sagen, dass Actuator die am meisten modifizierte Funktion von Spring Boot 2.0 ist. Wenn Sie die Details erhöhen, gibt es keine scharfen Kanten. Daher sind vorerst einige Punkte zu beachten, wenn Sie von 1.x migrieren.

Das URL-Präfix wird standardmäßig hinzugefügt

Der wahrscheinlich häufigste Fehler in Actuator beim Upgrade einer vorhandenen App, die mit Boot 1.x auf 2.0 erstellt wurde, ist "404 Not Found" (zumindest habe ich das getan). Tatsächlich wurde allen Aktuatorendpunkten seit 2.0 das Präfix "/ actuator" vorangestellt. Mit anderen Worten, die zuvor als "localhost: 8080 / info" angegebene URL muss in "localhost: 8080 / actuator / info" geändert werden.

Dieses Präfix kann mit den folgenden Eigenschaften geändert werden.

application.Beispiele für Eigenschaften


#Der Standardwert ist"/actuator"
management.endpoints.web.base-path=/admin

Sie können auch die Portnummer für den Actuator-Endpunkt ändern und einen Kontextpfad hinzufügen. Bitte beachten Sie, dass der Kontextpfad nicht angehängt wird, wenn Sie die Portnummer nicht angeben.

application.Beispiele für Eigenschaften


management.server.port=9999
management.server.servlet.context-path=/admin-context

Mit anderen Worten, wenn Sie alle drei oben genannten Einstellungen schreiben, lautet der Actuator-Endpunkt "localhost: 9999 / admin-context / admin / info".

Standardmäßig werden nur / info und / health veröffentlicht

Dies verursacht auch einen 404-Fehler. / env, / bean usw. werden standardmäßig nicht veröffentlicht. Legen Sie den Endpunkt, den Sie veröffentlichen möchten, wie folgt fest.

application.Beispiele für Eigenschaften


management.endpoints.web.exposure.include=env,beans,loggers

Wenn Sie nur eine angeben, wird diese nur veröffentlicht, wenn Sie explizit "/ info" und "/ health" angeben.

Geben Sie "*" an, wenn Sie alle Endpunkte veröffentlichen möchten.

application.Beispiele für Eigenschaften


management.endpoints.web.exposure.include=*

Umgekehrt werden Endpunkte, die nicht verfügbar gemacht werden, in "management.endpoints.web.exposure.exclude" angegeben. Wenn Sie beispielsweise wie folgt schreiben, werden alle Endpunkte außer "/ env" und "/ info" veröffentlicht.

application.Beispiele für Eigenschaften


management.endpoints.web.exposure.include=*
management.endpoints.web.exposure.exclude=env,info

Endpunkte, die veröffentlicht werden sollen, aber nicht einzeln aktiviert sind, werden nicht veröffentlicht. Wenn Sie beispielsweise wie folgt schreiben, werden nur "/ beans" und "/ health" veröffentlicht. Obwohl / auditevents als öffentlich angegeben ist, wird es nicht veröffentlicht, da es deaktiviert wurde.

application.Beispiele für Eigenschaften


management.endpoints.web.exposure.include=auditevents,beans,health
# /Auditevents sind deaktiviert und werden nicht veröffentlicht
management.endpoint.auditevents.enabled=false

Jeder Endpunkt kann mit management.endpoint.xxxxx.enabled aktiviert werden ( xxxxx ist der Endpunktname).

Standardmäßig nicht geschützt

Ab Spring Boot 1.5 wurden vertrauliche Actuator-Endpunkte geschützt (nur Benutzer mit der Rolle "ACTUATOR" können darauf zugreifen).

Mit Spring Boot 2.0 ist das Konzept der Vertraulichkeit in erster Linie weg und alle öffentlich verfügbaren Endpunkte sind nicht mehr geschützt. Um den Endpunkt zu sichern, müssen Sie Spring Security explizit einschließen und die Sicherheitseinstellungen in Java Config schreiben.

pom.xml


...
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <!--Frühlingssicherheit hinzugefügt!-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>
        ...
    </dependencies>
...

JavaConfig-Beispiel


@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        //Erstellen Sie allgemeine Benutzer und Benutzer, um auf Actuator zuzugreifen
        //(Benutzername, Passwort, Rollenname sind optional)
        auth.inMemoryAuthentication()
                .passwordEncoder(NoOpPasswordEncoder.getInstance()) //NoOpPasswordEncoder ist in der Produktion verboten!
                .withUser("actuator").password("password").roles("ACTUATOR").and()
                .withUser("user").password("password").roles("USER");
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        //Aktivieren Sie die BASIC-Authentifizierung
        http.httpBasic();
        //Auf Actuator-Endpunkte kann nur über die ACTUATOR-Rolle zugegriffen werden.
        //Auf andere kann von jeder Rolle zugegriffen werden, solange Sie angemeldet sind
        http.authorizeRequests()
                .requestMatchers(EndpointRequest.toAnyEndpoint()).hasRole("ACTUATOR")
                .anyRequest().authenticated();

        //CSRF in der Produktion nicht deaktivieren!
        http.csrf().disable();
    }
}

Beachten Sie, dass es zwei EndpointRequest-Klassen gibt, eine für Servlets und eine für Reaktive. Da wir diesmal von einer Servlet-Basis ausgehen, verwenden Sie bitte die EndpointRequest-Klasse des org.springframework.boot.actuate.autoconfigure.security.servlet-Pakets.

Zugriffsbeispiel mit 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"
}

Schließlich

Wenn Sie die oben genannten drei Punkte beachten, sollten Sie in der Lage sein, die in 1.x erstellte App auf 2.0 zu aktualisieren und vorerst auszuführen. Es gibt jedoch noch viele andere Änderungen am Aktuator. Lesen Sie daher unbedingt das Kapitel Aktuator in der offiziellen Dokumentation durch! https://docs.spring.io/spring-boot/docs/current/reference/html/production-ready.html Ich möchte einen Kommentar-Blog darüber schreiben ... nun, bitte warten Sie geduldig!

Recommended Posts

Spring Boot 2.0 Actuator, 3 Änderungen, die Sie wissen müssen, damit es funktioniert
Änderungen bei der Migration von Spring Boot 1.5 auf Spring Boot 2.0
Änderungen bei der Migration von Spring Boot 2.0 zu Spring Boot 2.2
[Spring Boot] Wenn Sie Spring Boot verwenden, war es praktisch, viele Dienstprogramme zu verwenden.
Wenn Sie die Spring Boot + Thymeleaf-Verarbeitung trennen möchten
Bis Sie ein Spring Boot-Projekt in Intellij erstellen und an Github senden
[IOS] Was Sie wissen müssen, bevor Sie ein Widget erstellen
Ich habe versucht, mit Swagger mit Spring Boot zu beginnen
Versuchen Sie Spring Boot von 0 bis 100.
Beginnen Sie mit Spring Boot
Einführung in Spring Boot ~ ~ DI ~
Einführung in Spring Boot ② ~ AOP ~
Wichtige Änderungen in Spring Boot 1.5
Einführung in Spring Boot Teil 1
Ändern Sie die Spring Boot-Validierungsnachricht
Wenn Sie "Spring Boot" satt haben, probieren Sie doch "jooby".
So stellen Sie Spring Boot + PostgreSQL ein
Spring Boot Actuator-Metrikwert logback_events_total
Erhalten Sie Validierungsergebnisse mit Spring Boot
Verwendung von ModelMapper (Spring Boot)
Rüsten Sie den Federstiefel von der 1.5-Serie auf die 2.0-Serie auf
Für Sie, die unbedingt eine Rückverfolgung benötigen
So wenden Sie Thymeleaf-Änderungen sofort mit #Spring Boot + maven auf den Browser an
[Spring Boot Actuator] So registrieren Sie Ihren eigenen Integritätsprüfungsprozess manuell