我一直在开发 Spring/Spring MVC 应用程序,我正在寻找添加性能指标。我遇到了 Spring 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。
首先让我们澄清一下,如果不使用 Spring Boot,就不能使用 Spring Boot Actuator。
如果没有 Spring Boot,我就无法做到这一点是错误的。有关如何执行此操作的示例,请参阅@stefaan-neyts 答案。
我创建了一个示例项目来展示如何使用最少量的 Spring 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 中删除了默认上下文侦听器。这个很重要!由于 spring boot 会提供一个,如果你不这样做,你会得到一个“Error listener Start”异常。
将 spring boot 插件添加到您的构建脚本依赖项中(我使用的是 gradle)
将 mainClassName 属性添加到构建文件,并设置为空字符串(表示不创建可执行文件)。
修改 spring boot 执行器的依赖项
您可以使用不带弹簧套的执行器。将此添加到 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>
然后在你的配置类
@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);
}
}
然后您可以在应用程序中查看指标
https://i.stack.imgur.com/iN5Mc.png
Error creating bean with name 'org.springframework.boot.actuate.autoconfigure.EndpointAutoConfiguration$InfoPropertiesConfiguration': Unsatisfied dependency expressed through field 'environment'; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'org.springframework.core.env.ConfigurableEnvironment' available: expected at least 1 bean which qualifies as autowire candidate.
我应该在哪里配置这个 bean?
http://localhost:port/metrics
时它返回 404
。我们是否需要在 application.properties 或 yml 文件中添加其他属性
尽管在没有 Spring Boot 的情况下使用 Spring Boot 功能不是一个好主意,但这是可能的!
例如,此 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>
<groupId>org.hibernate</groupId> <artifactId>hibernate-validator</artifactId>
)。
management.context-path=/manage
不起作用,您应该在 endpointHandlerMapping
中明确设置前缀
虽然答案已经被接受,但我想更新我的经验。我不想使用 @SpringBootApplication
将我的应用程序转换为 Spring Boot。请参阅another question,其中我提到了所需的最低限度代码。
由于我们已经有了 Spring Boot Actuator 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)
HealthIndicatorAutoConfiguration
您在代码中没有引入@springboot 注释是错误的。当您添加@springboot 时,编译器会自动将其视为启动程序并为其添加所需的依赖文件和执行器依赖文件