精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

...xxx性欧美| 久久精品系列| 精品国产乱码久久久久久浪潮 | 亚洲午夜电影网| 激情小说网站亚洲综合网 | 四虎在线精品| 91欧美一区二区| 国产精品久久久久久久久久久久 | 999国产精品视频免费| 欧美久久九九| 亚洲欧美中文另类| 午夜av中文字幕| 欧美freesex黑人又粗又大| 国产丝袜欧美中文另类| 亚洲xxxxx| 中文字幕精品无码一区二区| 亚洲第一天堂| 中文字幕字幕中文在线中不卡视频| 欧美一区二区三区免费大片| 大桥未久一区二区| 青青青草网站免费视频在线观看| 韩国视频一区二区| 欧美在线视频一二三| 91插插插插插插| 伊人久久大香线蕉| 精品区一区二区| 亚洲污视频在线观看| 国产嫩草在线视频| 亚洲欧美在线视频| 日本一区免费在线观看| 黄色片一区二区三区| 中文字幕手机在线观看| 国产蜜臀在线| 亚洲欧美日韩人成在线播放| 欧美一区二区三区电影在线观看| 精品久久久无码中文字幕| 日韩成人午夜精品| 韩剧1988免费观看全集| 国产稀缺精品盗摄盗拍| 精品国产一级毛片| 亚洲欧美日韩中文在线| 呦呦视频在线观看| 一区中文字幕| 欧美一区二区免费观在线| 欧美婷婷精品激情| 日韩精品一区二区三区av| 欧美日韩国产综合视频在线观看中文| 中文字幕在线中文| 3d玉蒲团在线观看| 亚洲丝袜制服诱惑| 中文字幕av日韩精品| 国产女主播在线写真| 91首页免费视频| 国产精品一区二区三区在线观| 亚洲av永久无码国产精品久久| 精品亚洲aⅴ乱码一区二区三区| 国产精品高清网站| 国产在线一级片| 日韩电影在线观看电影| 国产精品久久久久91| 91丨九色丨海角社区| 日韩成人av影视| 国产97免费视| 中文人妻熟女乱又乱精品| 日本中文在线一区| 国产精品香蕉在线观看| 伊人网av在线| 国产乱一区二区| 俄罗斯精品一区二区| 欧美少妇bbw| 91丝袜国产在线播放| 欧美lavv| 亚洲免费视频一区二区三区| 亚洲三级视频在线观看| 精品人妻人人做人人爽| 九色porny丨国产首页在线| 大桥未久av一区二区三区| 日韩网址在线观看| 日韩美女在线看免费观看| 欧美伊人久久久久久久久影院 | 青草国产精品久久久久久| 国产视频福利一区| www男人的天堂| 99精品久久只有精品| 欧美人xxxxx| 亚洲视频tv| 亚洲线精品一区二区三区八戒| 欧美亚洲一二三区| 国产精品99久久久久久董美香 | 亚洲色图欧美自拍| www国产精品| 亚洲色图35p| 黑鬼狂亚洲人videos| 亚洲看片一区| 国产精品欧美久久久| 精品人妻无码一区二区色欲产成人 | 中文字幕av资源一区| 99久re热视频精品98| 美女露胸视频在线观看| 欧美日韩精品一区视频| 国产大学生视频| 国模吧精品视频| 久久成人精品一区二区三区| 天堂中文在线网| 国产一区二区三区国产| 久草一区二区| 免费av在线网站| 精品久久久久久久久中文字幕| 日本免费色视频| 97视频一区| 日韩最新av在线| 日韩aaaaaa| 精品在线你懂的| 欧美成人一区二区在线| 在线视频观看国产| 欧美色视频在线| 玖玖爱在线精品视频| 97人人精品| 日本高清视频精品| 亚洲精品综合久久| 亚洲天堂中文字幕| 亚洲免费av一区二区三区| 国产精品黄网站| 久久天天躁狠狠躁夜夜躁| 午夜精品一区二| 成人深夜福利app| 国产四区在线观看| 四虎4545www国产精品| 日韩av影片在线观看| 日韩影院一区二区| 精品伊人久久久久7777人| 欧美一区亚洲二区| 午夜伦理福利在线| 亚洲精品在线观看视频| 国产精品成人免费观看| 美国av一区二区| 神马影院一区二区| 另类专区亚洲| 亚洲欧美在线免费| 国产综合精品视频| 91丨九色porny丨蝌蚪| 国产无限制自拍| 99热这里只有精品首页| 久久91精品国产91久久久| 在线观看视频二区| 国产无一区二区| 四季av一区二区| 精品国产乱码久久久久久果冻传媒| 18久久久久久| 天堂а在线中文在线无限看推荐| 偷窥国产亚洲免费视频 | 91毛片在线观看| a级黄色一级片| 久久久久久毛片免费看| 国外成人在线直播| 欧美一级淫片免费视频魅影视频| 亚洲一区精品在线| 高清中文字幕mv的电影| 亚洲国产裸拍裸体视频在线观看乱了中文 | 五月婷婷一区| 成人在线免费电影网站| 这里精品视频免费| 夜夜躁狠狠躁日日躁av| 亚洲婷婷综合久久一本伊一区| 小早川怜子一区二区三区| 这里只有精品在线| 国产精华一区| 亚洲十八**毛片| 亚洲天天在线日亚洲洲精| 中文字幕在线观看视频免费| 欧美高清在线精品一区| 国产精品自在自线| 国产一区清纯| 精品乱子伦一区二区三区| 美女100%一区| 色老头一区二区三区| 国产免费不卡av| 亚洲电影在线播放| 国产特级黄色录像| 久久国产精品99精品国产| 国产对白在线播放| 久久丝袜视频| 国产欧美婷婷中文| 98色花堂精品视频在线观看 | av色图一区| 日韩欧美精品三级| www.久久久久久久| 亚洲欧美日韩久久精品| 国产亚洲色婷婷久久99精品91| 日韩精品视频网站| 可以免费看的黄色网址| 日韩电影不卡一区| 国产欧美日韩丝袜精品一区| 大香伊人中文字幕精品| 在线日韩欧美视频| 国产 欧美 精品| 欧美亚洲国产一区二区三区va | 亚洲精品一区二区妖精| 久久超碰亚洲| 成人午夜888| 人人爽久久涩噜噜噜网站| 麻豆视频在线观看免费网站| 日韩av一区在线| 国产高清在线观看视频| 91国产精品成人| 精品深夜av无码一区二区老年| 久久久久久99久久久精品网站| 99久久综合网| 欧美a级一区二区| 日本xxxxxxxxxx75| 国产精品久久久久久| 欧美极品色图| 中文在线免费一区三区| 国产精品免费视频xxxx| 极品av在线| 欧美大片在线免费观看| 77导航福利在线| 国产婷婷成人久久av免费高清 | 日韩一区二区三区免费| 国内成人精品一区| 久久77777| 中文字幕亚洲欧美日韩2019| 亚洲人妻一区二区三区| 日韩欧美国产一区二区在线播放 | 校园激情久久| 和岳每晚弄的高潮嗷嗷叫视频| 国产高清久久| 午夜视频久久久| 自拍亚洲一区| 精品在线视频一区二区| 伊人久久亚洲| 亚洲一区二区在线播放| 欧美高清影院| 国产精品成人在线| a日韩av网址| 97久久久免费福利网址| 欧美24videosex性欧美| 精品少妇v888av| 久久日韩视频| 久久精品视频在线| 免费黄色在线看| 日韩亚洲第一页| 免费观看在线午夜影视| 中文字幕国产日韩| 阿v免费在线观看| 一本色道久久综合亚洲精品小说| 日本大片在线观看| 亚洲欧美日本精品| 男同在线观看| 国产一区二区激情| 黄色av免费在线观看| 亚洲性生活视频| 一区二区三区视频网站| 日韩网站免费观看| 黄色成人影院| 欧美人成在线视频| www.综合网.com| 午夜精品久久久久久久久久久久| www.51av欧美视频| 日本精品久久电影| 日韩经典一区| 成人激情视频小说免费下载| 精品成人18| 国产精品一区二区三区精品| 久久黄色影视| 日韩高清av电影| 天天综合一区| 成人精品视频在线播放| 欧美一级专区| 中文久久久久久| 国产自产v一区二区三区c| 亚洲欧美日韩中文字幕在线观看| 成人福利视频在线| 精品无码一区二区三区| 欧美国产一区在线| 九九热国产在线| 精品国产乱码久久久久久婷婷| 日韩特级黄色片| 欧美三级视频在线| 国内精品偷拍视频| 日韩精品视频三区| 欧美性videos| 午夜精品视频网站| 日韩网站中文字幕| 成人h视频在线观看| 久久最新网址| 看全色黄大色大片| 国产日韩欧美一区二区三区在线观看| 成年人免费大片| 国产尤物一区二区| 亚洲最大成人网站| 亚洲男女毛片无遮挡| 国产99久久久| 91精品国产欧美日韩| 日本在线视频1区| 久久久精品一区二区| 亚洲电影观看| 91成人免费在线观看| 欧美三级午夜理伦三级小说| 一区二区免费电影| 99精品免费| 欧美又黄又嫩大片a级| 91麻豆国产福利在线观看| 日韩在线一卡二卡| 欧美日韩美女在线| av网站在线观看免费| 亚洲男人天天操| 黑人玩欧美人三根一起进| 国产精品久久久久久搜索 | 美女精品一区二区| 国产精品久久久久久久无码| 亚洲欧洲性图库| 天天操天天干天天摸| 欧美zozo另类异族| 精产国品自在线www| 日韩免费视频在线观看| 亚洲乱码一区| 中国 免费 av| 免费成人在线观看视频| 日本丰满少妇裸体自慰| 亚洲黄色av一区| 一区二区精品视频在线观看| 亚洲人成五月天| av在线资源| 99视频日韩| 亚洲精品99| 久久6免费视频| 国产精品视频第一区| 国产精品va无码一区二区三区| 亚洲的天堂在线中文字幕| av片哪里在线观看| 国产精品一区=区| 成人3d精品动漫精品一二三| 日韩精品一区二区三区久久| 不卡大黄网站免费看| 麻豆疯狂做受xxxx高潮视频| 这里只有精品视频在线观看| 9色在线观看| 国产精品一二区| 久久香蕉国产| 伊人国产在线视频| 国产精品三级在线观看| 成年人晚上看的视频| 永久免费毛片在线播放不卡| 日本成人伦理电影| 日韩在线第一区| 男人的天堂久久精品| 国产小视频你懂的| 91精品久久久久久久99蜜桃| 黄色免费在线看| 999视频在线免费观看| 欧美另类亚洲| 深田咏美中文字幕| 精品久久久久久久大神国产| 视频国产在线观看| 日产日韩在线亚洲欧美| 国产一区二区观看| 国内自拍视频一区| 国产精品毛片无遮挡高清| 亚洲天堂999| 久久久精品国产亚洲| 视频一区日韩| 国产亚洲黄色片| 久久精品网站免费观看| 中文字幕无码乱码人妻日韩精品| www.欧美精品一二三区| 日韩精品一区国产| 欧美精品久久久久久久久久久| 久久综合狠狠综合| 亚洲精品久久久久久久蜜桃| 最近2019中文字幕在线高清| 精品一区视频| 无码人妻少妇伦在线电影| 久久在线观看免费| 亚洲一区二区人妻| 欧美成年人网站| 台湾色综合娱乐中文网| 麻豆三级在线观看| 亚洲精品成人a在线观看| 污视频网站在线播放| 国产精品久久久91| 欧美激情第10页| 麻豆国产精品一区| 欧美日韩视频在线第一区| 色呦呦呦在线观看| 欧美二区在线| 国产麻豆午夜三级精品| 日本一级片免费看| 中文字幕欧美专区| 91成人福利| 久久这里只精品| 亚洲一级电影视频| h视频在线播放| 国产精品香蕉视屏| 人人爽香蕉精品| 日本少妇裸体做爰| 少妇高潮 亚洲精品| 国产精品qvod| 污污的视频免费观看| 天天做天天摸天天爽国产一区|