好久没发技能文章了,最近回到工作地,晚上有空又能够码码技能了,今日咱们就来聊一个 Spring Boot3 中的新鲜玩意,声明式 HTTP 调用。

1. 由来

Spring Boot3 去年底就已经正式发布,我也尝了一把鲜,最近有空会和小伙伴们慢慢聊聊 Spring Boot3 都给咱们带来了哪些新东西。

今日咱们就先来看看声明式 HTTP 接口。

用过 Spring Cloud 的小伙伴都知道,在 Spring Cloud 家族中,担任进程间通讯的,咱们能够运用 RestTemplate 或许 OpenFeign(当然也有其他办法如根据音讯中间件的音讯驱动的微服务或许根据 gRPC 的调用等)。

RestTemplate 咱们能够将之当作一个普一般通的 HTTP 调用东西来对待,差异于其他的 HTTP 客户端,RestTemplate 用来调用 RESTful 风格的接口特别方便。

不过,比 RestTemplate 更加方便的是 OpenFeign,经过接口声明就能够完成长途调用,这些的详细用法松哥在之前的视频中讲过,这里就不再赘述了。

曾经咱们想要用声明式 HTTP 调用,需求经过 OpenFeign 来完成,这个需求第三方的依靠,从 Spring6 开端(Spring Boot3),Spring 自己供给了相似的功用经过 @HttpExchange 注解也能方便的完成 声明式 HTTP 调用。今后跨服务调用又多了一个挑选。

2. 运用

接下来松哥经过一个案例来和小伙伴们演示一下 @HttpExchange 注解的详细玩法。

首要咱们先创立一个一般的名为 server 的 Spring Boot 项目,这个一般的 Spring Boot 项目中只需求供给一个简略的测试接口即可,如下:

@RestController
public class HelloController {
    @GetMapping("/server/hello")
    public String hello(String name) {
        return "hello " + name;
    }
}

这个对咱们来说应该是没什么难度的,我就不多说了。

现在假设我有别的一个服务名为 client,我想在 client 中调用 server 中供给的这个接口。

首要咱们来创立 client 这个项目,咱们留意,创立的时分咱们不只需求增加 Web 依靠,还需求 Reactive Web,由于这个 @HttpExchange 底层根据 WebClient,而 WebClient 则是 Reactive Web 供给的:

还在用 OpenFeign?来试试 SpringBoot3 中的这个新玩意!

创立完成后,接下来咱们就能够声明 Http 接口了:

@HttpExchange("/server")
public interface ToDoService {
    @GetExchange("/hello")
    String hello(@RequestParam String name);
}

这些用法跟咱们在 SpringMVC 中常用的 @RequestMapping 和 @GetMapping 等特别相似:

  • @HttpExchange 相似于 @RequestMapping,能够将之放在类上,起到一个恳求窄化的效果,也能够放在办法上,放在办法上咱们能够经过 method 特点来指定详细的恳求办法,这个也跟 @RequestMapping 相似: @HttpExchange(value = "/server",method = "GET")
  • @GetExchange 相似于 @GetMapping,这个就不再赘述了,其他相似的注解还有 @DeleteExchange@PatchExchange@PostExchange@PutExchange 等。
  • 别的需求留意的是恳求办法的参数需求加上 @RequestParam 注解,这一点和 OpenFeign 比较相似。

接口声明好之后还没完,咱们还需求装备一下才能运用。如下:

@Configuration
public class WebConfig {
    @Bean
    WebClient webClient() {
        return WebClient.builder()
                .baseUrl("http://localhost:8080")
                .build();
    }
    @Bean
    ToDoService toDoService() {
        HttpServiceProxyFactory httpServiceProxyFactory =
                HttpServiceProxyFactory.builder(WebClientAdapter.forClient(webClient()))
                        .build();
        return httpServiceProxyFactory.createClient(ToDoService.class);
    }
}

这个装备主要是两方面:

  1. @HttpExchange 是根据 WebClient 的,所以咱们首要需求装备 WebClient,装备 WebClient 的时分,也趁便装备了恳求的详细地址(由于在 @HttpExchange 注解中并未指定恳求的详细域名端口啥的);同时,对于 HTTP 恳求头号如果需求定制,也是经过装备 WebClient 来完成的。
  2. 由于咱们前面供给的 ToDoService 是一个接口,所以咱们还需求供给一个该接口的完成类,当然这个装备完全是套路化模版化的,这块就没啥好说了。

全部装备完成后,接下来咱们就能够在任何需求的当地,直接注入 ToDoService 的实例去运用了,举一个简略的比如小伙伴们参阅下:

@SpringBootTest
class ClientApplicationTests {
    @Autowired
    ToDoService toDoService;
    @Test
    void contextLoads() {
        String hello = toDoService.hello("javaboy");
        System.out.println("hello = " + hello);
    }
}

好啦,一个简略的比如,小伙伴们无妨体会下。

今后,不必 OpenFeign 也能完成声明式服务调用啦~