精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

棄用RestTemplate!RestClient真香

開發 前端
從Spring Cloud 4.1.0開始RestClient支持服務發現的負載均衡。在RestTemplate時代,我們在定義RestTemplate bean對象時,只要添加了@LoadBalanced注解,那么我們的RestTemplate就可以通過服務名的方式遠程調用。

環境:Spring Boot3.2.5

1. 簡介

從Spring Framework 6.1和Spring Boot 3.2開始,我們可以使用Spring       RestClient通過流暢且同步的API執行HTTP請求。RestClient基于底層的HTTP客戶端庫工作,如JDK       HttpClient、Apache HttpComponents等。

顧名思義,RestClient提供了WebClient的流暢API設計和RestTemplate的功能。RestClient在設計時就考慮了可測試性,使得在單元測試中模擬HTTP交互變得更加容易。

請注意,對于異步和流式處理場景,WebClient仍然是首選的API。

RestTemplate、RestClient 和 WebClient 如何選擇?

從Spring 6.1開始,與RestTemplate相比,RestClient為同步HTTP訪問提供了更現代的API。RestTemplate是Spring 3中引入的,它是一個臃腫的類,以模板類的形式暴露了HTTP的所有功能,但擁有過多的重載方法。

WebClient也支持同步HTTP訪問,但它需要額外的依賴spring-boot-starter-webflux。而使用RestClient,我們可以避免在項目中添加新的依賴。

RestTemplate:是一個較舊的、用于發起HTTP請求的同步API。它缺乏新應用程序可能需要的靈活性和現代特性。

WebClient:是Spring WebFlux的反應式、非阻塞客戶端部分。盡管它可以用于同步交互,但對于簡單的用例來說,它似乎有些過于復雜。

RestClient:是Spring框架的新增成員,旨在取代RestTemplate。它提供了一個像WebClient一樣更現代、流暢的API,但不需要反應式堆棧,因此在RestTemplate和WebClient之間找到了一個平衡點。

以下是RestTemplate與WebClient對比:

功能

WebClient

RestTemplate

反應式編程

基于反應式原理構建,支持反應式編程

同步,不是為反應式編程而設計的

技術

基于反應堆棧

基于 Servlet 棧

線程模型

使用非阻塞 I/O,適合處理大量并發請求

使用阻塞 I/O,在高并發情況下可能導致線程阻塞

Java版本

需要 Java 8 或更高版本。支持函數式編程

兼容 Java 6 或更高版本

錯誤處理

使用 onErrorResume、onErrorReturn 等操作符提供強大的錯誤處理功能

錯誤處理通常使用 try-catch 塊進行

流式

使用 Flux 和 Mono 支持流式數據,適用于反應式流式應用場景

對流的支持有限,不適合反應式流

使用類

最適合微服務、反應式應用程序和需要高并發性的應用場景

適用于傳統的單片式應用和簡單用例

依賴

需要依賴 Spring WebFlux

需要 Spring Web 依賴關系

功能支持

與反應式編程模式相一致,并有可能得到持續發展和支持

可能會進行維護更新,但今后可能不會受到那么多關注

接下來,我將詳細的介紹RestClient的使用。

2. 實戰案例

2.1 創建RestClient

Spring 允許使用多種靈活的方法來初始化 RestClient Bean。例如,最簡單的方法是使用 create() 方法。

@Value("${pack.remote.address:http://www.pack.com}")
private String baseURI;
@Bean
public RestClient restClient() {
  return RestClient.create(baseURI) ;
}

我們還可以使用 builder() 方法來設置更復雜的選項,如默認頭、請求處理器、消息處理程序等。例如,下面的配置使用 HttpClient 作為 HTTP 連接管理的底層庫。

@Bean
public HttpComponentsClientHttpRequestFactory clientHttpRequestFactory() {
  HttpComponentsClientHttpRequestFactory clientHttpRequestFactory
    = new HttpComponentsClientHttpRequestFactory() ;
  clientHttpRequestFactory.setHttpClient(httpClient) ;
  // 更多配置
  return clientHttpRequestFactory ;
}
@Bean
public RestClient restClient(CloseableHttpClient httpClient) {
  return RestClient.builder()
    .baseUrl(baseURI)
    // 更多配置
    .requestFactory(clientHttpRequestFactory())
    .build() ;
}

甚至,我們還可以直接通過RestTemplate來構建RestClient對象

@Bean
public RestClient restClient(RestTemplate restTemplate) {
  return RestClient.create(restTemplate);
}

2.2 HTTP Get請求

restClient.get() 用于向指定的 URL 創建 GET 請求。請注意,我們可以將動態值傳遞給 URI 模板。

