当前位置: 首页 > 后端技术 > Java

还在用OpenFeign吗?快来试试SpringBoot3中的这个新东西吧!

时间:2023-04-01 20:40:20 Java

好久没发技术文章了。最近回到工作岗位,晚上有时间再码技术。今天我们要说的是SpringBoot3中的一个新东西,声明式HTTP调用。1、原因是去年年底SpringBoot3正式发布,我也尝到了滋味。最近会和小伙伴们慢慢聊聊SpringBoot3给我们带来了哪些新的东西。今天我们先来看看声明式HTTP接口。用过SpringCloud的朋友都知道,在SpringCloud家族中,我们可以使用RestTemplate或者OpenFeign进行进程间通信(当然还有其他的方式比如基于消息中间件的消息驱动微服务或者基于gRPC的调用等.)。我们可以把RestTemplate当作一个普通的HTTP调用工具。与其他HTTP客户端不同,RestTemplate在调用RESTful风格的接口时特别方便。不过OpenFeign比RestTemplate更方便,可以通过接口声明实现远程调用。这些的具体用法松哥在之前的视频中有提到,这里不再赘述。过去,我们想使用声明式的HTTP调用,需要通过OpenFeign来实现。这需要第三方依赖项。从Spring6(SpringBoot3)开始,Spring本身通过@HttpExchange注解提供了类似的功能,方便实现声明式HTTP。转移。未来,跨服务调用将有另一种选择。2.使用接下来宋哥就通过一个案例和小伙伴们一起演示一下@HttpExchange注解的具体玩法。首先,让我们创建一个名为server的普通SpringBoot项目。在这个普通的SpringBoot项目中,我们只需要提供一个简单的测试接口即可,如下:}}这个大家应该很容易,就不多说了。现在假设我有另外一个服务叫client,我想在client中调用server提供的这个接口。首先,让我们创建客户端项目。请注意,在创建时,我们不仅需要添加Web依赖,还需要添加ReactiveWeb,因为这个@HttpExchange底层是基于WebClient的,而WebClient是由ReactiveWeb提供的:创建完成后,我们接下来你可以声明Http接口:@HttpExchange("/server")publicinterfaceToDoService{@GetExchange("/hello")Stringhello(@RequestParamStringname);}这些用法类似于@RequestMapping和@GetMapping等。特别相似:@HttpExchange和@RequestMapping类似,可以放在类上起到请求收窄的作用,也可以放在方法上,我们可以通过method属性method来指定具体的请求,这个也类似@RequestMapping:@HttpExchange(value="/server",method="GET")。@GetExchange与@GetMapping类似,这里不再赘述。其他类似的注解还有@DeleteExchange、@PatchExchange、@PostExchange、@PutExchange等。另外需要注意的是请求方法的参数需要加上@RequestParam注解,这点和OpenFeign类似。接口声明后,我们还需要对其进行配置才能使用。如下:@ConfigurationpublicclassWebConfig{@BeanWebClientwebClient(){returnWebClient.builder().baseUrl("http://localhost:8080").build();}@BeanToDoServicetoDoService(){HttpServiceProxyFactoryhttpServiceProxyFactory=HttpServiceProxyFactory.builder(WebClientAdapter.forClient(webClient())).build();返回httpServiceProxyFactory.createClient(ToDoService.class);}}这个配置主要是两个方面:@HttpExchange是基于WebClient的,所以我们首先要配置WebClient,在配置WebClient的时候,请求的具体地址也顺便配置了(因为具体的域名和端口)请求未在@HttpExchange注释中指定);同时,如果需要自定义HTTP请求头,也是通过配置WebClient来实现的。由于我们前面提供的ToDoService是一个接口,所以我们还需要提供这个接口的实现类。当然,这个配置完全是套路化、模板化的,这个就没什么好说的了。所有配置完成后,我们就可以直接注入ToDoService实例,在需要的地方使用。这里有一个简单的例子供您参考:@SpringBootTestclassClientApplicationTests{@AutowiredToDoServicetoDoService;@TestvoidcontextLoads(){Stringhello=toDoService.hello("javaboy");System.out.println("你好="+你好);}}好了,一个简单的例子,朋友们不妨体验一下。以后不用OpenFeign也能实现声明式服务调用了~