首页
Preview

解构响应式 API

最近在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

版权声明:本文内容由TeHub注册用户自发贡献,版权归原作者所有,TeHub社区不拥有其著作权,亦不承担相应法律责任。 如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

点赞(0)
收藏(0)
阿波
The minute I see you, I want your clothes gone!

评论(0)

添加评论