成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

SpringBoot有關遠程服務調用的細節詳解(阻塞與非阻塞)

開發 前端
為了使任何定制的范圍盡可能窄,注入自動配置的WebClient.Builder,然后根據需要調用它的方法。WebClient.Builder實例是有狀態的:builder上的任何更改都反映在隨后用它創建的所有client上。如果你想用同一個builder創建多個客戶端,你也可以考慮用WebClient.Builder other = builder.clone()。

環境:Springboot2.6.14

如果你的應用程序調用遠程REST服務,Spring Boot使用RestTemplate或WebClient使之非常的方便。

RestTemplate

如果需要從應用程序調用遠程REST服務,可以使用Spring框架的RestTemplate類。由于RestTemplate實例通常需要在使用之前進行自定義,Spring Boot不提供任何單個自動配置的RestTemplate bean。但是,它可以自動配置一個RestTemplateBuilder,在需要時可以使用它創建RestTemplate實例。自動配置的RestTemplateBuilder確保合理的HttpMessageConverters應用于RestTemplate實例。

以下代碼顯示了一個典型示例:?

@Service
public class RemoteService {


private final RestTemplate restTemplate ;


public RemoteService(RestTemplateBuilder restTemplateBuilder) {
this.restTemplate = restTemplateBuilder.build() ;
}


public Details storageService(Long storageId, Integer count) {
return this.restTemplate.getForObject("http://localhost:8080/storage/deduct/{storageId}/{count}", Boolean.class, storageId, count) ;
}
}

RestTemplateBuilder包括許多可用于快速配置RestTemplate的有用方法。例如,要添加BASIC身份驗證支持,可以使用
builder.basicAuthentication("admin","123").build()

自定義RestTemplate

RestTemplate定制有三種主要方法,這取決于你希望定制應用的范圍。

要使任何自定義的范圍盡可能窄,請注入自動配置的RestTemplateBuilder,然后根據需要調用其方法。每個方法調用都返回一個新的RestTemplateBuilder實例,因此自定義僅影響當前builder的使用。

要進行應用程序范圍的附加定制,請使用RestTemplateCustomizer bean。所有這樣的bean都會自動注冊到自動配置的RestTemplateBuilder中,并應用于使用它構建的任何模板。

自動配置如下:

public class RestTemplateAutoConfiguration {
@Bean
@Lazy
@ConditionalOnMissingBean
public RestTemplateBuilder restTemplateBuilder(RestTemplateBuilderConfigurer restTemplateBuilderConfigurer) {
RestTemplateBuilder builder = new RestTemplateBuilder();
return restTemplateBuilderConfigurer.configure(builder);
}
}

自定義配置

public class CustomRestTemplateCustomizer implements RestTemplateCustomizer {


@Override
public void customize(RestTemplate restTemplate) {
restTemplate.setRequestFactory(new HttpComponentsClientHttpRequestFactory(httpClient));
}
}

最后,可以定義自己的RestTemplateBuilder bean。這樣做將替換自動配置的RestTemplateBuilder。如果你希望任何RestTemplateCustomizer bean應用于你的自定義Builder,就像自動配置所做的那樣,使用RestTemplateBuilderConfigurer對其進行配置。下面的例子公開了一個RestTemplateBuilder,它與Spring Boot的自動配置相匹配,只是還指定了自定義連接和讀取超時:?

@Configuration(proxyBeanMethods = false)
public class CustomRestTemplateBuilderConfiguration {


@Bean
public RestTemplateBuilder restTemplateBuilder(RestTemplateBuilderConfigurer configurer) {
return configurer.configure(new RestTemplateBuilder()).setConnectTimeout(Duration.ofSeconds(5))
.setReadTimeout(Duration.ofSeconds(2));
}
}

默認SpringBoot提供有RestTemplateBuilderConfigurer?

public class RestTemplateAutoConfiguration {


@Bean
@Lazy
@ConditionalOnMissingBean
public RestTemplateBuilderConfigurer restTemplateBuilderConfigurer(
ObjectProvider<HttpMessageConverters> messageConverters,
ObjectProvider<RestTemplateCustomizer> restTemplateCustomizers,
ObjectProvider<RestTemplateRequestCustomizer<?>> restTemplateRequestCustomizers) {
RestTemplateBuilderConfigurer configurer = new RestTemplateBuilderConfigurer();
configurer.setHttpMessageConverters(messageConverters.getIfUnique());
configurer.setRestTemplateCustomizers(restTemplateCustomizers.orderedStream().collect(Collectors.toList()));
configurer.setRestTemplateRequestCustomizers(restTemplateRequestCustomizers.orderedStream().collect(Collectors.toList()));
return configurer;
}
}

使用系統默認的RestTemplateBuilderConfigurer是個明智選擇,它合理配置了系統提供的默認HttpMessageConverters。

最極端(也很少使用)的選項是在不使用配置程序的情況下創建自己的RestTemplateBuilder bean。除了替換自動配置的構建器之外,這還可以防止使用任何RestTemplateCustomizer bean。

WebClient

如果你的類路徑上有Spring WebFlux,你也可以選擇使用WebClient來調用遠程REST服務。與RestTemplate相比,這個客戶端具有更強的功能性,并且是完全響應式的。

Spring Boot創建并預配置WebClient.Builder。強烈建議將它注入到組件中,并使用它創建WebClient實例。Spring Boot正在配置該構建器以共享HTTP資源,以與服務器相同的方式反映編解碼器設置,等等。

以下代碼顯示了一個典型示例:?

@Service
public class WebClientService {


private final WebClient webClient;


public WebClientService(WebClient.Builder webClientBuilder) {
this.webClient = webClientBuilder.baseUrl("http://localhost:8080").build() ;
}
public Mono<Details> storageService(Long storageId, Integer count) {
return this.webClient.get().uri("/storage/deduct/{storageId}/{count}", storageId, count).retrieve().bodyToMono(Boolean.class) ;
}
}

