Spring Boot HttpExchange 入門

banq發表於2024-05-14


這是Spring 6.x 宣告式 HTTP 客戶端缺失的start:

  • 消除模板程式碼、
  • 生成伺服器基礎實現程式碼、
  • 支援 RequestMapping 註釋、
  • 支援負載平衡器、
  • 支援本地圖片、
  • 動態重新整理、
  • 動態請求超時等!

背景上下文
Spring 6 透過 @HttpExchange 註解引入了對宣告式 HTTP 客戶端的本地支援。對 SpringCloud OpenFeign 的依賴可以被有效取代。

@HttpExchange(<font>"https://my-json-server.typicode.com")
interface PostApi {
    @GetExchange(
"/typicode/demo/posts/{id}")
    Post getPost(@PathVariable(
"id") int id);
}

@SpringBootApplication
public class App {

    public static void main(String[] args) {
        SpringApplication.run(App.class, args);
    }

    @Bean
    PostApi postApi(RestClient.Builder builder) {
        HttpServiceProxyFactory factory = HttpServiceProxyFactory
                .builderFor(RestClientAdapter.create(builder.build()))
                .build();
        return factory.createClient(PostApi.class);
    }

   
// Imagine there are 100 HttpExchange clients <i>

    @Bean
    ApplicationRunner runner(PostApi api) {
        return args -> api.getPost(1);
    }
}

但是還有啥問題?

  • 沒有自動配置:客戶端無法進行自動配置;必須透過客戶端 bean 手動例項化客戶端。在處理大量客戶端時,這一過程會變得特別繁瑣。
    對於習慣於使用 Spring Cloud OpenFeign 的使用者來說,@EnableFeignClients 註解具有極大的優勢,可顯著減少重複程式碼的數量。
  • 不支援 Spring Web 註釋:雖然對宣告式 HTTP 客戶端的本機支援是一個值得歡迎的功能,但它引入了一套新的註解,如 @GetExchange、@PostExchange 等。
    遺憾的是,HttpServiceProxyFactory 並不支援 @GetMapping 和 @PostMapping 等 Spring Web 註釋。這種不支援會嚴重阻礙習慣使用 Spring Cloud OpenFeign 並考慮過渡到 Spring 6.x 的使用者,使遷移過程變得極具挑戰性。

這個專案解決了上述問題, 主要目標是

  • 推廣使用 @HttpExchange 作為定義 API 介面的中性註解。
  • 為 Spring 6 宣告式 HTTP 客戶端提供類似 Spring Cloud OpenFeign 的體驗。
  • 支援 Spring Web 註釋(@RequestMapping、@GetMapping)。
  • 不引入外部註解,易於遷移到其他實現。

加入依賴:

<dependency>
    <groupId>io.github.danielliu1123</groupId>
    <artifactId>httpexchange-spring-boot-starter</artifactId>
    <version>3.2.5</version>
</dependency>

主程式碼:

@HttpExchange(<font>"https://my-json-server.typicode.com")
interface PostApi {
    @GetExchange(
"/typicode/demo/posts/{id}")
    Post getPost(@PathVariable(
"id") int id);
}

@SpringBootApplication
@EnableExchangeClients
public class App {
    public static void main(String[] args) {
        SpringApplication.run(App.class, args);
    }

    @Bean
    ApplicationRunner runner(PostApi api) {
        return args -> api.getPost(1);
    }
}

 

相關文章