自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

取代OpenFeign:Spring Framework 6全新聲明式客戶端@HttpExchange

開發(fā) 前端
Spring不到萬不得已之時,一般不會自己重復(fù)造輪子。在Http客戶端這塊一樣借力打力,提供Http統(tǒng)一調(diào)用方式RestTemplate,屏蔽了細節(jié),規(guī)范了開發(fā)者的使用,簡化了開發(fā)門檻。

前言

Http是最常見的請求協(xié)議,每種編程語言都可發(fā)送Http請求。Java作為經(jīng)典編程語言之一,發(fā)送Http請求的客戶端更是不少,自己的內(nèi)置的就有java.net.HttpURLConnection以及Java 11以后的java.net.http.HttpClient。在Java 11之前,HttpURLConnection很難用,因此市場上百花齊放出現(xiàn)了不少優(yōu)秀的開源作品,典型代表為:

  • Apache HttpClient(現(xiàn)最新為Http Component 5.x)
  • OkHttp(現(xiàn)最新為OkHttp 4.x)

作為老牌的Apache HttpClient憑借著各種優(yōu)秀特征,似乎已成為了事實的標(biāo)準(zhǔn);后起之秀OkHttp不帶歷史包袱的輕裝上路,有著低網(wǎng)絡(luò)延遲、更優(yōu)秀的連接池性能,亦是一股不可輕視的力量。

Spring不到萬不得已之時,一般不會自己重復(fù)造輪子。在Http客戶端這塊一樣借力打力,提供Http統(tǒng)一調(diào)用方式RestTemplate,屏蔽了細節(jié),規(guī)范了開發(fā)者的使用,簡化了開發(fā)門檻。

PS:RestTemplate的底層實現(xiàn)依舊是Apache HttpClient、OkHttp、HttpURLConnection之一

以上,都還是編程式Http客戶端。隨著Spring Boot的普及,Spring Cloud的出現(xiàn),聲明式編碼變得越來越主流,因為聲明式/面向元數(shù)據(jù)編碼效率遠高于編程式編碼效率。因此,F(xiàn)eign出現(xiàn)了,迅速成為了主流。

今年,隨著劃時代版本Spring Framework 6、Spring Boot 3、Spring Cloud 2022.0.0的發(fā)布,Spring團隊自建了一套聲明式Http客戶端:@HttpExchange,目標(biāo)直指OpenFeign。

正文

全新的聲明式Http客戶端由Spring Framework 6提供定義,Spring Boot 3提供實現(xiàn),Spring Cloud 2022負(fù)責(zé)發(fā)揚光大。今天我們就來體驗一把

介紹一個免費的、在線的Rest Http服務(wù)

由于我們需要一個提供Http Server來提供接口服務(wù),為此先給你介紹一個免費的、24h在線的Rest Http服務(wù),省去我們自己搭建的麻煩。

地址:jsonplaceholder.typicode.com圖片每月提供近20億的請求,關(guān)鍵還是免費的、可公開訪問的,好用得不要不要。

圖片

發(fā)一個簡單的Http請求,就能獲取到數(shù)據(jù)。URL遵循Rest規(guī)范:

圖片

不挑Http或者Https,比如使用瀏覽器訪問這個URL得到的結(jié)果也是一樣的:

圖片

它提供多個Resources資源(以及多種Routes)供以訪問,對這些資源進行增刪改查的操作,你想要的絕大部分都能滿足你。當(dāng)然,若你需要mock data是符合自己的數(shù)據(jù)結(jié)構(gòu)、業(yè)務(wù)邏輯的,可基于此項目做簡單的修改即可,良心項目啊。具體詳情自行去官方體驗:https://jsonplaceholder.typicode.com。

全新聲明式Http客戶端@HttpExchange

環(huán)境聲明:Spring Boot 3.0.x

本文選用”albums“資源進行測試:https://jsonplaceholder.typicode.com/albums的請求結(jié)果結(jié)構(gòu)如下:

圖片

Feign代碼示例

略!Feign的使用,相信大家再熟悉不過了,筆者這里就不費周章。

@HttpExchange代碼示例

?????♀?按照albums的返回數(shù)據(jù)結(jié)構(gòu),寫Java Bean:

/**
* 在此處添加備注信息
*
* @author YourBatman
* @since 0.0.1
*/
@Builder
@Getter
public class AlbumsReq {
@NotNull
@Positive
private Long userId;
@NotBlank
private String title;
}
/**
* 在此處添加備注信息
*
* @author YourBatman
* @since 0.0.1
*/
@Setter
@ToString
public class AlbumsResp {

private Long id;
private Long userId;
private String title;

}

順帶科普一個編碼規(guī)范:請求體Req中g(shù)et方法是必須的,set方法可選;響應(yīng)體Resp中set方法是必須的,get方法可選;二者都需遵循Java Bean規(guī)范! 粗暴的做法是不管需求如何,get/set一把梭,可行,但作為程序員的你應(yīng)該知道原由,理解要義。

?????♀?導(dǎo)入webflux包 此聲明式客戶端又Spring Framework 6提供,但由于其并未提供實現(xiàn)。Spring Boot 3為此提供了基于Reactive的Web實現(xiàn),因此需要導(dǎo)入webflux包:

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
</dependency>

?????♀?編寫Http客戶端申明式接口。

/**
* 在此處添加備注信息
*
* @author YourBatman
* @since 0.0.1
*/
@HttpExchange("/albums")
public interface AlbumsClient {

@GetExchange
List<AlbumsResp> getAll();

@GetExchange("/{id}")
AlbumsResp getById(@PathVariable Long id);

@PostExchange
AlbumsResp add(@RequestBody @Valid AlbumsReq req);

}

