suchen
HeimJavajavaLernprogrammAusführliche Erläuterung des von RestTemplate integrierten Menübands der Springcloud-Komponenten

In diesem Artikel geht es darum, wie Springcloud Ribbons unterschiedlich integriert (feign, zuul, RestTemplate). Dieser Artikel befasst sich zunächst mit RestTemplate.

Das Klassendiagramm von RestTemplate lautet wie folgt

Ausführliche Erläuterung des von RestTemplate integrierten Menübands der Springcloud-Komponenten

  • HttpAccessorHauptsächlich erstellt basierend auf ClientHttpRequestFactoryClientHttpRequest

  • InterceptingHttpAccessor erweitert HttpAccessor, um ein abgefangenes InterceptingClientHttpRequest zu erstellen. Dies ist der Kern des integrierten Ribbons, wenn ClientHttpRequestInterceptor ein HTTP initiiert Anforderungsaufruf, es wird zuerst den Interceptor durchlaufen und dann tatsächlich die http-Anfrage initiieren. RestTemplate

Wie ist der Abfangjäger

aufgebaut? In der Klasse ClientHttpRequestInterceptor gibt es den folgenden Code: LoadBalancerAutoConfiguration

@LoadBalanced
@Autowired(required = false)
private List<RestTemplate> restTemplates = Collections.emptyList();

Solange die Anmerkung

hinzugefügt wird, wird @LoadBalanced wie folgt eingefügt Konfiguration wird geladen: RestTemplate

@Configuration
@ConditionalOnMissingClass("org.springframework.retry.support.RetryTemplate")
static class LoadBalancerInterceptorConfig {
    @Bean
    public LoadBalancerInterceptor ribbonInterceptor(
        LoadBalancerClient loadBalancerClient,
        LoadBalancerRequestFactory requestFactory) {
        return new LoadBalancerInterceptor(loadBalancerClient, requestFactory);
    }

    @Bean
    @ConditionalOnMissingBean
    public RestTemplateCustomizer restTemplateCustomizer(
        final LoadBalancerInterceptor loadBalancerInterceptor) {
        return new RestTemplateCustomizer() {
            @Override
            public void customize(RestTemplate restTemplate) {
                List<ClientHttpRequestInterceptor> list = new ArrayList<>(
                    restTemplate.getInterceptors());
                list.add(loadBalancerInterceptor);
                restTemplate.setInterceptors(list);
            }
        };
    }
}

Auf diese Weise wurde

mit LoadBalancerInterceptor eingerichtet RestTemplate

Ausführliche Erläuterung des von RestTemplate integrierten Menübands der Springcloud-Komponenten

Der Der gesamte Prozess ist etwas kompliziert. Der Kern besteht darin, den LoadBalancerInterceptor zu durchlaufen und den Ladevorgang über den Balance-Aufruf von RibbonLoadBalancerClient einzuleiten. RibbonLoadBalancerClientI kombiniert LoadBalancer und verfügt daher über die Fähigkeit zum Lastenausgleich. Dies ist das Ribbon-Prinzip, das wir im vorherigen Artikel erläutert haben.

Wir haben den tatsächlichen Prozess des Initiierens einer http-Anfrage nicht in der Abbildung dargestellt. Der Standardwert wird von

erstellt. Das Klassendiagramm von SimpleClientHttpRequestFactory lautet wie folgt: ClientHttpRequestFactory

Ausführliche Erläuterung des von RestTemplate integrierten Menübands der Springcloud-Komponenten

Aus dem Aufrufsequenzdiagramm können wir ersehen, dass wir zuerst

aufrufen, um InterceptingClientHttpRequestFactory zu erhalten und durch Kombination InterceptingClientHttpRequest zu initiieren Zu diesem Zeitpunkt beauftragt es seine interne Klasse ClientHttpRequestFactory mit der Verarbeitung: InterceptingClientHttpRequestrreeeInterceptingRequestExecution führt zunächst die erste Ausführung der Interceptor-Sammlung durch Rufen Sie den else-Code zurück und führen Sie ihn aus. Um tatsächlich eine http-Anfrage zu initiieren, gibt es zwei Möglichkeiten, die

-Schnittstelle zu implementieren:

ClientHttpRequestFactory

    Eine ist
  • mit der Methode bereitgestellt von J2SE (die vom java.net-Paket bereitgestellte Methode) Erstellen Sie die zugrunde liegende HTTP-Anforderungsverbindung

    SimpleClientHttpRequestFactory

  • Eine Möglichkeit besteht darin, die
  • -Methode zu verwenden. Die unterste Ebene verwendet HttpClient für den Zugriff Mit dem Remote-HTTP-Dienst können Sie Informationen wie Verbindungspool und Zertifikat konfigurieren.

    HttpComponentsClientHttpRequestFactory

  • RestTemplate verwendet standardmäßig SimpleClientHttpRequestFactory und ruft intern JDKs HttpConnection auf. Das Standard-Timeout ist -1:
@Override
public ClientHttpResponse execute(HttpRequest request, byte[] body) throws IOException {
    if (this.iterator.hasNext()) {
        ClientHttpRequestInterceptor nextInterceptor = this.iterator.next();
        return nextInterceptor.intercept(request, body, this);
    }else {
        ClientHttpRequest delegate = requestFactory.createRequest(request.getURI(), request.getMethod());
        for (Map.Entry<String, List<String>> entry : request.getHeaders().entrySet()) {
            List<String> values = entry.getValue();
            for (String value : values) {
                delegate.getHeaders().add(entry.getKey(), value);
            }
        }
        if (body.length > 0) {
            StreamUtils.copy(body, delegate.getBody());
        }
        return delegate.execute();
    }
}

