programing

Spring Boot Application - 모든 rest API 끝점에 대한 기본 시간 초과 또는 모든 끝점 시간 초과를 제어하기 위한 쉬운 구성

lastmoon 2023. 8. 25. 23:53
반응형

Spring Boot Application - 모든 rest API 끝점에 대한 기본 시간 초과 또는 모든 끝점 시간 초과를 제어하기 위한 쉬운 구성

현재 Spring boot 버전(1.4.x)을 사용하고 있는데 api 호출에 대한 기본 타임아웃이 있는지 궁금합니다.브레이크 포인트를 넣어 테스트해 보았지만 계속 대기 중이었고 타임아웃이 되지 않았습니다.또한 주석이나 yml 설정을 사용하여 모든 스프링 부트 앱에 대한 기본 시간 제한을 구성하려고 했습니다.

저는 몇 가지 대안을 찾았습니다(그 중 하나는 여기에 있습니다). 하지만 호출 가능을 사용하면 실제로 xmlbean으로 무언가를 설정하는 것이 최신 봄 부팅 애플리케이션에서 유행하지 않는 비즈니스 로직 코드를 추가할 수 있습니다.

시도해 보세요server.connection-timeout=5000사용자의 application.properties에 있습니다.공식 문서에서:

server.connection-interval= # 연결을 닫기 전에 커넥터가 다른 HTTP 요청을 기다리는 시간(밀리초)입니다.설정하지 않으면 커넥터의 컨테이너별 기본값이 사용됩니다.시간 초과가 없음(즉, 무한)을 나타내려면 -1 값을 사용합니다.

업데이트: 마이크로서비스 아키텍처를 사용하므로 마이크로서비스 간 통신 시 타임아웃을 처리해야 할 경우 서버 측이 아닌 클라이언트 측에서 처리하는 것이 좋습니다.호출하려는 마이크로 서비스가 오버로드되어 사용자 환경에 큰 영향을 미칠 정도로 성능이 저하된 경우에는 요청을 삭제하는 것보다 일부 예비 데이터를 반환하는 것이 좋습니다.

마이크로서비스 아키텍처를 갖춘 전자상거래 웹사이트가 있고 사용자에게 권장사항을 제공하는 마이크로서비스 중 하나가 매우 느려진다고 상상해 보십시오.이 경우 고객에게 5xx 오류 페이지를 보여주는 것보다 이번 달 인기 제품 10위 안에 들 수 있는 일부 폴백 데이터를 반환하는 것이 좋습니다.또한 이후 요청이 시간 초과로 실패할 경우 'recommendation-service'로 요청을 보내지 않도록 결정하고 폴백 데이터를 즉시 반환할 수 있습니다.잠시 후 '추천 서비스'에 다시 요청을 보낼 수 있으며, 정상이 되면 폴백 데이터 대신 해당 서비스를 사용하면 됩니다.

이를 회로 차단기 패턴이라고 하며 Hystrix라는 프레임워크에 이미 구현되어 있습니다.http://www.baeldung.com/spring-cloud-netflix-hystrix 에서 자세히 설명하는 멋진 기사가 있습니다.Spring Cloud Feign + Spring Cloud Hystrix는 Discovery 서비스와 바로 연동된다는 점(예: Spring Cloud Eureka)을 고려하면 매우 유용하게 보입니다.

저는 위의 모든 옵션에 동의하며 스프링 부트 애플리케이션에서 아래 옵션을 시도했습니다.이제는 아주 잘 작동합니다.아래는 콩으로 된 코드 샘플입니다.는 그냥 ㅠㅠㅠㅠㅠㅠㅠㅠ@Autowire RestTemplatejava class요.

   @Bean
    public RestTemplate restTemplate() {
        RestTemplate restTemplate = new RestTemplate();
        ((SimpleClientHttpRequestFactory) restTemplate.getRequestFactory()).setConnectTimeout(15000);
        ((SimpleClientHttpRequestFactory) restTemplate.getRequestFactory()).setReadTimeout(15000);

        return restTemplate;
    }

이를 위한 몇 가지 방법이 있습니다.

사용ClientHttpRequestFactory와 함께RestTemplate:

public RestTemplate restTemplate() {
    return new RestTemplate(clientHttpRequestFactory());
}

private ClientHttpRequestFactory clientHttpRequestFactory() {
    HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory();
    factory.setReadTimeout(timeinMillis);
    factory.setConnectTimeout(timeinMillis);
    return factory;
}

두 번째 방법은 호출 가능한 것을 사용하는 것입니다. 하지만 이미 그 해결책을 검토하셨다고 생각합니다.

시간 초과는 다음을 사용하여 설정할 수 있습니다.connectionTimeout톰캣의 재산.

Tomcat에 대한 설정 방법은 이 답변을 참조하십시오.

Spring Boot에 포함된 Tomcat에서 maxKeepAliveRequests 구성

주 사 여 구 파 수 있 니 습 다 만 들 을석을 사용하여 할 수 .@Configuration

RestTemplate를 사용하는 경우:

` @Bean
    public RestTemplate restTemplate(RestTemplateBuilder builder) {

        return new RestTemplateBuilder()
                .setConnectTimeout(Duration.ofMillis(30000))
                .setReadTimeout(Duration.ofMillis(30000))
      

      .build();
}`

Web Client 시간 초과의 경우:

 @Bean
    public WebClient webClient() {
        return WebClient.builder()
                .clientConnector(new ReactorClientHttpConnector(
                        HttpClient.create().responseTimeout(Duration.ofMillis(30000))
                ))
                .build();
    }

구성이 완료되면 이 RestTemplate 또는 WebClient를 사용할 컨트롤러 또는 다른 파일에서 다음과 같이 자동 배선합니다.

@Autowired
private RestTemplate restTemplate;

또는

@Autowired
private WebClient webClient;

언급URL : https://stackoverflow.com/questions/44274982/spring-boot-application-what-is-default-timeout-for-any-rest-api-endpoint-or-a

반응형