?????♀?書寫測試用例代碼。

@SpringBootTest
class ApplicationTests {

@Autowired
private AlbumsClient albumsClient;

@Test
void contextLoads(){
System.out.println("getAll size:" + albumsClient.getAll().size());

System.out.println("getById 1:" + albumsClient.getById(1L));

// 創(chuàng)建一個
Object addedResp = albumsClient.add(AlbumsReq.builder().userId(1L).title("diy add...").build());
System.out.println("創(chuàng)建的allAlbums對象為:" + addedResp + ",現(xiàn)在總數(shù)為:" + albumsClient.getAll().size());
}

}

?????♀?運行測試代碼,控制臺輸出:

getAll size:100
getById 1:AlbumsResp(id=1, userId=1, title=quidem molestiae enim)
創(chuàng)建的allAlbums對象為:AlbumsResp(id=101, userId=1, title=diy add...),現(xiàn)在總數(shù)為:100

完美!

小細節(jié):創(chuàng)建的時候并未制定id,發(fā)現(xiàn)id是自增的(id=101)。但這并不會保存在typicode.com的遠端服務(wù)器了,不會引起總條數(shù)的變化。

@HttpExchange聲明式客戶端簡析

@HttpExchange是Spring Framework 6新提供的聲明式Http客戶端,客戶端的要素由注解的屬性 + 方法簽名來定義。先來看看這個注解:

/**
* Since: 6.0
*/
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Mapping
@Reflective(HttpExchangeReflectiveProcessor.class)
public @interface HttpExchange {
@AliasFor("url")
String value() default "";
@AliasFor("value")
String url() default "";
String method() default "";
String contentType() default "";
String[] accept() default {};
}

和@RequestMapping參照對比:

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Mapping
@Reflective(ControllerMappingReflectiveProcessor.class)
public @interface RequestMapping {

String name() default "";
@AliasFor("path")
String[] value() default {};
@AliasFor("value")
String[] path() default {};
RequestMethod[] method() default {};
String[] params() default {};
String[] headers() default {};
String[] consumes() default {};
String[] produces() default {};

}

不說一毛一樣,也是基本一樣。@HttpExchange注解可以標(biāo)注在類上和方法上,最終的URL組合起來生效。大家都是使用過Feign、使用過Spring MVC的,這就不用過多介紹了。

和@RequestMapping一樣,@HttpExchange也有其派生注解:

  • @GetExchange:GET請求。類似于于@GetMapping
  • @PostExchange:Post請求。類似于于@PostMapping
  • @PutExchange:Put請求。類似于于@PutMapping
  • @DeleteExchange:Delete請求。類似于于@DeleteMapping
  • @PatchExchange:Patch請求。類似于于@PatchMapping

@HttpExchange聲明式客戶端前景展望

通過interface這種聲明式使用起來比RestTemplate,或者WebClient要簡單很多,大大簡化了開發(fā)步驟,對開發(fā)者更加友好。

最新發(fā)布的Spirng Cloud 2022.0.0里描述得很明白:停止對OpenFeign的特征支持。言外之意:OpenFeign即將被Spring Cloud“淘汰”,接棒的那必然是@HttpExchange嘍。所以在可預(yù)見的將來,前景一片大好。

圖片

但是,筆者認(rèn)為它還不夠成熟,主要有兩點:

  1. 還不能支持Spring-Web的注解(@RequestMapping體系),若能支持個人覺得會更為方便。
  2. 目前還只有WebClient一套實現(xiàn)(由Spring Boot提供實現(xiàn)),而它屬于Reactive Web體系,也就是必須引入webFlux相關(guān)技術(shù),而webFlux在做業(yè)務(wù)開發(fā)時優(yōu)勢不明顯,并非主流。
  1. 因為若WebClient能從Reactive Web里剝離出來,筆者覺得就好很多了。

總結(jié)

誰能想到,OpenFeign竟然都快被淘汰了,Spring的大船滾滾向前,引領(lǐng)著整個潮流,逐漸暴露出了野心,或者說感受到了危機。

先抄襲,再超越,Spring做到了。隱藏在全新的聲明式客戶端背后,其實還有Spring Framework 6背后對Web Mapping體系的重構(gòu),細心的你或許已有所發(fā)現(xiàn)。這些話題、新發(fā)現(xiàn),留予筆者和你后續(xù)接著聊。

責(zé)任編輯:姜華 來源: YourBatman
相關(guān)推薦

2024-10-11 11:32:22

Spring6RSocket服務(wù)

2013-05-30 17:52:06

2010-07-19 17:35:09

Telnet客戶端IPv6

2010-01-06 19:09:13

.NET Framew

2011-08-17 10:10:59

2021-09-22 15:46:29

虛擬桌面瘦客戶端胖客戶端

2009-06-22 09:01:57

Spring聲明式事務(wù)

2010-05-31 10:11:32

瘦客戶端

2011-10-26 13:17:05

2024-12-30 00:24:46

2011-03-02 14:36:24

Filezilla客戶端

2010-12-21 11:03:15

獲取客戶端證書

2011-03-24 13:00:31

配置nagios客戶端

2021-07-26 05:03:44

OpenFeign系統(tǒng)組件

2013-10-21 09:48:35

2011-03-21 14:53:36

Nagios監(jiān)控Linux

2009-03-04 10:27:50

客戶端組件桌面虛擬化Xendesktop

2011-04-06 14:24:20

Nagios監(jiān)控Linux

2013-05-09 09:33:59

2024-12-02 09:19:44

點贊
收藏

51CTO技術(shù)棧公眾號