@Resource
private RestClient restClient ;
restClient.get()
  .uri("/users")
  //...
restClient.get()
  .uri("/employees/{id}", id)
  //...

最后,retrieve() 方法發送請求并返回包含 API 響應的 ResponseSpec。下面的請求將獲取用戶列表,并將響應體解析為User實例列表。

List<User> list = restClient.get()
  .uri("/users")
  .accept(MediaType.APPLICATION_JSON)
  .retrieve()
  .body(List.class) ;

我們還可以處理,如請求的狀態、請求header等數據,可以按如下方式獲取響應實體(ResponseEntity):

ResponseEntity<List> responseEntity = restClient.get()
  .uri("/users")
  .accept(MediaType.APPLICATION_JSON)
  .retrieve()
  .toEntity(List.class) ;

2.3 HTTP Post請求

restClient.post() 用于處理 POST 請求。除了 POST API 通常不返回任何響應外,其他大部分與 GET API 調用相同。toBodilessEntity() 方法具有完全相同的功能,可用于 POST API。

User user = new User(666L, "張三", 22) ;
ResponseEntity<Void> responseEntity = restClient.post()
  .uri("/users")
  .contentType(MediaType.APPLICATION_JSON)
  .body(user)
  .retrieve()
  .toBodilessEntity() ;

2.4 HTTP Put請求

restClient.put() 用于處理 PUT 請求。PUT API 通常會發送一個請求正文并接收一個響應正文,如下示例。

User user = new User(666L, "張三", 22) ;
ResponseEntity<User> responseEntity = restClient.put()
  .uri("/users/666")
  .contentType(MediaType.APPLICATION_JSON)
  .accept(MediaType.APPLICATION_JSON)
  .body(user)
  .retrieve()
  .toEntity(User.class) ;

2.5 HTTP Delete請求

restClient.delete() 用于處理 DELETE 請求。一般來說,delete API 在服務器中接受,并且不會要求響應體。

ResponseEntity<Employee> responseEntity = restClient.delete()
  .uri("/users/666")
  .retrieve()
  .toBodilessEntity() ;

2.6 RestClient復雜應用

如果我們需要完全控制響應處理,可以使用 exchange() 方法。它提供了對 HttpRequest 和 HttpResponse 對象的訪問權限,然后我們就可以按自己的需要使用它們了。

List<Employee> list = restClient.get()
  .uri("/users")
  .accept(MediaType.APPLICATION_JSON)
  .exchange((request, response) -> {
    List response = null ;
    if (response.getStatusCode().is4xxClientError()
        || response.getStatusCode().is5xxServerError()) {
      System.err.println("請求錯誤") ;
    } else {
      response = new ObjectMapper().readValue(response.getBody(), List.class) ;
    }
    return response ;
  }) ;

2.7 異常處理

對于失敗的請求,RestClient 會拋出兩種異常:

HttpClientErrorException:帶 4xx 響應代碼

HttpServerErrorException:響應代碼為 5xx

try {
  User user = restClient.get()
    .uri("/users/666")
    .accept(MediaType.APPLICATION_JSON)
    .retrieve()
    .body(User.class) ;
} catch(HttpClientErrorException e4xx) {
  // ...
} catch(HttpServerErrorException e5xx) {
  // ...
}

2.8 自定義攔截器

我們可以通過RestClient.Builder設置攔截器,通過攔截器我們可以進行日志的記錄,認證的配置等等,如下示例:

@Bean
public RestClient demoRestClient(LoggingRestClientInterceptor loggingInterceptor) {
  return RestClient
    .builder()
    .requestInterceptor(loggingInterceptor)
    .build() ;
}

自定義攔截器

@Component
public static class LoggingRestClientInterceptor implements ClientHttpRequestInterceptor {
  @Override
  public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution)
      throws IOException {
    System.err.println("logging...") ;
    return execution.execute(request, body) ;
  }
}

注:RestTemplate與RestClient使用的攔截器是相同的。所以你可以復用之前寫的攔截器。

2.9 基于服務發現負載均衡

從Spring Cloud 4.1.0開始RestClient支持服務發現的負載均衡。在RestTemplate時代,我們在定義RestTemplate bean對象時,只要添加了@LoadBalanced注解,那么我們的RestTemplate就可以通過服務名的方式遠程調用。

RestClient要通過服務發現機制調用,那么我們就要自定義RestClient.Builder對象。

@Bean
@LoadBalanced
public RestClient.Builder demoRestClientBuilder() {
  Builder builder = RestClient.builder().baseUrl("http://demo") ;
  return builder ;
}

