Spring 6 版本最新发布,其中一个最大的更改是宣布“抛弃”Feign。

Spring6引入了HTTPInterface特性,允许开发者通过Java接口定义HTTP服务,提高了代码的可读性和可维护性。该特性类似Feign,但更规范,支持RESTful架构,可结合AOP和事务管理。文章展示了如何创建DEMO,包括定义接口、使用GetExchange注解以及利用SpringReactiveWeb的WebClient进行响应式编程。
摘要由CSDN通过智能技术生成

 

完成一个DEMO

GetExchange(HttpExchange)注解

UserApiService 实例的创建

其他特性

为什么需要 Spring Reactive Web 的依赖

总结

近期,Spring 6 的第一个 GA 版本发布了。除了一些 bug 修复和性能优化外,其中带来了一个新的特性——HTTP Interface。这个新特性可以让开发者将 HTTP 服务定义成一个包含特定注解标记的方法的 Java 接口。这样,通过对接口方法的调用,就能完成 HTTP 请求。这看起来很像使用 Feign 来完成远程服务调用。这也可能是 Spring “抛弃” feign HTTP 调用的一种趋势,Spring 要规范和简化这一块的实现,让开发者更关注聚集于业务。

不仅如此,新的特性还在使用上有很多优势。比如,使用 HTTP Interface 可以更好的遵循 RESTful 架构风格,提高代码的可读性和可维护性。同时,这也可以更方便地使用 Spring 提供的其他功能,如 AOP、事务管理等。

下面,我们参考官方文档来完成一个 Demo。首先,我们需要在 Spring 项目中引入相关依赖。然后,我们定义一个 HTTP Interface,编写相应的方法,并使用特定注解标记。最后,我们便能通过对接口方法的调用,完成 HTTP 请求。这种方式可以让我们的代码更加简洁,同时也能方便我们更好地管理和维护代码。

完成一个DEMO

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

先创建一个实体类:

再写一个简单的 Controller

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

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

在使用 Spring Boot 时需要注意一些细节。首先,需要确保 Spring Boot 的版本至少是 3.0.0。这样,它所依赖的 Spring Framework 版本才是 6.0 的版本,才能够包含 HTTP Interface 特性。因此,我们需要选择至少是 17 Java 版本。这是因为 Spring Framework 6.0 Spring Boot 3.0 开始支持的 Java 版本最低是 17。这些版本的 Java 提供了更多的功能和改进,能够更好地支持 Spring Boot

另外,为了使用 Spring Boot,我们还需要依赖 Spring Web Spring Reactive Web 依赖。这两个依赖提供了在 Web 应用程序中使用 Spring 的支持。Spring Web 提供了传统的 Web 应用程序支持,而 Spring Reactive Web 则提供了响应式编程模型的支持。这两个依赖都是必需的,因为它们提供了我们在构建 Web 应用程序时所需的所有功能。

创建好新的 Spring Boot 工程后,首先需要定义一个 HTTP Interface 接口。最简单的定义如下即可:

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

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

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

GetExchange(HttpExchange)注解

上文例子中的 GetExchange 注解代表这个方法代替执行一个 HTTP Get 请求。这种注解是一种方便的方法,使得 HTTP 请求的执行变得简单而快捷。而与此对应的,Spring 框架还包含了其他类似的注解,它们同样可以帮助简化代码的编写并提高代码的执行效率:

这些注解定义在spring-web模块的org.springframework.web.service.annotation包下,除了 HttpExchange 之外,其他的几个都是 HttpExchange 的特殊形式,这一点与 Spring MVC 中的 RequestMapping/GetMapping 等注解非常相似。 这些注解都是用来描述 RESTful 服务的,其中最常用的是 @GetMapping @PostMapping,它们分别代表 HTTP GET POST 请求。除此之外,还有 @PutMapping@PatchMapping@DeleteMapping 等注解,用来描述 HTTP PUTPATCH DELETE 请求。这些注解都可以用来注解方法和类。@RequestMapping 注解用来描述通用的请求映射信息,可以用来注解方法、类、甚至是接口。这些注解的使用非常灵活,可以根据具体的业务需要进行组合使用。

