2015-04-29 31 views
37

Ich habe an einer Spring/Spring MVC-Anwendung gearbeitet und möchte Leistungskennzahlen hinzufügen. Ich bin auf Spring Boot Actuator gestoßen und es sieht nach einer großartigen Lösung aus. Meine Anwendung ist jedoch keine Spring-Boot-Anwendung. Meine Anwendung ist in einem traditionellen Behälter läuft Tomcat 8.Spring Boot Actuator ohne Spring Boot

Ich habe die folgenden Abhängigkeiten

// Spring Actuator 
compile "org.springframework.boot:spring-boot-starter-actuator:1.2.3.RELEASE" 

Ich habe die folgende Config-Klasse.

@EnableConfigurationProperties 
@Configuration 
@EnableAutoConfiguration 
@Profile(value = {"dev", "test"}) 
@Import(EndpointAutoConfiguration.class) 
public class SpringActuatorConfig { 

} 

Ich ging sogar so weit wie @EnableConfigurationProperties auf jeder Konfigurationsklasse Hinzufügen wie auf einen anderen Dienstposten auf Stackoverflow vorgeschlagen. Aber das hat nichts getan. Die Endpunkte werden immer noch nicht erstellt und geben 404 zurück.

+4

Ihnen wahrscheinlich bereits bekannt, aber Sie können auch Spring-Boot für eine Anwendung als Krieg gebündelt verwenden; Boot benötigt keine eingebetteten Tomcat – gyoder

+0

Ich bin eigentlich nicht so vertraut mit Spring Boot. Wie unterscheidet sich Spring Boot von einer traditionellen Spring-Anwendung? Von dem, was ich sagen kann, ist es einfach ein Starter-Template mit einem spezifischen Spring-zentrischen Ansatz. – greyfox

+1

Es unterscheidet sich darin, dass es die Notwendigkeit für viele der Konfiguration entfernt, solange Sie mit den Standardkonfigurationen einverstanden sind, die es für Sie automatisch konfiguriert. –

Antwort

11

Sie Antrieb ohne Feder Boot verwenden können. dieses Add

<dependency> 
    <groupId>org.springframework.boot</groupId> 
    <artifactId>spring-boot-actuator</artifactId> 
    <version>1.3.5.RELEASE</version> 
</dependency> 

<dependency> 
    <groupId>org.springframework</groupId> 
    <artifactId>spring-web</artifactId> 
    <version>4.3.5.RELEASE</version> 
</dependency> 

Und dann in der Config-Klasse

@Configuration 
@EnableWebMvc 
@Import({ 
     EndpointAutoConfiguration.class , PublicMetricsAutoConfiguration.class , HealthIndicatorAutoConfiguration.class 
}) 
public class MyActuatorConfig { 

    @Bean 
    @Autowired 
    public EndpointHandlerMapping endpointHandlerMapping(Collection<? extends MvcEndpoint> endpoints) { 
     return new EndpointHandlerMapping(endpoints); 
    } 

    @Bean 
    @Autowired 
    public EndpointMvcAdapter metricsEndPoint(MetricsEndpoint delegate) { 
     return new EndpointMvcAdapter(delegate); 
    } 
} 

Und dann können Sie sehen, die Metriken in Ihrer Anwendung

http://localhost:8085/metrics

Actutaor end point

1

Sie müssen Ihre Anwendung in Spring Boot konvertieren, wenn Sie die Komponenten verwenden möchten, die daran angeschlossen sind. Es gibt einen Abschnitt mit dem Namen Eine vorhandene Anwendung in Spring Boot konvertieren unter the Spring Boot docs, den Sie überprüfen möchten. Ich habe das nicht selbst gemacht, aber ich benutze Spring Boot und es ist relativ einfach zu konfigurieren, so hoffentlich können Sie es von hier bekommen.

+0

stellt sich heraus, das ist nicht mehr wahr ... siehe andere Antworten – ochi

32

Lassen Sie uns zuerst klarstellen, dass Sie den Spring Boot Actuator nicht ohne Spring Boot verwenden können.

Ich habe mich geirrt, dass ich es ohne Spring Boot nicht konnte. Ein Beispiel dafür finden Sie unter @ stefaan-neyts .

Ich habe ein Beispielprojekt erstellt, um zu zeigen, wie Sie eine grundlegende SpringMVC-Anwendung mithilfe einer minimalen Anzahl von Spring Boot-Autokonfigurationen konvertieren können.

Originalquelle: http://www.mkyong.com/spring-mvc/gradle-spring-mvc-web-project-example

Converted Quelle: https://github.com/Pytry/minimal-boot-actuator

ich völlig den Dispatcher-servlet.xml und die web.xml-Dateien entfernt haben könnte, aber ich hielt sie zu zeigen, wie als minimal ein auszuführen ändern Sie wie möglich und vereinfachen Sie die Konvertierung von komplexeren Projekten.

