最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

微服務(wù)實戰(zhàn)SpringCloud之Feign簡介及使用

2023-02-09 13:49 作者:要寵你上天  | 我要投稿

多數(shù)網(wǎng)友在對接第三方系統(tǒng)時,還在使用 httpclient、okhttp 等方式進行硬編碼的形式實現(xiàn)對接。其實,我認為使用 feign 來實現(xiàn)更為方便快捷。feign 除了服務(wù)間的 http 調(diào)用外,還支持非服務(wù)間的 http 調(diào)用。只是,我們的一些思維還未轉(zhuǎn)變過來,對 feign 的底層實現(xiàn)也缺乏一定的了解。

近期,Spring 6 的第一個 GA 版本發(fā)布了,其中帶來了一個新的特性——HTTP Interface。這個新特性,可以讓開發(fā)者將 HTTP 服務(wù),定義成一個包含特定注解標(biāo)記的方法的 Java 接口,然后通過對接口方法的調(diào)用,完成 HTTP 請求??雌饋砗芟袷褂?Feign 來完成遠程服務(wù)調(diào)用,這可能是 Spring “拋棄” feign 等 http 調(diào)用的一種趨勢,Spring 要規(guī)范和簡化這一塊的實現(xiàn)了,讓開發(fā)者更關(guān)注聚集于業(yè)務(wù)。下面我們參考官方文檔來完成一個 Demo。


完成一個 Demo

首先創(chuàng)建一個簡單的 HTTP 服務(wù),這一步可以創(chuàng)建一個簡單的 Spring Boot 工程來完成。

先創(chuàng)建一個實體類:

public class User implements Serializable { ? ?private int id; ? ?private String name; ? ?// 省略構(gòu)造方法、Getter和Setter ? ?@Override ? ?public String toString() { ? ? ? ?return id + ":" + name; ? ?} }

再寫一個簡單的 Controller:

@GetMapping("/users") public List<User> list() { ? ?return IntStream.rangeClosed(1, 10) ? ? ? ? ? ?.mapToObj(i -> new User(i, "User" + i)) ? ? ? ? ? ?.collect(Collectors.toList()); }

確保啟動服務(wù)之后,能夠從http://localhost:8080/users地址獲取到一個包含十個用戶信息的用戶列表。

下面我們新建一個 Spring Boot 工程。

Spring initializr

這里需要注意,Spring Boot 的版本至少需要是 3.0.0,這樣它以來的 Spring Framework 版本才是 6.0 的版本,才能夠包含 HTTP Interface 特性,另外,Spring Framework 6.0 和 Spring Boot 3.0 開始支持的 Java 版本最低是 17,因此,需要選擇至少是 17 的 Java 版本。

另外,需要依賴 Spring Web 和 Spring Reactive Web 依賴,原因下文中會提到。

創(chuàng)建好新的 Spring Boot 工程后,首先需要定義一個 HTTP Interface 接口。最簡單的定義如下即可:

public interface UserApiService { ? ?@GetExchange("/users") ? ?List<User> getUsers(); }

然后,我們可以寫一個測試方法。

@Test void getUsers() { ? WebClient client = WebClient.builder().baseUrl("http://localhost:8080/").build(); ? HttpServiceProxyFactory factory = HttpServiceProxyFactory.builder(WebClientAdapter.forClient(client)).build(); ? UserApiService service = factory.createClient(UserApiService.class); ? List<User> users = service.getUsers(); ? for (User user : users) { ? ? ?System.out.println(user); ? } }

最終回打印獲取到的是個用戶信息:

1:User1 2:User2 ... 9:User9 10:User10

以上是一個最簡單的示例,下面我們看看其中的一些細節(jié)。


GetExchange(HttpExchange)注解

上文例子中的 GetExchange 注解代表這個方法代替執(zhí)行一個 HTTP Get 請求,與此對應(yīng),Spring 還包含了其他類似的注解:

GetExchange

這些注解定義在spring-web模塊的org.springframework.web.service.annotation包下,除了 HttpExchange 之外,其他的幾個都是 HttpExchange 的特殊形式,這一點與 Spring MVC 中的 RequestMapping/GetMapping 等注解非常相似。

以下是 HttpExchange 的源碼:

@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 {}; }

在上面的例子中,我們只指定了請求的資源路徑。

UserApiService 實例的創(chuàng)建

在上面例子中,我們定義的 HTTP Interface 接口是 UserApiService,在測試方法中,我們通過 HttpServiceProxyFactory 創(chuàng)建了 UserApiService 的實例,這是參考了 Spring 的官方文檔的寫法。

你也可以將創(chuàng)建的過程寫到一個 @Bean 方法中,從而可以將創(chuàng)建好的實例注入到其他的組件中。

我們再定義 UserApiService 的時候,只是聲明了一個接口,那具體的請求操作是怎么發(fā)出的呢,我們可以通過 DEBUG 模式看得出來,這里創(chuàng)建的 UserApiService 的實例,是一個代理對象:

代理對象

目前,Spring 還沒有提供更方便的方式來創(chuàng)建這些代理對象,不過,之后的版本肯定會提供,如果你感興趣的話,可以從 HttpServiceProxyFactory 的createClient方法的源碼中看到一些與創(chuàng)建 AOP 代理相似的代碼,因此,我推測 Spring 之后可能會增加類似的注解來方便地創(chuàng)建代理對象。

其他特性

除了上述例子中的簡單使用之外,添加了 HttpExchange 的方法還支持各種類型的參數(shù),這一點也與 Spring MVC 的 Controller 方法類似,方法的返回值也可以是任意自定義的實體類型(就像上面的例子一樣),此外,還支持自定義的異常處理。

為什么需要 Spring Reactive Web 的依賴

上文中創(chuàng)建工程的時候,引入了 Spring Reactive Web 的依賴,在創(chuàng)建代理的service對象的時候,使用了其中的 WebClient 類型。這是因為,HTTP Interface 目前只內(nèi)置了 WebClient 的實現(xiàn),它屬于 Reactive Web 的范疇。Spring 在會在后續(xù)版本中推出基于 RestTemplate 的實現(xiàn)。



微服務(wù)實戰(zhàn)SpringCloud之Feign簡介及使用的評論 (共 條)

分享到微博請遵守國家法律
民县| 武强县| 平度市| 开原市| 江陵县| 中江县| 沾化县| 军事| 文化| 柞水县| 特克斯县| 白城市| 兴文县| 朝阳区| 哈巴河县| 怀柔区| 广西| 饶平县| 礼泉县| 沽源县| 星座| 永吉县| 峡江县| 资兴市| 博白县| 封丘县| 连州市| 祁连县| 揭阳市| 奈曼旗| 林口县| 靖宇县| 改则县| 江西省| 长宁区| 金昌市| 丰镇市| 庆城县| 革吉县| 金沙县| 林芝县|