最近在Spring世界中,Reactive API越来越受到关注,适应也很快。Reactive API到底是什么,与非反应式Rest API有何不同?在本文中,我将简要介绍如何开始编写Reactive API。
简单来说,它们基本上是非阻塞和异步的代码块。Spring提供了Webflux库来创建Reactive API。
Project Reactive:Webflux是Project Reactive的一部分,该项目旨在介绍Reactive编程。Spring MVC使用像Tomcat这样的Servlet容器,并且内嵌的Tomcat默认带有Spring Web Starter依赖项。Webflux使用的是Netty,该依赖项默认带有依赖项。Spring MVC使用每个请求一个线程模型,同步和阻塞的代码。Spring Webflux则使用异步和非阻塞的方法。Reactive API也是REST API,就像Servlet API一样在Http协议上公开。
图片来源:Spring Cloud Native Book by Manning Publications
Flux和Mono:-
Flux和Mono是Spring WebFlux中的返回类型。
Flux异步地发出多个项目。例如,在API中发布多个项目,我们将使用Flux。而Mono仅发布单个项目/对象,并使用Mono来通过API发出一个项目。
Flux API示例;
@GetMapping("")
@ResponseStatus(HttpStatus.SUCCESSFUL)
public Flux<PatientDetailsDTO> findAllPatients() {
return patientRepository.findAll().
map(patient -> new PatientDetailsDTO(patient.getId(),
patient.getName(), patient.getSurname()));
}
Mono API示例;
@GetMapping("/{id}")
@ResponseStatus(HttpStatus.ACCEPTED)
public Mono<VisitDetailsDTO> findVisitById(@PathVariable String id) throws ExecutionException, InterruptedException {
return visitService.findVisitById(id);
}
Reactive持久层:-
Spring Data可以提供反应式数据访问,当使用Mongo时,我们可以利用spring-boot-starter-data-mongodb-reactive依赖项。 Gradle和maven依赖项如下;
implementation 'org.springframework.boot:spring-boot-starter-data-mongodb-reactive'
org.springframework.boot
spring-boot-starter-data-mongodb-reactive
```
Mongo Reactive依赖项提供了ReactiveMongoRepository,我们可以使用它来创建存储库接口。这是我们的存储库将如何查看的方式;
```
public interface VisitRepository extends ReactiveMongoRepository {
}
```
如果我们选择了一些关系型数据库,例如MySQL或PostgreSQL而不是MongoDB,则一个流行的依赖项是[r2dbc](https://docs.spring.io/spring-framework/reference/data-access/r2dbc.html),它允许创建反应式存储库。
```
org.springframework.boot
spring-boot-starter-data-r2dbc
```
**Reactive客户端调用API:-**
在Spring MVC中,我们有RestTemplate客户端来集成其他人公开的API。在Reactive Spring中,我们有WebClient来实现此目的。以下是如何使用webClient调用API的方法;
private Mono<Visit> invokeAPI(){
return this.webClient.get().uri(URI.create("API_Endpoint")).retrieve()
.bodyToMono(Visit.class);
}
测试Reactive API:-
Reactive Spring提供了WebTestClient来编写API端点的集成测试。让我们使用它编写一个测试;
@Autowired
private WebTestClient webTestClient;
@Test
void find_all_patients(){
long patientCount = patientRepository.findAll().count().block();
webTestClient.get().uri("/v1/patients")
.exchange().expectStatus().isEqualTo(HttpStatus.ACCEPTED)
.expectBody()
.jsonPath("$").isArray()
.jsonPath("$.size()").isEqualTo(patientCount);
}
通过本文,我简要介绍了编写Reactive API所需的一些重要部分。我真诚地希望这篇文章能作为Spring Reactive API的介绍性文章对你有所帮助。如果你有兴趣在示例应用程序中查看整个代码,请在github上克隆此repo。
译自:https://medium.com/@techphile/deconstructing-reactive-apis-6dab067692a6
评论(0)