接下來,我們就可以通過上面自定義的RestClient.Builder來構建RestClient。

@Bean
public RestClient lbcRestClient(RestClient.Builder builder) {
  return builder
    .baseUrl("http://demo")
    .build() ;
}

這樣配置,我們的RestClient就具備服務發現的能力了。

責任編輯:武曉燕 來源: Spring全家桶實戰案例源碼
相關推薦

2025-11-10 07:50:33

2024-10-17 14:14:29

2020-12-03 18:29:30

KubernetesDocker容器

2021-06-04 05:21:19

KubernetesDocker容器

2022-06-03 09:41:03

DockerKubernetes容器

2024-06-27 13:45:21

2022-04-08 16:14:21

FedoraBIOS32 位操作系統

2023-09-22 16:54:42

GNOME 45系統

2023-10-12 07:46:02

2011-03-23 09:40:37

Google GearChrome

2018-09-10 15:40:46

GitHubQuery前端

2022-02-22 14:07:07

框架配置類Spring

2020-05-15 08:30:25

前端開發工具

2011-08-05 09:59:04

GNOME 3Linus TorvaXfce

2020-12-18 09:23:41

KubernetesDocker

2020-10-28 07:03:11

NodeSassDart Sass

2010-05-20 14:37:34

紅帽Xen

2021-10-20 14:29:44

layuijQuery前端

2024-01-08 08:44:06

2025-08-26 02:25:00

點贊
收藏

51CTO技術棧公眾號

