<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          還在使用 Feign?Spring 6 的新特性 HTTP Interface 了解一下!

          共 5387字,需瀏覽 11分鐘

           ·

          2023-08-16 20:16

          52bc8726e27eba6d77d9e9fec589b2e3.webp程序員的成長(zhǎng)之路互聯(lián)網(wǎng)/程序員/技術(shù)/資料共享  關(guān)注


          閱讀本文大概需要 4 分鐘。

          來(lái)自:juejin.cn/post/7173271507047546893

          • 完成一個(gè) Demo
          • GetExchange(HttpExchange)注解
          • UserApiService 實(shí)例的創(chuàng)建
          • 其他特性
          • 為什么需要 Spring Reactive Web 的依賴(lài)
          • 總結(jié)

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

          完成一個(gè) Demo

          首先創(chuàng)建一個(gè)簡(jiǎn)單的 HTTP 服務(wù),這一步可以創(chuàng)建一個(gè)簡(jiǎn)單的 Spring Boot 工程來(lái)完成。先創(chuàng)建一個(gè)實(shí)體類(lèi):
              

          public class User implements Serializable {

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

          再寫(xiě)一個(gè)簡(jiǎn)單的 Controller:
              

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

          確保啟動(dòng)服務(wù)之后,能夠從http://localhost:8080/users地址獲取到一個(gè)包含十個(gè)用戶(hù)信息的用戶(hù)列表。下面我們新建一個(gè) Spring Boot 工程。 5f5b832f97c9fd744fcf552fcf424ff8.webpSpring initializr這里需要注意,Spring Boot 的版本至少需要是 3.0.0,這樣它以來(lái)的 Spring Framework 版本才是 6.0 的版本,才能夠包含 HTTP Interface 特性,另外,Spring Framework 6.0 和 Spring Boot 3.0 開(kāi)始支持的 Java 版本最低是 17,因此,需要選擇至少是 17 的 Java 版本。另外,需要依賴(lài) Spring Web 和 Spring Reactive Web 依賴(lài),原因下文中會(huì)提到。創(chuàng)建好新的 Spring Boot 工程后,首先需要定義一個(gè) HTTP Interface 接口。最簡(jiǎn)單的定義如下即可:
              

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

          然后,我們可以寫(xiě)一個(gè)測(cè)試方法。
              

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

          最終回打印獲取到的是個(gè)用戶(hù)信息:
              

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

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

          GetExchange(HttpExchange)注解

          上文例子中的 GetExchange 注解代表這個(gè)方法代替執(zhí)行一個(gè) HTTP Get 請(qǐng)求,與此對(duì)應(yīng),Spring 還包含了其他類(lèi)似的注解: 4465be8cef08a6a58520555da7cd6db2.webpGetExchange這些注解定義在spring-web模塊的org.springframework.web.service.annotation包下,除了 HttpExchange 之外,其他的幾個(gè)都是 HttpExchange 的特殊形式,這一點(diǎn)與 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 {};

          }

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

          UserApiService 實(shí)例的創(chuàng)建

          在上面例子中,我們定義的 HTTP Interface 接口是 UserApiService,在測(cè)試方法中,我們通過(guò) HttpServiceProxyFactory 創(chuàng)建了 UserApiService 的實(shí)例,這是參考了 Spring 的官方文檔的寫(xiě)法。你也可以將創(chuàng)建的過(guò)程寫(xiě)到一個(gè) @Bean 方法中,從而可以將創(chuàng)建好的實(shí)例注入到其他的組件中。我們?cè)俣x UserApiService 的時(shí)候,只是聲明了一個(gè)接口,那具體的請(qǐng)求操作是怎么發(fā)出的呢,我們可以通過(guò) DEBUG 模式看得出來(lái),這里創(chuàng)建的 UserApiService 的實(shí)例,是一個(gè)代理對(duì)象: 0e5cdfab1c85b2027a6c8a4edba9ab35.webp代理對(duì)象目前,Spring 還沒(méi)有提供更方便的方式來(lái)創(chuàng)建這些代理對(duì)象,不過(guò),之后的版本肯定會(huì)提供,如果你感興趣的話(huà),可以從 HttpServiceProxyFactory 的createClient方法的源碼中看到一些與創(chuàng)建 AOP 代理相似的代碼,因此,我推測(cè) Spring 之后可能會(huì)增加類(lèi)似的注解來(lái)方便地創(chuàng)建代理對(duì)象。

          其他特性

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

          為什么需要 Spring Reactive Web 的依賴(lài)

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

          總結(jié)

          本文帶你對(duì) HTTP Interface 特性進(jìn)行了簡(jiǎn)單的了解,我之后會(huì)深入研究這個(gè)特性,也會(huì)追蹤后續(xù)版本中的改進(jìn)并與你分享,歡迎點(diǎn)贊加關(guān)注。<END>

          推薦閱讀:

          全球 43 億 IPv4 地址耗盡的四年后,亞馬遜:明年,將對(duì)所有公共 IPv4 地址收費(fèi)!

          22條 Spring Boot 最佳實(shí)踐,yyds!

              
                  互聯(lián)網(wǎng)初中高級(jí)大廠(chǎng)面試題(9個(gè)G)
                
              

          內(nèi)容包含Java基礎(chǔ)、JavaWeb、MySQL性能優(yōu)化、JVM、鎖、百萬(wàn)并發(fā)、消息隊(duì)列、高性能緩存、反射、Spring全家桶原理、微服務(wù)、Zookeeper......等技術(shù)棧!

          ?戳閱讀原文領(lǐng)??!                                   朕已閱  87fbd0bb477d08bafe29c28ebec8e3d7.webp

          瀏覽 74
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  国产AV三级片 | 老女人操B视频 | 人碰人人操人 | 鸡巴视频久久 | 九哥日逼网 |