Spring6的新特性,正式“抛弃”feign了
创始人
2024-06-02 22:40:06
0

多数网友在对接第三方系统时,还在使用 httpclient、okhttp 等方式进行硬编码的形式实现对接。其实,我认为使用 feign 来实现更为方便快捷。feign 除了服务间的 http 调用外,还支持非服务间的 http 调用。只是,我们的一些思维还未转变过来,对 feign 的底层实现也缺乏一定的了解。

近期,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@Overridepublic String toString() {return id + ":" + name;}
}

再写一个简单的 Controller:

@GetMapping("/users")
public List list() {return IntStream.rangeClosed(1, 10).mapToObj(i -> new User(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 接口。最简单的定义如下即可:

public interface UserApiService {@GetExchange("/users")List 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 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 还包含了其他类似的注解:

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 {};}

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

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 的实现。

相关内容

热门资讯

安卓系统弹出窗口问题,安卓系统... 手机里的安卓系统突然弹出窗口,是不是让你心头一紧,手忙脚乱?别急,今天就来和你聊聊这个让人头疼的安卓...
安卓系统加苹果战队,科技竞技的... 你知道吗?在科技的世界里,有一场特别的较量正在悄然上演。那就是安卓系统和苹果战队的对决!这两大操作系...
miui与安卓系统关系,深度定... 亲爱的读者,你是否曾在使用手机时,对那熟悉的MIUI界面感到亲切又好奇?今天,就让我们一起揭开MIU...
安卓原生系统手机哪些,探索安卓... 你有没有想过,为什么你的手机总是那么流畅,那么强大?这背后,可是有一个默默无闻的英雄——安卓原生系统...
安卓系统cpu天梯图,性能比拼... 你有没有发现,手机里的安卓系统,就像是我们的好朋友,每天都在默默无闻地工作着。而它的心脏,也就是CP...
安卓系统通知时间,掌握生活节奏... 你有没有发现,手机里的安卓系统通知时间有时候会让人有点头疼呢?有时候它准时得像军号,有时候又懒洋洋得...
安卓系统默认安装位置,默认安装... 你有没有发现,每次新买一台安卓手机,打开它的时候,那些默认安装的APP总是占据着固定的位置?是不是好...
安卓系统内存优化模式,高效运行... 手机用久了是不是感觉越来越卡?别急,今天就来给你揭秘安卓系统内存优化模式的秘密,让你的手机焕发新生!...
零信任软件安卓系统,零信任软件... 你知道吗?在科技飞速发展的今天,手机已经成为了我们生活中不可或缺的一部分。而在这其中,安卓系统凭借其...
怎样更改安卓系统时间,安卓系统... 手机时间不对了?别急,我来教你怎样更改安卓系统时间,让你手机上的时间瞬间回到正轨!一、直接调整系统时...
鸿蒙系统离不开安卓,基于安卓的... 你知道吗?最近在科技圈里,有一个话题可是引起了不小的讨论呢!那就是鸿蒙系统与安卓的关系。很多人都在问...
安卓系统怎么重启应用,安卓系统... 手机里的安卓应用突然卡住了,是不是让你头疼不已?别急,今天就来教你怎么轻松重启安卓系统中的应用,让你...
安卓系统开启远程登录,安卓系统... 你有没有想过,即使你不在家,也能轻松管理你的安卓设备呢?没错,就是安卓系统开启远程登录!这可是个超级...
黑域安卓系统4.0,创新功能与... 亲爱的读者们,你是否对安卓系统有所好奇?今天,我要带你深入探索一个神秘而独特的存在——黑域安卓系统4...
安卓系统基础教程,从入门到精通 你有没有想过,你的安卓手机里那些神奇的软件和功能是怎么来的呢?其实,这一切都离不开安卓系统的基础。今...
安卓系统盒子停服,回顾辉煌历程 你有没有发现,最近你的安卓系统盒子突然有点不对劲?是不是觉得它变得有点“懒”,不再像以前那样活泼了呢...
安卓系统怎么下蝙蝠,安卓系统下... 你有没有想过,在安卓手机上下载蝙蝠APP,竟然也能成为一门学问呢?没错,就是那个让你随时随地畅游网络...
安卓系统能播放蓝光,安卓系统轻... 你有没有想过,你的安卓手机或者平板,竟然能播放那些高清到让人惊艳的蓝光电影呢?没错,就是那种画质细腻...
汽车系统识别到安卓,智能驾驶新... 你知道吗?最近汽车界可是掀起了一股新潮流呢!那就是汽车系统识别到安卓,这可不是简单的兼容,而是深度融...
工程业务系统安卓版,助力项目管... 你知道吗?最近我在手机上发现了一个超级实用的工程业务系统安卓版,简直让我爱不释手!这款应用不仅功能强...