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
HttpAccessor
Hauptsächlich erstellt basierend auf ClientHttpRequestFactory
ClientHttpRequest
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
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
erstellt. Das Klassendiagramm von SimpleClientHttpRequestFactory
lautet wie folgt: ClientHttpRequestFactory
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: InterceptingClientHttpRequest
rreeeInterceptingRequestExecution
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
ClientHttpRequestFactory
SimpleClientHttpRequestFactory
HttpComponentsClientHttpRequestFactory
@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).HttpComponentsClientHttpRequestFactory
Wenn 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!