正式抛弃 Feign!Spring 6 推出新特性:HTTP Interface,这波太秀了!()

  本篇文章为你整理了正式抛弃 Feign!Spring 6 推出新特性:HTTP Interface,这波太秀了!()的详细内容,包含有 正式抛弃 Feign!Spring 6 推出新特性:HTTP Interface,这波太秀了!,希望能帮助你了解 正式抛弃 Feign!Spring 6 推出新特性:HTTP Interface,这波太秀了!。

  分享Java技术,高并发编程,分布式技术,架构设计,Java面试题,算法,行业动态,程序人生等。

  
来源:https://juejin.cn/post/7173271507047546893

  近期,Spring 6 的第一个 GA 版本发布了,其中带来了一个新的特性——HTTP Interface。这个新特性,可以让开发者将 HTTP 服务,定义成一个包含特定注解标记的方法的 Java 接口,然后通过对接口方法的调用,完成 HTTP 请求。看起来很像使用 Feign 来完成远程服务调用,下面我们参考官方文档来完成一个 Demo。

  完成一个 Demo

  首先创建一个简单的 HTTP 服务,这一步可以创建一个简单的 Spring Boot 工程来完成。

  先创建一个实体类:

  

public class User implements Serializable {

 

   private int id;

   private String name;

   // 省略构造方法、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());

  

 

  确保启动服务之后,能够从http://localhost:8080/users地址获取到一个包含十个用户信息的用户列表。

  下面我们新建一个 Spring Boot 工程。Spring Boot 基础就不介绍了,推荐看这个免费教程:

  https://github.com/javastacks/spring-boot-best-practice

  这里需要注意,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 依赖,原因下文中会提到。

  创建好新的 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

  

 

  以上是一个最简单的示例,下面我们看看其中的一些细节。

  GetExchange(HttpExchange)注解

  上文例子中的 GetExchange 注解代表这个方法代替执行一个 HTTP Get 请求,与此对应,Spring 还包含了其他类似的注解:

  这些注解定义在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 实例的创建

  在上面例子中,我们定义的 HTTP Interface 接口是 UserApiService,在测试方法中,我们通过 HttpServiceProxyFactory 创建了 UserApiService 的实例,这是参考了 Spring 的官方文档的写法。

  你也可以将创建的过程写到一个 @Bean 方法中,从而可以将创建好的实例注入到其他的组件中。

  我们再定义 UserApiService 的时候,只是声明了一个接口,那具体的请求操作是怎么发出的呢,我们可以通过 DEBUG 模式看得出来,这里创建的 UserApiService 的实例,是一个代理对象:

  目前,Spring 还没有提供更方便的方式来创建这些代理对象,不过,之后的版本肯定会提供,如果你感兴趣的话,可以从 HttpServiceProxyFactory 的createClient方法的源码中看到一些与创建 AOP 代理相似的代码,因此,我推测 Spring 之后可能会增加类似的注解来方便地创建代理对象。

  除了上述例子中的简单使用之外,添加了 HttpExchange 的方法还支持各种类型的参数,这一点也与 Spring MVC 的 Controller 方法类似,方法的返回值也可以是任意自定义的实体类型(就像上面的例子一样),此外,还支持自定义的异常处理。

  为什么需要 Spring Reactive Web 的依赖

  上文中创建工程的时候,引入了 Spring Reactive Web 的依赖,在创建代理的service对象的时候,使用了其中的 WebClient 类型。这是因为,HTTP Interface 目前只内置了 WebClient 的实现,它属于 Reactive Web 的范畴。Spring 在会在后续版本中推出基于 RestTemplate 的实现。

  本文带你对 HTTP Interface 特性进行了简单的了解,我之后会深入研究这个特性,也会追踪后续版本中的改进并与你分享,欢迎点赞加关注。

  近期热文推荐:

  1.1,000+ 道 Java面试题及答案整理(2022最新版)

  2.劲爆!Java 协程要来了。。。

  3.Spring Boot 2.x 教程,太全了!

  4.别再写满屏的爆爆爆炸类了,试试装饰器模式,这才是优雅的方式!!

  5.《Java开发手册(嵩山版)》最新发布,速速下载!

  觉得不错,别忘了随手点赞+转发哦!

  以上就是正式抛弃 Feign!Spring 6 推出新特性:HTTP Interface,这波太秀了!()的详细内容,想要了解更多 正式抛弃 Feign!Spring 6 推出新特性:HTTP Interface,这波太秀了!的内容,请持续关注盛行IT软件开发工作室。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: