使用 Spring Boot 和 Postgres 构建反应式 RESTful Web智能AI代理服务
Spring Boot 2 与 Reactor
在本教程中,我们将学习如何使用Spring WebFlux框架以及Spring Data R2DBC来构建、测试和使用简单的反应式 REST 应用程序。
首先,让我们了解以下内容:
- 为什么要采用反应式编程?
- 什么是反应式编程?
- Spring WebFlux 框架
- 什么是 R2DBC?
为什么要采用反应式编程?
我们生活在一个微服务的世界里。为了构建一个简单的应用程序,我们使用多个微服务,它们相互交互。我们还必须满足可扩展性、资源利用率、延迟等期望。当我们谈论微服务时,Spring MVC 是最常用的行业标准 Web 开发框架之一,用于创建可扩展且可扩展的微服务。
在传统的 Spring MVC 应用程序中,当服务器收到请求时,会创建一个 servlet 线程。它将请求委托给工作线程进行 I/O 操作,例如数据库访问、REST API 调用等。当工作线程忙于执行请求时,servlet 线程(请求线程)继续处于等待状态并被阻塞。这也称为同步请求处理,它在每个请求模型上按线程工作。
Spring MVC 请求/响应流
在上面的模型中,并发是通过为每个请求从线程池中创建一个新线程来处理的。但是只能创建有限数量的线程,因为每个线程都消耗单独的内存。我们可以增加线程池大小,但这将消耗额外的内存,如果我们将线程池大小保持在较低水平,那么我们就无法扩展。为了应对这种情况,我们可以增加应用程序的内存,也可以在负载均衡器后面运行应用程序的多个实例。这两种选择都有助于我们扩展,但也会增加成本。因此问题出现了——我们如何用更少的线程来处理更多的请求?反应式编程是我们可以克服上述限制的方法之一。为了解决基于 Spring MVC 的微服务的缺点,我们可以使用基于反应式 Spring 的微服务。
什么是反应式编程?
简单来说,反应式编程是指异步、事件驱动的非阻塞应用程序,并且需要少量线程来处理请求。它围绕发布者-订阅者模式构建。在反应式编程中,我们发起对资源的请求,然后继续执行其他任务。当数据可用时,我们会收到通知以及数据以通知调用者。在回调函数中,我们可以根据应用程序要求处理响应。反应式代码用更少的资源完成更多工作。通过反应式处理,我们可以用更少的微服务实例满足更多并发用户的需求。
现在我们知道了什么是反应式编程以及它如何改进传统的 REST API 设计,我们可以继续将反应式编程与 Spring 一起使用。
Spring WebFlux 框架
Spring WebFlux 是传统 Spring MVC 的替代品。Spring Framework 5 包含一个新spring-webflux模块。Spring WebFlux是一个从头开始构建的非阻塞 Web 框架,可利用多核、下一代处理器并处理大量并发连接。它在内部使用Project Reactor及其发布者实现:Flux和Mono。
它支持两种编程模型:
-
带注释的控制器:与 Spring MVC 一致,并基于
spring-web模块中的相同注释。Spring MVC 和 WebFlux 控制器都支持反应式(Reactor 和 RxJava)返回类型,因此很难区分它们。一个显着的区别是 WebFlux 还支持反应式@RequestBody参数。 - 功能端点:基于 Lambda 的轻量级函数式编程模型。您可以将其视为应用程序可用于路由和处理请求的小型库或一组实用程序。带注释的控制器的最大区别在于,应用程序负责从头到尾处理请求,而不是通过注释声明意图并回调。
在这里,我们将重点关注基于注释的反应组件模型。
反应式请求处理
什么是 R2DBC?
R2DBC 代表反应式关系数据库连接,这是一个使用反应式驱动程序集成关系数据库的孵化器。Spring Data R2DBC 为 R2DBC 提供了熟悉的 Spring 抽象和存储库支持。它帮助 Spring 驱动的应用程序 以反应式方式执行数据库操作。目前,只有PostGres、MSSQL 和 H2支持R2DBC驱动程序**。**
创建响应式 REST 用户管理应用程序
让我们使用 Spring Webflux 框架和Spring Data R2DBC创建一个简单的 Reactive REST 用户管理应用程序。
先决条件
在开始之前,我们必须确保本地机器上安装了以下先决条件:
- Maven
- Java SE 8 或更高版本的 JDK
- Postgres
构建步骤
- 设置 Spring WebFlux 项目设置
- 包括其他 Maven 依赖项
- 提供 Postgres 和 H2 的配置
- 定义模型类
- 创建存储库
- 定义 Rest 控制器端点
- 构建服务层
- 使用 WebTestClient 和 Swagger-UI 测试应用程序
- 通过 Web 客户端使用响应式 API
- 结论
1.设置 Spring WebFlux 项目
在本教程中,我们使用 JDK 1.8 和 Spring Boot 2.3.0.RC1 项目*。*使用start.spring.io并使用以下工件创建示例项目:
- Spring Reactive Web: Spring Reactive Web 为我们的应用程序提供了一个反应特性。
- **Spring Data R2DBC:**提供反应式关系数据库连接,以便在反应式应用程序中使用 Spring