복붙노트

[SPRING] 스프링 부트 응용 프로그램없이 스프링 부트 액츄에이터 사용

SPRING

스프링 부트 응용 프로그램없이 스프링 부트 액츄에이터 사용

프로덕션 정보 끝점이있는 Spring Boot의 액추에이터 라이브러리는 모든 서버 응용 프로그램에 유용합니다. 그러나 문제는 기존의 Spring Application (Spring BOOT 응용 프로그램이 아닌)에 통합 할 수있는 방법을 찾을 수 없다는 것입니다.

액츄에이터의 끝점을 사용하는 방법이 있어야하지만 와이어를 연결할 수는 없습니다.

아래와 같은 JavaConfig 클래스가 있습니다.

@Configuration
@ComponentScan(basePackages = { "com.company.helper", "org.springframework.boot" })
@EnableWebMvc
@Import({ DbConfig.class })

public class AppConfig extends WebMvcConfigurerAdapter {

}

그러나이 구성은 배포 중에 오류를 발생시킵니다.

이 배선은 Spring Boot 응용 프로그램없이 할 수 있습니까?

해결법

  1. ==============================

    1.이 블로그 게시물의 비 부팅 응용 프로그램에 스프링 부팅 액추에이터를 추가하는 방법에 대한 정보를 추가했습니다.

    이 블로그 게시물의 비 부팅 응용 프로그램에 스프링 부팅 액추에이터를 추가하는 방법에 대한 정보를 추가했습니다.

    http://givenwhenthen.blogspot.com/2015/09/adding-spring-boot-actuator-to-non.html

    응용 프로그램의 build.gradle에서 다음 종속성을 추가했습니다.

    compile('org.springframework.boot:spring-boot-actuator:1.2.5.RELEASE'){
        exclude group: 'org.springframework.boot', module:'spring-boot-starter-logging'}
    

    애플리케이션의 Spring Config 클래스에서 다음과 같은 것들을 추가했다.

     import org.springframework.beans.factory.annotation.Autowired;  
     import org.springframework.boot.actuate.autoconfigure.EndpointAutoConfiguration;  
     import org.springframework.boot.actuate.endpoint.BeansEndpoint;  
     import org.springframework.boot.actuate.endpoint.HealthEndpoint;  
     import org.springframework.boot.actuate.endpoint.InfoEndpoint;  
     import org.springframework.boot.actuate.endpoint.RequestMappingEndpoint;  
     import org.springframework.boot.actuate.endpoint.mvc.EndpointHandlerMapping;  
     import org.springframework.boot.actuate.endpoint.mvc.EndpointMvcAdapter;  
     import org.springframework.boot.actuate.endpoint.mvc.HealthMvcEndpoint;  
     import org.springframework.boot.actuate.endpoint.mvc.MvcEndpoint;  
    
     @Configuration  
     @Import(EndpointAutoConfiguration.class)  
     public class MyAppSpringConfig {  
    
       @Bean  
       @Autowired  
       //Define the HandlerMapping similar to RequestHandlerMapping to expose the endpoint  
       public EndpointHandlerMapping endpointHandlerMapping(  
         Collection<? extends MvcEndpoint> endpoints  
       ){  
         return new EndpointHandlerMapping(endpoints);  
       }  
    
       @Bean  
       @Autowired  
       //define the HealthPoint endpoint  
       public HealthMvcEndpoint healthMvcEndpoint(HealthEndpoint delegate){  
         return new HealthMvcEndpoint(delegate, false);  
       }  
    
       @Bean  
       @Autowired  
       //define the Info endpoint  
       public EndpointMvcAdapter infoMvcEndPoint(InfoEndpoint delegate){  
          return new EndpointMvcAdapter(delegate);  
       }  
    
       @Bean  
       @Autowired  
       //define the beans endpoint  
       public EndpointMvcAdapter beansEndPoint(BeansEndpoint delegate){  
         return new EndpointMvcAdapter(delegate);  
       }  
    
       @Bean  
       @Autowired  
       //define the mappings endpoint  
       public EndpointMvcAdapter requestMappingEndPoint(  
         RequestMappingEndpoint delegate  
       ){  
         return new EndpointMvcAdapter(delegate);  
      }  
    }  
    

    추가 종속성을 제거하려면 blogpost를 참조하십시오.

    최신 정보

    또한 ServletDispatcher가 HealthMvcEndpoint의 핸들러에 대한 어댑터를 가져올 수 없으면 RequestMappingHandlerAdapter에 대해 bean을 정의했는지 확인해야합니다.

    만약 당신이 그것을 bean 설정 파일에 추가하지 않았다면

    xml 구성 :

    <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
            <property name="messageConverters">
                <list>
                    <ref bean="jsonConverter"/>
                </list>
            </property>
        </bean>
    
        <bean id="jsonConverter" class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
            <property name="supportedMediaTypes" value="application/json" />
            <property name="prettyPrint" value="true" />
        </bean>
    
  2. ==============================

    2.우리 프로젝트에서 우리는 약간의 해킹을 사용하여 우리를 위해 일했습니다. 액추에이터를 활성화하기 위해 POM에서 spring-boot의 종속성을 사용했습니다.

    우리 프로젝트에서 우리는 약간의 해킹을 사용하여 우리를 위해 일했습니다. 액추에이터를 활성화하기 위해 POM에서 spring-boot의 종속성을 사용했습니다.

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-actuator</artifactId>
            <version>1.2.3.RELEASE</version>
            <type>jar</type>
        </dependency>
         <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-validator</artifactId>
            <version>4.3.2.Final</version>
        </dependency>
    

    다음과 같이 추가 구성 클래스를 사용했습니다.

    @EnableConfigurationProperties
    @Configuration
    @EnableAutoConfiguration
    @Import(EndpointAutoConfiguration.class)
    public class SpringBootActuatorConfig {
    
    }
    
  3. ==============================

    3.내가 작업하고있는 프로젝트는 Spring을 사용하지만 Spring-boot도 Spring-MVC도 사용하지 않는다. 다음 솔루션은 부팅시 액츄에이터만큼 자동화되지 않지만 끝점을 매우 간결하게 표시합니다.

    내가 작업하고있는 프로젝트는 Spring을 사용하지만 Spring-boot도 Spring-MVC도 사용하지 않는다. 다음 솔루션은 부팅시 액츄에이터만큼 자동화되지 않지만 끝점을 매우 간결하게 표시합니다.

    기본적으로 모든 액추에이터 끝점은 단지 콩이므로 새 구성 요소를 만들고 끝점에서 자동 배선을 수행 할 수 있습니다.

    내 pom의 유일한 추가 종속성은 spring-boot-actuator와 spring-webmvc입니다.

       <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-actuator</artifactId>
            <version>1.2.1.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId> 
            <version>4.1.4.RELEASE</version>
        </dependency>
    

    그런 다음 하나의 구성 요소 클래스를 작성하면됩니다 (필요한 경우 등록 할 수도 있습니다). @EnableAutoConfiguration 주석을 달아야합니다.

    @Component
    @EnableAutoConfiguration
    @Path("/actuator/")
    public class ActuatorResource {
    
    private ObjectMapper mapper = new ObjectMapper();
    
    
    @Autowired 
    private DumpEndpoint dumpEndpoint;
    
    @GET
    @Produces("application/json")
    @Path("/dump")
    @Transactional(readOnly = true)
    public String getDump() throws JsonProcessingException { 
        return mapper.writeValueAsString(dumpEndpoint.invoke());
    }
    
    @Autowired
    private EnvironmentEndpoint envEndpoint;
    
    @GET
    @Produces("application/json")
    @Path("/environment")
    @Transactional(readOnly = true)
    public String getEnvironment() throws JsonProcessingException {
        return mapper.writeValueAsString(envEndpoint.invoke());
    }
    
    }
    
  4. from https://stackoverflow.com/questions/26913087/use-spring-boot-actuator-without-a-spring-boot-application by cc-by-sa and MIT license