WebClient運行時

Spring Boot將自動檢測使用哪個ClientHttpConnector來驅動WebClient,這取決于應用程序類路徑上可用的庫。目前支持Reactor Netty、Jetty RS客戶端和Apache HttpClient。

源碼?

public interface WebClient {
static WebClient.Builder builder() {
return new DefaultWebClientBuilder();
}
}
final class DefaultWebClientBuilder implements WebClient.Builder {
private static final boolean reactorClientPresent;
private static final boolean jettyClientPresent;
private static final boolean httpComponentsClientPresent;
static {
ClassLoader loader = DefaultWebClientBuilder.class.getClassLoader();
reactorClientPresent = ClassUtils.isPresent("reactor.netty.http.client.HttpClient", loader);
jettyClientPresent = ClassUtils.isPresent("org.eclipse.jetty.client.HttpClient", loader);
httpComponentsClientPresent =
ClassUtils.isPresent("org.apache.hc.client5.http.impl.async.CloseableHttpAsyncClient", loader) &&
ClassUtils.isPresent("org.apache.hc.core5.reactive.ReactiveDataConsumer", loader);
}
public WebClient build() {
ClientHttpConnector connectorToUse = (this.connector != null ? this.connector : initConnector());
// ...
return new DefaultWebClient(...) ;
}
private ClientHttpConnector initConnector() {
if (reactorClientPresent) {
return new ReactorClientHttpConnector();
} else if (jettyClientPresent) {
return new JettyClientHttpConnector();
} else if (httpComponentsClientPresent) {
return new HttpComponentsClientHttpConnector();
}
throw new IllegalStateException("No suitable default ClientHttpConnector found");
}
}

spring-boot-starter-webflux啟動器默認依賴于io.projectreactor.netty:reactor-netty,它帶來了服務器和客戶端實現。如果選擇使用Jetty作為響應式服務器,則應該在Jetty響應式HTTP客戶端庫上添加一個依賴項。對服務器和客戶端使用相同的技術有其優點,因為它將自動在客戶端和服務器之間共享HTTP資源。

開發人員可以通過提供自定義的ReactorResourceFactory或JettyResourceFactory bean來覆蓋Jetty和Reactor Netty的資源配置——這將應用于客戶端和服務器。

如果你希望覆蓋客戶端的選擇,可以定義自己的ClientHttpConnector bean并完全控制客戶機配置。

WebClient自定義

WebClient定制主要有三種方法,具體取決于你希望定制應用的范圍。

為了使任何定制的范圍盡可能窄,注入自動配置的WebClient.Builder,然后根據需要調用它的方法。WebClient.Builder實例是有狀態的:builder上的任何更改都反映在隨后用它創建的所有client上。如果你想用同一個builder創建多個客戶端,你也可以考慮用WebClient.Builder other = builder.clone();

對所有WebClient進行應用程序范圍的附加定制WebClient.Builder實例,你可以聲明WebClientCustomizer

最后,你可以使用原始API:WebClient.create()。在這種情況下,不會應用自動配置或WebClientCustomizer。

責任編輯:武曉燕 來源: 實戰案例錦集
相關推薦

2021-06-04 18:14:15

阻塞非阻塞tcp

2018-03-28 08:52:53

阻塞非阻塞I

2012-10-10 10:00:27

同步異步開發Java

2018-01-11 08:24:45

服務器模型詳解

2019-07-23 11:01:57

Python同步異步

2017-03-01 16:40:12

Linux驅動技術設備阻塞

2012-02-22 21:15:41

unixIO阻塞

2011-12-08 10:12:34

JavaNIO

2024-12-02 00:57:17

非阻塞異步編程

2015-07-03 10:12:04

編程同步非阻塞

2023-12-06 07:28:47

阻塞IO異步IO

2024-09-23 17:15:28

Python并發并行

2021-02-27 16:08:17

Java異步非阻塞

2022-06-22 08:16:29

異步非阻塞框架

2025-05-15 04:00:55

2012-05-29 15:17:08

JavaWMIC

2022-09-22 10:51:32

服務端開發者異步非阻塞編程

2011-12-07 17:17:02

JavaNIO

2023-07-31 08:55:01

Java NIO非阻塞阻塞

2021-02-04 10:50:11

網絡安全非阻塞模Winsock編程
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 天堂免费看片 | 国产激情网 | 精品在线免费观看视频 | 97国产精品视频人人做人人爱 | 午夜a√| 一区二区精品 | 欧美视频第二页 | 亚洲免费视频在线观看 | 在线色网 | 四虎成人免费电影 | 狠狠艹| 这里只有精品99re | 国产亚洲精品精品国产亚洲综合 | 午夜影院免费体验区 | 99精品热视频 | 全部免费毛片在线播放网站 | 国产特一级黄色片 | 久久大陆 | 91久久夜色| 亚洲最大成人综合 | 日韩精品一区二区三区中文字幕 | 亚洲一区 中文字幕 | 色狠狠一区 | 欧美在线观看免费观看视频 | 国产成人福利在线观看 | 日韩精品四区 | 一级片毛片 | 国产日韩一区二区三免费高清 | 欧美激情精品久久久久久变态 | 久久青青 | 亚洲久久在线 | 国产精品久久国产精品 | www.性色| 日韩欧美亚洲 | 欧美在线一区二区视频 | 精品熟人一区二区三区四区 | 成人免费视频一区二区 | 亚洲在线一区 | 欧美在线视频一区二区 | 亚洲伊人精品酒店 | 久久久久国产一区二区三区 |