ChatGPT解决这个技术问题 Extra ChatGPT

没有 Spring Boot 的 Spring Boot 执行器

我一直在开发 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 用于捆绑为 war 的应用程序; boot 不需要你使用嵌入式 tomcat
我实际上对 Spring Boot 并不是很熟悉。 Spring Boot 与传统的 Spring 应用程序有何不同?据我所知,它只是一个具有特定以 Spring 为中心的方法的入门模板。
它的不同之处在于它消除了对大量配置的需求,只要您对它为您自动配置的默认配置感到满意。
你能发布你的构建文件吗?

P
Pytry

首先让我们澄清一下,如果不使用 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 执行器的依赖项


非常有趣的讨论,但是通过这种方式,您是将经典的 spring mvc 应用程序移植到使用 war 作为包装的 spring boot 应用程序
@ValerioVaudi 这是正确的。关键是没有 Spring Boot 是不可能起诉 Spring Boot Actuator 的。
好的,很抱歉,但我没有看到您的第一个断言:“首先让我们澄清一下,如果不使用 Spring Boot,就不能使用 Spring Boot Actuator”
@ValerioVaudi 在您发表评论后我补充说。你让我意识到我在回答中并不清楚。
您可以在非 Spring Boot 应用程序中使用 Spring Boot 执行器
v
vsingh

您可以使用不带弹簧套的执行器。将此添加到 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);
    }
}

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

http://localhost:8085/metrics

https://i.stack.imgur.com/iN5Mc.png


此版本的执行器 1.3.5.RELEASE 还启用了哪些其他端点?
@vsingh 当我这样做时,我收到以下错误: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?
您的应用程序是否从将上述内容添加到您的 pom.xml 开始?我似乎不记得有这个错误。 ConfigurableEnvironment 不是执行器包的一部分。
这对我不起作用。并且在上述依赖项中找不到 @EnableWebMvc。
你好@vsingh,我已经添加了如上所述的配置,但是当我点击 http://localhost:port/metrics 时它返回 404。我们是否需要在 application.properties 或 yml 文件中添加其他属性
S
Stefaan Neyts

尽管在没有 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>

感谢@Stefaan 这个伟大的提示,我唯一需要添加到我的 Maven 依赖项的是 Bean Validation Provider 依赖项,例如 Hibernate Validator (<groupId>org.hibernate</groupId> <artifactId>hibernate-validator</artifactId>)。
不需要@Autowired,在这种情况下,application.properties 中的 management.context-path=/manage 不起作用,您应该在 endpointHandlerMapping 中明确设置前缀
C
Community

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


我为这种方式添加了额外的解释stackoverflow.com/a/41488749/616290
J
Jakub Marchwicki

由于我们已经有了 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
S
Saravanan

您在代码中没有引入@springboot 注释是错误的。当您添加@springboot 时,编译器会自动将其视为启动程序并为其添加所需的依赖文件和执行器依赖文件


关注公众号,不定期副业成功案例分享
关注公众号

不定期副业成功案例分享

领先一步获取最新的外包任务吗?

立即订阅