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

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

php是最好的语言
php是最好的语言Original
2018-08-02 14:28:022771Durchsuche

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