Hier ist eine Liste der Schritte, die ich zur Konvertierung durchgeführt habe.

Konvertierungsprozess

  • eine Java-Konfigurationsdatei mit @SpringBootApplication kommentierten Fügen Sie die Anwendungskonfigurationsdatei als Bohne zur traditionellen XML-Konfiguration
  • hinzufügen (hinzugefügt, um es kurz nach dem Kontext-Scan).
  • Verschieben Sie die Ansicht Resolver in Application Java-Konfiguration.

    Alternativ fügen Sie das Präfix und Suffix zu application.properties hinzu. Sie können sie dann mit @Value in Ihre Anwendung injizieren, oder löschen Sie sie vollständig und verwenden Sie einfach den bereitgestellten Spring Boot View Resolver. Ich ging mit dem ehemaligen.

  • Entfernt Standardkontextlistener aus dem Spring-Kontext xml.

    Das ist wichtig! Da der Spring-Boot-Modus einen bietet, erhalten Sie die Ausnahme "Fehler-Listener-Start", wenn Sie dies nicht tun.

  • die Feder Boot-Plugin, um Ihre Build-Skript Abhängigkeiten hinzufügen

  • hinzufügen mainClassName Eigenschaft auf die Build-Datei, und legen Sie auf einen leeren String (I gradle wurde mit) (zeigt nicht eine ausführbare Datei zu erstellen).

  • Ändern Abhängigkeiten für Feder Boot Aktor

+0

Wow sehr vollständige Antwort. Vielen Dank. Ich wünschte, ich könnte dies mehrfach aufwerten – greyfox

+0

Schönes Beispiel und nette Erklärung – Krishna

+0

sehr interisitng Diskussion, aber auf diese Weise sind Sie eine Portierung für eine klassische Feder mvc Anwendung auf eine Feder-Boot-Anwendung, die Krieg als Verpackung verwenden –

5

Obwohl die Antwort bereits akzeptiert wird, dachte ich, meine Erfahrung zu aktualisieren. Ich wollte meine Anwendung nicht in Spring-Boot mit @SpringBootApplication konvertieren. Siehe another question, wo ich den minimalen Mindestcode erwähnt habe.

+0

Ich fügte zusätzliche Erklärung für diese Weise hinzu http://stackoverflow.com/a/41488749/616290 –

11

Obwohl es keine gute Idee ist, Spring Boot-Funktionen ohne Spring Boot zu verwenden, ist es möglich!

Zum Beispiel diese Java-Konfiguration macht Frühlings-Boot-Actuator Metrics verfügbar ohne Federverschluß mit:

import java.util.Collection; 

import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.boot.actuate.autoconfigure.EndpointAutoConfiguration; 
import org.springframework.boot.actuate.autoconfigure.PublicMetricsAutoConfiguration; 
import org.springframework.boot.actuate.endpoint.MetricsEndpoint; 
import org.springframework.boot.actuate.endpoint.mvc.EndpointHandlerMapping; 
import org.springframework.boot.actuate.endpoint.mvc.EndpointMvcAdapter; 
import org.springframework.boot.actuate.endpoint.mvc.MvcEndpoint; 
import org.springframework.context.annotation.Bean; 
import org.springframework.context.annotation.Configuration; 
import org.springframework.context.annotation.Import; 

@Configuration 
@Import({ EndpointAutoConfiguration.class, PublicMetricsAutoConfiguration.class }) 
public class SpringBootActuatorConfig { 

    @Bean 
    @Autowired 
    public EndpointHandlerMapping endpointHandlerMapping(Collection<? extends MvcEndpoint> endpoints) { 
     return new EndpointHandlerMapping(endpoints); 
    } 

    @Bean 
    @Autowired 
    public EndpointMvcAdapter metricsEndPoint(MetricsEndpoint delegate) { 
     return new EndpointMvcAdapter(delegate); 
    } 
} 

Die Maven Abhängigkeit:

<dependency> 
    <groupId>org.springframework.boot</groupId> 
    <artifactId>spring-boot-actuator</artifactId> 
    <version>1.3.5.RELEASE</version> 
</dependency> 
+0

Danke für dieses große tipp @Stefaan, das einzige Ding, das ich auch meinen Maven Abhängigkeiten hinzufügen muss, war eine Bean Validation Provider Abhängigkeit zB Hibernate Validator (' org.hibernate Hibernate-Validator'). – ngeek

-1
pom.xml

Sie haben das gemacht Fehler, indem Sie die @springboot-Annotation nicht in Ihren Code einfügen.Wenn Sie @springboot hinzufügen, wird ot vom Compiler automatisch als Startprogramm betrachtet und fügt die erforderliche Abhängigkeitsdatei für ihn und Ihre Aktuator-Abhängigkeitsdatei