Verwenden Sie das

Methode. Verwenden Sie einen Verbindungspool (empfohlen) und Sie können auch eine Wiederholungsstrategie festlegen (nicht speziell untersucht).

HttpComponentsClientHttpRequestFactoryWenn Sie den Wiederholungsmechanismus aktivieren möchten, können wir die Wiederholungskomponente von Spring einführen

@Bean
@LoadBalanced
public RestTemplate restTemplate() {
    SimpleClientHttpRequestFactory factory  = new SimpleClientHttpRequestFactory();
    factory.setConnectTimeout(1000 * 2);//连接超时时间
    factory.setReadTimeout(1000 * 1);//读超时时间
    return new RestTemplate(factory);
}

wie dieses springcloud-ribbon Die folgende Konfiguration wird verschärft:

<dependency>
    <groupId>org.springframework.retry</groupId>
    <artifactId>spring-retry</artifactId>
    <version>版本号</version>
</dependency>
@Configuration
@ConditionalOnClass(RetryTemplate.class)
public static class RetryAutoConfiguration {
    @Bean
    public RetryTemplate retryTemplate() {
        RetryTemplate template =  new RetryTemplate();
        template.setThrowLastExceptionOnExhausted(true);
        return template;
    }

    @Bean
    @ConditionalOnMissingBean
    public LoadBalancedRetryPolicyFactory loadBalancedRetryPolicyFactory() {
        return new LoadBalancedRetryPolicyFactory.NeverRetryFactory();
    }
}

@Configuration
@ConditionalOnClass(RetryTemplate.class)
public static class RetryInterceptorAutoConfiguration {
    @Bean
    @ConditionalOnMissingBean
    public RetryLoadBalancerInterceptor ribbonInterceptor(
        LoadBalancerClient loadBalancerClient, LoadBalancerRetryProperties properties,
        LoadBalancedRetryPolicyFactory lbRetryPolicyFactory,
        LoadBalancerRequestFactory requestFactory) {
        return new RetryLoadBalancerInterceptor(loadBalancerClient, properties,
                                                lbRetryPolicyFactory, requestFactory);
    }

    @Bean
    @ConditionalOnMissingBean
    public RestTemplateCustomizer restTemplateCustomizer(
        final RetryLoadBalancerInterceptor loadBalancerInterceptor) {
        return new RestTemplateCustomizer() {
            @Override
            public void customize(RestTemplate restTemplate) {
                List<ClientHttpRequestInterceptor> list = new ArrayList<>(
                    restTemplate.getInterceptors());
                list.add(loadBalancerInterceptor);
                restTemplate.setInterceptors(list);
            }
        };
    }
}

Der Interceptor wird durch

ersetzt, wo die Wiederholungskomponente retryTemplate integriert ist. Die Wiederholungsstrategie wird von der

-Schnittstelle konfiguriert. Die folgenden Standardkonfigurationsparameter sind RetryLoadBalancerInterceptor

@Bean
@ConditionalOnClass(name = "org.springframework.retry.support.RetryTemplate")
@ConditionalOnMissingBean
    public LoadBalancedRetryPolicyFactory loadBalancedRetryPolicyFactory(SpringClientFactory clientFactory) {
    return new RibbonLoadBalancedRetryPolicyFactory(clientFactory);
}
RetryHandler wird nur für ein bestimmtes Menüband wirksam. MaxAutoRetries und MaxAutoRetriesNextServer werden zusammen verwendet. Die maximale Anzahl von Wiederholungsversuchen beträgt für jeden Server. Wenn MaxAutoRetries=1 und MaxAutoRetriesNextServer=1 festgelegt sind, beträgt die maximale Anzahl von Wiederholungsversuchen. DefaultLoadBalancerRetryHandler

Verwandte Artikel:

xxx.ribbon.MaxAutoRetries=1

Java-Beispiel – Array zur Sammlung

Das obige ist der detaillierte Inhalt vonAusführliche Erläuterung des von RestTemplate integrierten Menübands der Springcloud-Komponenten. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
1 Monate vorBy尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Beste grafische Einstellungen
1 Monate vorBy尊渡假赌尊渡假赌尊渡假赌
Will R.E.P.O. Crossplay haben?
1 Monate vorBy尊渡假赌尊渡假赌尊渡假赌

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

SecLists

SecLists

SecLists ist der ultimative Begleiter für Sicherheitstester. Dabei handelt es sich um eine Sammlung verschiedener Arten von Listen, die häufig bei Sicherheitsbewertungen verwendet werden, an einem Ort. SecLists trägt dazu bei, Sicherheitstests effizienter und produktiver zu gestalten, indem es bequem alle Listen bereitstellt, die ein Sicherheitstester benötigen könnte. Zu den Listentypen gehören Benutzernamen, Passwörter, URLs, Fuzzing-Payloads, Muster für vertrauliche Daten, Web-Shells und mehr. Der Tester kann dieses Repository einfach auf einen neuen Testcomputer übertragen und hat dann Zugriff auf alle Arten von Listen, die er benötigt.

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

Leistungsstarke integrierte PHP-Entwicklungsumgebung