正式抛弃 Feign!Spring 6 推出新特性:HTTP Interface,这波太秀了!
Posted Java技术栈
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了正式抛弃 Feign!Spring 6 推出新特性:HTTP Interface,这波太秀了!相关的知识,希望对你有一定的参考价值。
点击关注公众号,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 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
以上是一个最简单的示例,下面我们看看其中的一些细节。另外,如果你近期准备面试跳槽,建议在Java面试库小程序在线刷题,涵盖 2000+ 道 Java 面试题,几乎覆盖了所有主流技术面试题。
GetExchange(HttpExchange)注解
上文例子中的 GetExchange 注解代表这个方法代替执行一个 HTTP Get 请求,与此对应,Spring 还包含了其他类似的注解:
这些注解定义在spring-web
模块的org.springframework.web.service.annotation
包下,除了 HttpExchange 之外,其他的几个都是 HttpExchange 的特殊形式,这一点与 Spring MVC 中的 RequestMapping/GetMapping 等注解非常相似。
分享资料:Spring Boot 学习笔记,建议收藏。
以下是 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 ;
在上面的例子中,我们只指定了请求的资源路径。另外,如果你近期准备面试跳槽,建议在Java面试库小程序在线刷题,涵盖 2000+ 道 Java 面试题,几乎覆盖了所有主流技术面试题。
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 特性进行了简单的了解,我之后会深入研究这个特性,也会追踪后续版本中的改进并与你分享,欢迎点赞加关注。
End
Spring Cloud 微服务最新课程!
以上是关于正式抛弃 Feign!Spring 6 推出新特性:HTTP Interface,这波太秀了!的主要内容,如果未能解决你的问题,请参考以下文章
正式抛弃 Feign!Spring 6 推出新特性:HTTP Interface,这波太秀了!
正式抛弃 Feign!Spring 6 推出新特性:HTTP Interface,这波太秀了!
正式抛弃 Feign!Spring 6 推出新特性:HTTP Interface,这波太秀了!
正式抛弃 Feign!Spring 6 推出新特性:HTTP Interface,这波太秀了!