這是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); } }
|