以下是 HttpExchange 的源码:

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

UserApiService 实例的创建

在上述例子中,我们创建了一个 HTTP Interface 接口,名为 UserApiService。在测试方法中,我们使用 HttpServiceProxyFactory 创建了 UserApiService 的实例。这种实例创建方式是参考了 Spring 的官方文档的写法。

你也可以将创建的过程写到一个 @Bean 方法中,从而可以将创建好的实例注入到其他的组件中。这样的方式可以使得代码更加简洁,同时也能增加代码的可维护性。

值得注意的是,尽管我们只是声明了一个接口,但是具体的请求操作是需要通过 UserApiService 来进行的。在 DEBUG 模式下,我们可以看到,创建的 UserApiService 的实例,实际上是一个代理对象:

目前,Spring 在创建代理对象方面尚未提供更加便捷的方式,但是未来的版本肯定会有所改进。如果你感兴趣,可以从 HttpServiceProxyFactory createClient 方法源码中查看一些创建 AOP 代理的代码。因此,我推测 Spring 很可能会增加一些注解来方便地创建代理对象。此外,我们可以探讨一下现有的代理对象创建方式是否存在可以改进的地方,比如是否可以提供更加灵活的选项以满足不同的需求。

更多特性

除了上述例子中的简单使用,使用 HttpExchange 的方法还支持各种类型的参数。这一点与 Spring MVC Controller 方法类似。方法的返回值也可以是任意自定义的实体类型,例如上面的例子。此外,它还支持诸如自定义异常处理等其他功能。

另外,使用 HttpExchange 还有以下特性:

支持多种媒体格式:HttpExchange 可以处理各种媒体格式,包括文本、XMLJSON 等。

支持 CookieHttpExchange 支持设置和读取 Cookie

支持文件上传:HttpExchange 支持处理文件上传请求。

支持 GZIP 压缩:HttpExchange 支持 GZIP 压缩,

为什么需要 Spring Reactive Web 的依赖

在上一段落中,我们提到了在创建工程时引入了 Spring Reactive Web 的依赖。现在我们来探讨一下,为什么需要这个依赖。事实上,使用 Spring Reactive Web 的依赖可以帮助我们更好地实现响应式编程。响应式编程是一种编程范式,它强调在程序的整个生命周期内,数据流可以被异步处理。这种编程方式可以帮助我们更好地实现高并发、高吞吐量的应用程序。

在创建代理的service对象的时候,我们使用了其中的 WebClient 类型。这是因为,HTTP Interface 目前只内置了 WebClient 的实现,它属于 Reactive Web 的范畴。WebClient 是一个非常强大的工具,它可以帮助我们更好地处理异步数据流。使用 WebClient ,我们可以轻松地进行 HTTP 请求和响应的处理。另外,它还提供了许多实用的功能,例如请求重试、响应压缩等等。

虽然目前 HTTP Interface 内置的是 WebClient 的实现,但是在后续的版本中,Spring 也将推出基于 RestTemplate 的实现。这样,用户可以根据自己的需求选择使用 WebClient 还是 RestTemplate 。无论选择哪种方式,Spring 都将会提供给开发者们更好的支持,帮助我们更好地实现响应式编程。

总结

在本文中,我们简要介绍了 HTTP 接口特性。这个特性在现代软件开发中非常重要,因为它可以使我们更轻松地与其他服务进行通信。HTTP 接口特性是一个很有前途的特性,因为它使得软件开发变得更加模块化和可扩展。我们期待着未来版本中的改进,这将使得我们更加容易使用和集成 HTTP 接口特性。我将继续关注这个特性的发展,并与您分享更多信息。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

永钊源码

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值