不带Spring Boot的 Spring Boot 执行器

crcmnpdw  于 2022-11-23  发布在  Spring
关注(0)|答案(7)|浏览(196)

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

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

我创建了以下配置类。

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

}

我甚至按照StackOverflow上的另一篇文章的建议在每个配置类上添加了@EnableConfigurationProperties。然而,这并没有起到任何作用。端点仍然没有被创建,并返回404。

lrl1mhuk

lrl1mhuk1#

首先让我们澄清一下,如果不使用Spring Boot,就不能使用 Spring Boot 执行器。
我错了,没有Sping Boot 我就不能做这件事。
我创建了一个示例项目来演示如何使用最少量的 Boot 自动配置来转换基本的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 Boot 视图解析器。

  • 已从Spring上下文XML中删除默认上下文侦听器。

这很重要!因为Sping Boot 将提供一个,如果你不提供,你将得到一个“错误侦听器启动”异常。

  • 将spring Boot 插件添加到构建脚本依赖项中(我使用的是gradle)
  • 将mainClassName属性添加到生成文件中,并将其设置为空字符串(表示不创建可执行文件).
  • 修改 Spring Boot 致动器的相关性
d5vmydt9

d5vmydt92#

您可以使用不带 Spring Boot 的执行器。

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

然后在config类中

@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

ifmq2ha2

ifmq2ha23#

尽管在没有Spring Boot的情况下使用Sping Boot 功能不是一个好主意,但这是可能的!
例如,此Java配置使Sping Boot Actuator指标在不使用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>
8cdiaqws

8cdiaqws4#

虽然答案已经被接受了,但我还是想更新一下我的经验。我不想使用@SpringBootApplication将我的应用程序转换为Sping Boot 。请参考another question,我在那里提到了所需的最低代码。

lndjwyie

lndjwyie5#

由于我们已经有了 Boot ,因此将Actuator包含到现有SpringMVC项目中的方法如下所示:

@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)兼容

moiiocjp

moiiocjp6#

如果您的目标是为Prometheus(又名OpenMetrics)创建一个具有度量的端点,则可以使用与Spring框架兼容的Prometheus JVM client
新增相依性:

<dependency>
      <groupId>io.prometheus</groupId>
      <artifactId>simpleclient_servlet</artifactId>
      <version>0.16.0</version>
    </dependency>

要收集请求的度量,请添加为web-app/WEB-INF/web.xml中的第一个筛选器:

<filter>
    <filter-name>prometheusFilter</filter-name>
    <filter-class>io.prometheus.client.filter.MetricsFilter</filter-class>
    <init-param>
      <param-name>metric-name</param-name>
      <param-value>webapp_metrics_filter</param-value>
    </init-param>
  </filter>
  <filter-mapping>
    <filter-name>prometheusFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

要将度量公开为HTTP端点,请添加Servlet:

<servlet>
    <servlet-name>prometheus</servlet-name>
    <servlet-class>io.prometheus.client.exporter.MetricsServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>prometheus</servlet-name>
    <url-pattern>/metrics</url-pattern>
  </servlet-mapping>

之后,您可以看到/metrics端点上的指标。

cqoc49vn

cqoc49vn7#

你犯了一个错误,没有在你的代码中引入@springboot注解。当你添加@springboot时,ot会被编译器自动视为引导程序,并为其添加所需的依赖文件和你的执行器依赖文件

相关问题