Redian新闻
>
Spring 6 正式“抛弃”feign

Spring 6 正式“抛弃”feign

公众号新闻

点击上方“芋道源码”,选择“设为星标

管她前浪,还是后浪?

能浪的浪,才是好浪!

每天 10:33 更新文章,每天掉亿点点头发...

源码精品专栏

 
来源:juejin.cn/post/
7173271507047546893

近期,Spring 6 的第一个 GA 版本发布了,其中带来了一个新的特性——HTTP Interface。这个新特性,可以让开发者将 HTTP 服务,定义成一个包含特定注解标记的方法的 Java 接口,然后通过对接口方法的调用,完成 HTTP 请求。看起来很像使用 Feign 来完成远程服务调用,这可能是 Spring “抛弃” feign 等 http 调用的一种趋势,Spring 要规范和简化这一块的实现了,让开发者更关注聚集于业务。下面我们参考官方文档来完成一个 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(110)
            .mapToObj(i -> new User(i, "User" + i))
            .collect(Collectors.toList());
}

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

下面我们新建一个 Spring Boot 工程。

Spring initializr

这里需要注意,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

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

基于 Spring Boot + MyBatis Plus + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

  • 项目地址:https://github.com/YunaiV/ruoyi-vue-pro
  • 视频教程:https://doc.iocoder.cn/video/

GetExchange(HttpExchange)注解

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

GetExchange

这些注解定义在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 {};

}

在上面的例子中,我们只指定了请求的资源路径。

基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

  • 项目地址:https://github.com/YunaiV/yudao-cloud
  • 视频教程:https://doc.iocoder.cn/video/

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 特性进行了简单的了解,我之后会深入研究这个特性,也会追踪后续版本中的改进并与你分享,欢迎点赞加关注。



欢迎加入我的知识星球,一起探讨架构,交流源码。加入方式,长按下方二维码噢

已在知识星球更新源码解析如下:

最近更新《芋道 SpringBoot 2.X 入门》系列,已经 101 余篇,覆盖了 MyBatis、Redis、MongoDB、ES、分库分表、读写分离、SpringMVC、Webflux、权限、WebSocket、Dubbo、RabbitMQ、RocketMQ、Kafka、性能测试等等内容。

提供近 3W 行代码的 SpringBoot 示例,以及超 4W 行代码的电商微服务项目。

获取方式:点“在看”,关注公众号并回复 666 领取,更多内容陆续奉上。

文章有帮助的话,在看,转发吧。

谢谢支持哟 (*^__^*)

微信扫码关注该文公众号作者

戳这里提交新闻线索和高质量文章给我们。
相关阅读
煮屁话禅茶(八)屁用不顶英国伦敦爱丁堡带孩子游记 Spring 2023遭多国“抛弃”!“美元霸权”还能维持多久删除、下架、终止合作…众多品牌“抛弃”张继科!他曾​被曝16岁涉赌,输钱后离队出走!代理律师最新回应Chase Sapphire Preferred (CSP) 信用卡【90k Offer 将于3月19日开始!】ChatGPT火了,微软“抛弃”元宇宙恐遭盟主“抛弃”,日本“联美制华”,中日关系面临“范式之变”发酵!众多品牌“抛弃”张继科!他曾​被曝16岁涉赌,输钱后离队出走!【周末综艺会6期】Spring Garden Show 和板蓝花儿开别只会 SpringMVC 了!Spring 又官宣了一个更牛逼的替代框架!Chinese Professor Suspended For Racist, Homophobic Speech章子怡在海南拼桌吃火锅,素颜样子真的很老,汪峰秃顶像60多岁的深入剖析 Spring Boot 的 SPI 机制被“抛弃”的农历:中国农历为何被公历取代?打卡,Goodbye Spring Break一年约2400家网点“关门”,银行正在”抛弃”老年人?​B站发布2022年财报;小米、金山软件等拟成立集成电路相关领域股权投资基金;贾跃亭“杀回”FF核心管理层……MLPInit:MLP的权重可以直接迁移到GNN上!一种简单的GNN训练加速方法老干妈,“抛弃”年轻人...活不起!纽约、加州正在被“抛弃” !这些州成美国人搬家首选!被巴菲特“抛弃”的台积电乘着 AI 芯片的热潮欣欣向荣国家一级演员杜雨露:死于癌症,只有6人参加葬礼,遗孀的行为让人泪目Agustín Hernández:中美洲建筑背景下的未来主义巨构多国,“抛弃”美元!安踏的“摇钱树”FILA,撑不下去了Spring break恭喜DBC职梦华威学员收获Jane Street (UK) Spring Week Offer!最新案例:232414 Web designer 网页设计师|225113 Marketing specialist 市场专员小费变味了越来越多的美国人重返办公室工作 纽约加州正在被”抛弃”成千上万人“背井离乡”天赋“易昺(bǐng)”,创造历史!Jiangsu Cities Add Mechanism to Report Pregnant MinorsSpring 6 正式“抛弃” feign八年“老网红”Flink:揭秘实时流计算引擎全球化落地的演进历程恭喜DBC职梦芝大学员收获“美国国企”Freddie Mac (US)全职Offer!一文详解Prompt学习和微调(Prompt Learning & Prompt Tuning)Spring循环依赖那些事儿(含Spring详细流程图)电动车“抛弃”了丰田章男40岁胡歌官宣生女!老婆不是江疏影,而是圈外女子,疑似某护士
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。