it-swarm.com.de

Spring Boot-Anwendung - Was ist das Standardzeitlimit für einen Rest-API-Endpunkt oder eine einfache Konfiguration zum Steuern des Endpunktzeitlimits?

Ich verwende die aktuelle Spring-Boot-Version (1.4.x) und frage mich, ob es ein Standard-Timeout für API-Aufrufe gibt. Ich habe es getestet, indem ich Haltepunkte gesetzt habe, aber es wurde immer gewartet und es gab keine Auszeit. Ich habe auch versucht, das Standardzeitlimit für alle meine Spring-Boot-Apps mithilfe einiger Anmerkungen oder Yml-Einstellungen zu konfigurieren. 

Ich habe ein paar Alternativen gefunden (eine davon hier ), aber mithilfe von Callable fügte ich zusätzlichen Code hinzu, der nicht für Geschäftszwecke gedacht ist, wobei das Einrichten von XML-Beans in aktuellen Spring-Boot-Anwendungen aus der Mode kommt.

3
Gunjan Kumar

Ich stimme allen oben genannten Optionen zu und probierte diese Option in meiner Spring Boot-Anwendung aus. Es funktioniert jetzt perfekt. Nachfolgend finden Sie das Codebeispiel als Bean. Jetzt brauche ich nur @AutowireRestTemplate wo immer (Java class) ich brauche. 

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

        return restTemplate;
    }
3
Gunjan Kumar

Sie können server.connection-timeout=5000 in Ihren application.properties versuchen. Aus der offiziellen Dokumentation :

server.connection-timeout = # Zeit in Millisekunden, die Connectors auf eine weitere HTTP-Anforderung warten, bevor die Verbindung geschlossen wird. Wenn nicht festgelegt, wird die container-spezifische Standardeinstellung des Connectors verwendet. Verwenden Sie den Wert -1, um kein Timeout anzugeben (d. H. Unendlich).

UPDATE: Ich habe gerade bemerkt, dass Sie die Microservice-Architektur verwenden. Wenn Sie bei der Kommunikation zwischen Microservices mit Timeouts umgehen müssen, empfehle ich die Behandlung auf der Clientseite und nicht auf der Serverseite. Wenn der Microservice, den Sie aufrufen möchten, überlastet ist und seine Leistung bis zu dem Punkt abnimmt, an dem die Benutzererfahrung drastisch beeinträchtigt wird. Manchmal ist es besser, einige Fallback-Daten zurückzugeben, als nur die Anforderung zu löschen. 

Stellen Sie sich vor, wir haben eine E-Commerce-Website mit Microservice-Architektur und einer ihrer Microservices, der dem Benutzer Empfehlungen gibt, wird extrem langsam. In diesem Fall wäre die bevorzugte Lösung die Rückgabe einiger Fallback-Daten, die in diesem Monat die Top 10 der beliebtesten Produkte sein könnten, anstatt dem Kunden die 5xx-Fehlerseite anzuzeigen. Falls nachfolgende Anforderungen mit einem Timeout fehlschlagen, können wir darüber hinaus entscheiden, das Senden von Anforderungen an den Empfehlungsdienst zu vermeiden, und Fallback-Daten sofort zurückgeben. Nach einiger Zeit können wir erneut versuchen, eine Anfrage an den 'Empfehlungsdienst' zu senden, und falls diese fehlerfrei wurde, verwenden Sie sie statt der Fallback-Daten. 

Dies wird als Circuit Breaker -Muster bezeichnet, und es gibt bereits eine Implementierung davon in einem Framework namens Hystrix. Hier ist ein schöner Artikel, der es ausführlich erklärt: http://www.baeldung.com/spring-cloud-netflix-hystrix . Spring Cloud Feign + Spring Cloud Hystrix sieht sehr schön aus, insbesondere wenn man bedenkt, dass sie mit Discovery-Services arbeiten (z. B. Spring Cloud Eureka).

3
Danylo Zatorsky

Dafür gibt es mehrere Möglichkeiten:

1) Verwenden von ClientHttpRequestFactory mit RestTemplate:

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

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

2) Der zweite Weg ist Callable zu verwenden, aber ich denke, Sie haben diese Lösung bereits untersucht.

2
tryingToLearn

Das Timeout kann mit der connectionTimeout-Eigenschaft von Tomcat festgelegt werden. 

Bitte beziehen Sie sich auf diese Antwort, um sie für Tomcat einzurichten.

MaxKeepAliveRequests in Spring Boot Embedded Tomcat konfigurieren

0
zeagord