Spring 不带 Spring 引导的引导执行器

Spring Boot Actuator without Spring Boot

我一直在开发 Spring/Spring MVC 应用程序,我希望添加性能指标。我遇到了 Spring Boot Actuator,它看起来是一个很好的解决方案。但是我的应用程序不是 Spring 启动应用程序。我的应用程序是 运行 在传统容器中 Tomcat 8.

我添加了以下依赖项

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

我创建了以下配置 class。

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

}

我什至按照 Whosebug 上另一个 post 的建议,在每个配置 class 上添加 @EnableConfigurationProperties。然而那并没有起到任何作用。端点仍未创建并且 return 404s。

如果您想使用插入其中的组件,您需要将您的应用程序转换为 Spring 启动。在 the Spring Boot docs 下有一个名为 Convert an existing application to Spring Boot 的部分,您需要查看该部分。我自己没有这样做,但我使用 Spring Boot,配置起来相对简单,所以希望你能从这里得到它。

首先让我们澄清一下,如果不使用Spring Boot.

,就不能使用Spring Boot Actuator

没有 Spring Boot 就无法做到这一点我错了。见@stefaan-neyts 回答一个如何做的例子。

我创建了一个示例项目来展示如何使用最少量的 Spring 引导自动配置来转换基本 SpringMVC 应用程序。

原始出处:http://www.mkyong.com/spring-mvc/gradle-spring-mvc-web-project-example

转换后的来源:https://github.com/Pytry/minimal-boot-actuator

我本可以完全删除 dispatcher-servlet.xml 和 web.xml 文件,但我保留了它们以展示如何执行尽可能少的更改并简化转换更复杂的项目。

这是我进行转换的步骤列表。

转换过程

  • 添加一个用@SpringBootApplication
  • 注释的Java配置文件
  • 将应用程序配置文件作为 bean 添加到传统的 xml 配置中(在上下文扫描之后添加)。
  • 将视图解析器移动到应用程序 java 配置中。

    或者,将前缀和后缀添加到 application.properties。 然后您可以在您的应用程序中使用 @Value 注入它们,或者完全删除它并只使用提供的 spring 启动视图解析器。 我选择了前者。

  • 已从 spring 上下文 xml 中删除默认上下文侦听器。

    这很重要! 由于 spring 引导将提供一个,如果不提供,您将得到一个 "Error listener Start" 异常。

  • 将 spring 启动插件添加到您的构建脚本依赖项中(我使用的是 gradle)

  • 在构建文件中添加一个mainClassName属性,并设置为空String(表示不创建可执行文件)

  • 修改 spring 引导执行器的依赖项

虽然答案已经被接受了,但我还是想更新一下我的经验。我不想使用 @SpringBootApplication 将我的应用程序转换为 spring 引导。请参阅 ,其中我提到了所需的最低限度代码。

尽管在没有 Spring 引导的情况下使用 Spring 引导功能不是一个好主意,但这是可能的!

例如,此 Java 配置使 Spring Boot Actuator Metrics 在不使用 Spring Boot:

的情况下可用
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);
    }
}

Maven 依赖项:

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

您可以在没有 spring 引导的情况下使用执行器。 将此添加到 pom.xml

<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>

然后在您的配置中 class

@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);
    }
}

然后您可以在您的应用程序中看到指标

http://localhost:8085/metrics

你犯了一个错误,没有在你的 code.When 中引入 @springboot 注释你添加 @springboot ot 将被编译器自动视为引导程序并为其添加所需的依赖文件和你的执行器依赖文件

因为我们已经有了 Spring 引导执行器 2.x,将执行器包含到现有 Spring MVC 项目中的方法如下所示:

@Configuration
@Import({
        EndpointAutoConfiguration.class,
        HealthIndicatorAutoConfiguration.class,

        InfoEndpointAutoConfiguration.class,
        HealthEndpointAutoConfiguration.class,

        WebEndpointAutoConfiguration.class,
        ServletManagementContextAutoConfiguration.class,
        ManagementContextAutoConfiguration.class,
})
@EnableConfigurationProperties(CorsEndpointProperties.class)
class ActuatorConfiguration {

    @Bean //taken from WebMvcEndpointManagementContextConfiguration.class
    public WebMvcEndpointHandlerMapping webEndpointServletHandlerMapping(WebEndpointsSupplier webEndpointsSupplier,
                                                                         ServletEndpointsSupplier servletEndpointsSupplier, ControllerEndpointsSupplier controllerEndpointsSupplier,
                                                                         EndpointMediaTypes endpointMediaTypes, CorsEndpointProperties corsProperties,
                                                                         WebEndpointProperties webEndpointProperties) {
        List<ExposableEndpoint<?>> allEndpoints = new ArrayList<>();
        Collection<ExposableWebEndpoint> webEndpoints = webEndpointsSupplier.getEndpoints();
        allEndpoints.addAll(webEndpoints);
        allEndpoints.addAll(servletEndpointsSupplier.getEndpoints());
        allEndpoints.addAll(controllerEndpointsSupplier.getEndpoints());
        EndpointMapping endpointMapping = new EndpointMapping(webEndpointProperties.getBasePath());
        return new WebMvcEndpointHandlerMapping(endpointMapping, webEndpoints, endpointMediaTypes,
                corsProperties.toCorsConfiguration(),
                new EndpointLinksResolver(allEndpoints, webEndpointProperties.getBasePath()));
    }

    @Bean
    DispatcherServletPath dispatcherServletPath() {
        return () -> "/";
    }

}

我确实包括了

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

为了与我一直使用的 Spring 基线版本兼容 (5.1.19.RELEASE)