日韩精品在线观| 亚洲午夜三级在线| 91人成网站www| 精品少妇久久久| 视频精品在线观看| 欧美一级午夜免费电影| 欧美视频在线播放一区| 欧美另类极品| av影院午夜一区| 国产日产久久高清欧美一区| 少妇久久久久久被弄高潮| 99久久精品无免国产免费| 婷婷六月综合| 日韩激情片免费| 国产女同无遮挡互慰高潮91| 变态调教一区二区三区| 国产欧美一区二区三区鸳鸯浴 | 国精产品一区一区二区三区mba| 香港久久久电影| 在线观看成人免费视频| 超碰成人免费在线| 日韩黄色影院| 久久久精品天堂| 国产综合动作在线观看| 91精品国自产| 天堂资源在线中文精品| 久久久久久久亚洲精品| 极品魔鬼身材女神啪啪精品| 精品在线观看入口| 亚洲爱爱爱爱爱| 色诱av手机版| 精品国产一区二| 欧美日韩国产首页在线观看| 免费男同深夜夜行网站| japanese色国产在线看视频| 国产精品成人免费在线| 少妇特黄a一区二区三区| 人妻丰满熟妇av无码区hd| 国产一区二区三区四区五区美女| 国产精品久久久久av免费| 国产一区二区99| 一区二区三区四区五区在线 | 99热在线观看免费精品| 国产一区亚洲| 欧美国产日韩xxxxx| 日本黄色片免费观看| 欧美丰满日韩| www国产91| 综合五月激情网| 国产精品精品国产一区二区| 最近2019中文免费高清视频观看www99| 久久丫精品国产亚洲av不卡| 精品福利网址导航| 精品网站999www| 国产又爽又黄无码无遮挡在线观看| 999在线精品| 亚洲精品99久久久久| 午夜视频在线观看国产| 精品综合久久88少妇激情| 亚洲第一区中文99精品| 噜噜噜在线视频| 免费成人网www| 伊人久久久久久久久久| a级黄色免费视频| 91综合久久| 久久综合国产精品台湾中文娱乐网| 一级黄色片日本| 午夜久久tv| 国产最新精品视频| www.色国产| 卡一卡二国产精品| 51国偷自产一区二区三区的来源| 亚洲成人中文字幕在线| gogogo免费视频观看亚洲一| 麻豆精品视频| avtt亚洲| 亚洲午夜在线观看视频在线| 国产a级片网站| 欧美黄色三级| 日韩一区二区视频| 中文字幕精品久久久| 一区二区美女| 久久香蕉频线观| 日韩黄色a级片| 日本午夜精品一区二区三区电影 | 欧美日韩成人精品| 久久国产精品系列| 麻豆91在线播放| 国产高清精品一区二区| 日韩一二三四| 亚洲三级小视频| 波多野结衣家庭教师在线播放| 亚洲欧美在线成人| 日韩免费观看高清完整版 | 91久久高清国语自产拍| 久久久女女女女999久久| 无码人妻一区二区三区线| 久久国产夜色精品鲁鲁99| 动漫美女被爆操久久久| 黄色av网站在线看| 亚洲成人中文在线| 特级丰满少妇一级| 久久成人福利| 久久精品在线播放| 日本一区二区三区精品| 精品在线免费观看| 鲁丝一区二区三区免费| 99久久精品免费观看国产| 色婷婷精品久久二区二区蜜臀av| 下面一进一出好爽视频| 国产区精品区| 91精品国产高清| 99热这里只有精品在线| 国产日产欧美一区| 黄色片网址在线观看| 精品久久久久久久久久岛国gif| 亚洲精品一区二区三区不| 免费在线观看av网址| 麻豆精品新av中文字幕| 美女三级99| 岛国毛片av在线| 555夜色666亚洲国产免| 女人黄色一级片| 国产深夜精品| 国产在线一区二区三区四区| 超碰免费在线播放| 欧美三区在线视频| 日本性高潮视频| 模特精品在线| 麻豆av一区| 日韩激情电影免费看| 精品国产乱码久久久久久免费| 成人性生活毛片| 精品在线一区二区| 亚洲一区三区| jvid一区二区三区| 亚洲视频国产视频| 日韩欧美在线观看免费| 99精品欧美一区| 91成人在线观看喷潮教学| 国产精品色呦| 97精品在线视频| 欧美一级淫片免费视频魅影视频| 一级女性全黄久久生活片免费| 日韩av福利在线观看| 亚洲一区色图| 96pao国产成视频永久免费| 成人av黄色| 日韩欧美电影一二三| 男女性高潮免费网站| 国产精品资源网站| 久久亚洲国产成人精品无码区| 日韩欧美中文字幕在线视频| 欧美剧在线观看| 日本美女一级视频| 精品久久久久久久久久| 91精品国产自产| 水野朝阳av一区二区三区| 人禽交欧美网站免费| 成人黄色在线| 中文字幕日韩有码| 国产精品系列视频| 一区二区三区在线观看国产| www.555国产精品免费| 国产日韩1区| 三区精品视频| 免费一级欧美片在线观看网站| 欧美大荫蒂xxx| 亚洲色图21p| 欧美在线视频全部完| 97精品在线播放| 高清不卡一区二区| 1024av视频| 全球成人免费直播| av资源站久久亚洲| 成人线上视频| 久久久精品一区| 搡老岳熟女国产熟妇| 欧美亚洲综合另类| 欧美成人黄色网| 久久久综合九色合综国产精品| xx欧美撒尿嘘撒尿xx| 中文字幕一区二区三区在线视频 | 成人欧美一区二区三区黑人孕妇| 日本小视频在线免费观看| 日韩二区三区在线| 一级全黄裸体免费视频| 亚洲一区二区在线免费观看视频 | 成人三级视频| 国产91精品入口17c| 成人影院av| 精品中文字幕在线观看| 免费在线毛片| 精品国产欧美一区二区| 国产女主播喷水视频在线观看| 有码一区二区三区| 国产av自拍一区| 成av人片一区二区| 激情五月婷婷基地| 午夜在线视频观看日韩17c| 中文字幕一区二区三区四区五区| 极品尤物一区| 亚洲一区中文字幕| 日韩制服诱惑| 5278欧美一区二区三区| 26uuu亚洲电影在线观看| 亚洲男人天堂古典| 韩国av在线免费观看| 欧美日韩中文字幕一区二区| 成人免费看片98欧美| 一区二区三区高清| 中文字幕第二区| 久久久蜜桃精品| 影音先锋资源av| 国内精品久久久久影院一蜜桃| 日本成人中文字幕在线| 亚洲在线网站| 亚洲精品无码国产| 亚洲网色网站| 一区二区三区|亚洲午夜| 国产成人精品三级高清久久91| 国产aⅴ精品一区二区三区黄| 色8久久久久| 国产精品老牛影院在线观看| 在线观看v片| 久久久免费在线观看| 日本孕妇大胆孕交无码| 美女福利视频一区| dy888亚洲精品一区二区三区| 三级精品视频久久久久| 成人性爱视频在线观看| 亚洲欧美综合另类中字| 五月婷婷深深爱| 亚洲精品91美女久久久久久久| 亚洲成人久久精品| 精品欧美乱码久久久久久1区2区| 国产伦子伦对白视频| 欧美三级电影在线看| 特级西西444www大胆免费看| 一本色道久久综合精品竹菊| 国产精品视频免费播放| 欧美视频不卡中文| 日韩特黄一级片| 五月婷婷欧美视频| 在线观看精品国产| 欧美日韩国产综合视频在线观看中文| 国产精品男女视频| 欧美性xxxxxxxxx| 亚洲欧美日韩激情| 欧美亚洲一区二区三区四区| 波多野结衣高清视频| 在线日韩国产精品| 国产又大又长又粗| 日韩视频123| 人人妻人人澡人人爽人人欧美一区| 亚洲精品一区二区三区影院 | 国产精品久久久久久久成人午夜| 欧美日高清视频| 国产成年妇视频| 亚洲国产91色在线| 欧美一区二区少妇| 中文字幕亚洲在线| 91麻豆免费在线视频| 欧美激情一区二区三区在线视频观看 | 欧美日本网站| 欲色天天网综合久久| 1769在线观看| 久久99亚洲热视| 色网在线免费观看| 国产欧美中文字幕| 日韩成人视屏| 免费在线观看91| 天堂美国久久| 国产资源在线视频| 日本在线不卡视频| 日本少妇一级片| 2017欧美狠狠色| 小早川怜子一区二区的演员表| 亚洲一区二区三区四区在线| 中文字幕亚洲精品一区| 欧美喷潮久久久xxxxx| 亚洲精品国产一区二| 亚洲精品永久免费| 国产成人午夜| 欧洲美女免费图片一区| www欧美在线观看| 国产一区二区无遮挡| 波多野结衣在线观看一区二区三区| 看一级黄色录像| 免费看黄裸体一级大秀欧美| 黄色小视频免费网站| 97久久超碰国产精品| 久久久国产一级片| 欧美日韩国产在线播放| 国产色视频在线| 亚洲小视频在线观看| 欧美v亚洲v| 国产精品午夜国产小视频| 国产精品色呦| 99亚洲国产精品| 免费高清在线一区| 精品无码国产一区二区三区51安| 国产精品久久网站| 久久免费激情视频| 日韩欧美123| 黄色网址在线免费| 国产精品18久久久久久麻辣| 亚洲电影一区| 一区在线电影| 视频在线观看国产精品| www.美色吧.com| 亚洲免费观看高清完整版在线| www.久久精品视频| 亚洲精品久久视频| 色呦呦在线播放| 91亚洲午夜在线| 日韩精品dvd| 热久久精品国产| 91免费视频网址| 中文字幕第28页| 7777精品伊人久久久大香线蕉的 | 91精品在线一区二区| 国产露出视频在线观看| 5566日本婷婷色中文字幕97| 91精品久久久久久综合五月天| 在线国产99| 美女在线观看视频一区二区| 黄色工厂在线观看| 亚洲第一在线综合网站| 精品国自产在线观看| 久久久极品av| 中文字幕成人| 中文字幕一区二区三区有限公司| 免费xxxx性欧美18vr| av手机在线播放| 欧美在线|欧美| 国产精品秘入口| 国产精品av免费在线观看| 免费欧美视频| 成人在线免费播放视频| 26uuu亚洲综合色| 麻豆精品久久久久久久99蜜桃| 日韩精品视频在线观看网址| www.综合| 欧美精品一区二区三区在线四季| 久久99伊人| 成人做爰69片免网站| 欧洲国内综合视频| 国产福利片在线| 国产欧美亚洲精品| 中文无码久久精品| 国产污在线观看| 午夜电影一区二区| 精品推荐蜜桃传媒| 国产精品爱久久久久久久| 日韩视频在线观看| 三日本三级少妇三级99| 一区二区在线观看av| 免费a级片在线观看| 55夜色66夜色国产精品视频| 精品产国自在拍| 日韩va在线观看| 亚洲成人第一页| 九色在线播放| 91免费欧美精品| 欧美日韩少妇| 亚洲一区二区观看| 欧美另类久久久品| 国产羞羞视频在线播放| 麻豆av福利av久久av| 另类成人小视频在线| 欧美在线你懂得| 一区二区三区午夜| 欧美巨乳美女视频| 国产色噜噜噜91在线精品 | 麻豆视频免费在线播放| 日韩一区二区三| 久久电影tv| 中文字幕欧美人与畜| 99re66热这里只有精品3直播| 欧美一级黄视频| 欧美精品一本久久男人的天堂| 日韩激情网站| 中文国产在线观看| 粉嫩av一区二区三区免费野| 国产人成在线观看| 97中文在线| 日本中文字幕一区| 国产精品第九页| www.亚洲男人天堂| 亚洲欧洲色图| 三上悠亚 电影| 欧美伊人精品成人久久综合97| 欧美性爽视频| 亚洲精品一区二| 97久久精品人人做人人爽| 99久久精品国产色欲| 日本在线观看天堂男亚洲| 综合久久精品| 国产成人在线网址|