当前位置: 首页>资讯 >

Spring 新特性,正式“抛弃”Feign了

来源: 架构师社区 | 时间: 2023-05-16 07:56:51 |

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

目录完成一个 Demo GetExchange(HttpExchange)注解 UserApiService 实例的创建 其他特性 为什么需要 Spring Reactive Web 的依赖

前言

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


【资料图】

完成一个 Demo

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

先创建一个实体类:

publicclassUserimplementsSerializable{privateintid;privateStringname;//省略构造方法、Getter和Setter@OverridepublicStringtoString(){returnid+\":\"+name;}}

再写一个简单的 Controller:

@GetMapping(\"/users\")publicListlist(){returnIntStream.rangeClosed(1,10).mapToObj(i->newUser(i,\"User\"+i)).collect(Collectors.toList());}

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

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

这里需要注意,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 接口。最简单的定义如下即可:

publicinterfaceUserApiService{@GetExchange(\"/users\")ListgetUsers();}

然后,我们可以写一个测试方法。

@TestvoidgetUsers(){WebClientclient=WebClient.builder().baseUrl(\"http://localhost:8080/\").build();HttpServiceProxyFactoryfactory=HttpServiceProxyFactory.builder(WebClientAdapter.forClient(client)).build();UserApiServiceservice=factory.createClient(UserApiService.class);Listusers=service.getUsers();for(Useruser:users){System.out.println(user);}}

最终回打印获取到的是个用户信息:

1:User12:User2...9:User910: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@interfaceHttpExchange{@AliasFor(\"url\")Stringvalue()default\"\";@AliasFor(\"value\")Stringurl()default\"\";Stringmethod()default\"\";StringcontentType()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 的实现。

关键词:

 

热文推荐

Spring 新特性,正式“抛弃”Feign了

文章来源:https: juejin cn post 7173271507047546893目录完成一个DemoGetExchange(HttpExchange)注解U

2023-05-16

每日动态!美属维尔京群岛就“爱泼斯坦案”向马斯克发出传票

据美国媒体15日报道,美属维尔京群岛向美国特斯拉公司首席执行官埃隆·马斯克发出传票,要求其提供文件证明

2023-05-16

天天关注:2023年5月海南证券从业资格预约式考试时间及科目:5月25日

测试科目及题型如下:(一)海南2023年5月证券从业资格考试时间安排测试日期:2023年5月25日证券从业高频考点

2023-05-16

天天看点:敦煌法院:酒后驾车,发生事故后逃逸获刑四年

近日,敦煌市人民法院审结了一起违反交通运输管理法规,饮酒后驾驶机动车未确保安全、超速行驶,发生交通事

2023-05-16

今日快讯:西尼电梯排名属于几线品牌_西尼电梯

1、何以提此问题?价格便宜难道也错了,价格高嫌贵,价格低了也不满意?不管如何,你提的贴牌与否难道会影

2023-05-16

切尔西再次瞄准米兰核心 欲将两名实力球员加入谈判

虽然近期关于AC米兰的葡萄牙边锋拉斐尔·莱奥的续约事宜已经逐渐明朗,但英超方面似乎并没有放弃引进这名球

2023-05-16

百团百角唱新歌丨这个京剧演员自己演自己,要“成角儿”

华声在线5月15日讯(记者龙文泱刘思佳曾冠霖通讯员李朝辉)京剧演员纪瑶瑶没想到,有一天她会在台上演出自

2023-05-15

环球滚动:ST安信(600816)股东上海砥安投资管理有限公司质押24.76亿股,占总股本25.1504%

ST安信(600816)5月15日公开信息显示,股东上海砥安投资管理有限公司向中国信托业保障基金有限责任公司合

2023-05-15

深圳的中国移动宽带怎么样_中国移动宽带怎么样

1、方法:  打开360安全卫士。2、  2、点击右下角宽带测速。3、  3、等待15秒。4、  4、查看结果。

2023-05-15

金界传奇:黄金2012先多,反弹2025-2027再空!

目前黄金陷入区间僵持,下方关注2012支撑,上方关注2027压制。我认为,多头反弹之势还未消耗完毕,晚间仍然

2023-05-15

回顾:老人摔倒无人扶最终死亡,家属将路人告上法庭,法院这样宣判 天天快报

回顾:老人摔倒无人扶最终死亡,家属将路人告上法庭,法院这样宣判,郝建,老人,法庭

2023-05-15

天天快看点丨北京印刷学院出现集体呕吐现象,学校某负责人:情况属实

15日下午,在北京印刷学院班级群中,多位学生反应在学校食堂用餐后出现上吐下泻的情况。针对此情况,学校方

2023-05-15

中兴通讯R5300 G5服务器刷新SPEC CPU性能测试世界纪录

近日,国际标准性能评估组织SPEC发布最新测试结果。中兴通讯最新产品R5300G5服务器打破了SPECCPU2017测试世

2023-05-15

注意!龙源电力将于6月15日召开股东大会|每日快看

龙源电力(SZ001289,收盘价:18 78元)5月15日发布公告称,2023年6月15日(星期四)09:00,公司将在北京市

2023-05-15

焦点速递!安徽省人民政府与住房和城乡建设部签署合作框架协议

5月11日下午,省政府与住建部在合肥签署共建城市基础设施生命线安全发展先行示范区合作框架协议。省委书记

2023-05-15

世界今热点:贵州烫皮牛肉的正宗做法?

1、将牛肉烧去毛桩,洗净焯水,入麻辣卤水中,小火卤40分钟,泡一小时至皮软烂,捞出晾凉。2、将牛肉切片(7

2023-05-15

【全球独家】sorftime下载_sorftime

1、帮助分析亚马逊类目市场及竞争环境的。2、通过他们可以看出市场竞争激不激烈,是否存在垄断性,新品占比

2023-05-15

2023年4月|全国气象新媒体影响力榜单发布!

4月雪在天气舞台上怒刷存在感山西中南部出现历史上最晚春季降雪4月20日至23日受强冷空气影响降温幅度超过10

2023-05-15

石榴树盆景修剪时间和方法_石榴树盆景_最新快讯

1、一:制作盆景多选用株态矮、叶片小、花果小的小石榴树种,如火石榴、四季石榴、玛瑙石榴等品种。2、石

2023-05-15

世界新动态:一个显示器分屏显示怎么弄出来_一个显示器分屏显示

1、笔记本电脑可以外接到液晶显示器分屏显示方法如下:1,把液晶显示器接上电源,然后用VGA线连接笔记本和

2023-05-15