springwebflux 页面_Spring Webflux 入门

这篇文章将讲述我如何开始使用Spring Webflux,兴奋地潜入Reactive Streams? 看看如何使用Spring Webflux和Java 9进行异步处理。

Reactive Streams

Reactive Streams是一种为非阻塞背压提供异步流处理标准的计划,这意味着源可以将数据发送到目的地,而不会用太多数据压倒目的地。目的地将告诉源它可以处理多少数据。这样,可以更有效地使用资源,Reactive Streams规范也有设置标准。

GVM的标准可以在GitHub中找到。总之,该规范包括以下项目:

发布者:发布者是将数据发送给一个或多个订阅者的来源。订阅者:订阅者将订阅发布者,将指示发布者可以发送多少数据并处理数据。订阅:在发布者方面,将创建订阅,该订阅将与订阅者共享。处理器:处理器可用于在发布者和订阅者之间进行,这样就可以进行数据转换。

Reactive Streams规范是一个标准,从Java 9开始,它与Flow API一起包含在Java中。仔细查看Reactive Streams规范和Java 9 Flow API。正如您将注意到的,Publisher,Subscriber,Subscription和Processor的接口是相同的。

Project Reactor

我们进行的下一步是Project Reactor。 该项目提供了基于Reactive Streams规范的Reactive库。 换句话说,是规范的实现。 基本上,Reactor提供两种类型:

Mono:实现Publisher并返回0或1个元素;Flux:实现Publisher并返回N个元素。

但它与Spring Webflux的关系是什么? Spring Webflux基于Project Reactor。

Spring Webflux

Spring Webflux是在Spring 5中引入的,有两种方法可以使用Spring Webflux。 一个是使用注解,这与Spring MVC非常相似,一个是使用功能方式。 我将使用功能方式, 除此之外,您必须知道Spring MVC和Spring Webflux彼此相邻。 Spring MVC用于同步处理,而Spring Webflux用于异步处理。

Spring Webflux入门示例

为了方便我自己,我尝试遵循Spring Webflux入门示例:构建一个Reactive RESTful Web服务。 我按照指南使用了Java 9,然而,它并没有成功。 我不得不做一些改写, 我不会重复它的步骤,但我会在尝试构建和运行应用程序时记录我的发现。首先,我必须将存储库添加到POM才能使用spring-boot-starter-parent 2.0.0.RC2。

此外,在依赖项中,我不得不使用spring-boot-starter-webflux而不是spring-boot-starter-web。

因为我使用的是Java 9,所以我必须添加以下模块信息:

现在,使用Maven构建并运行示例。在控制台中,我们看到打印了以下行:result = Hello, Spring!

Spring Webflux基本示例

现在,让我们看看我们是否可以创建一个基本示例并了解这里究竟发生了什么。我们创建包com.mydeveloperplanet.myspringwebfluxplanet.examples并添加一个ExampleRouter和一个ExampleHandler,我们尝试做最小化,以便可以在URL http:// localhost:8080/example中访问它。ExampleRouter变为以下内容:

ExampleHandler变为以下内容:

执行Maven,在浏览器中转到URL http:// localhost:8080/example。 显示以下错误:

在控制台日志中,我们看到以下内容:

Overriding bean definition for bean 'route' with a different definition: replacing [Root bean: class [null]; scope=; ......

现在将ExampleRouter类中的方法路由更改为routeExample并重新运行该应用程序。现在浏览器按预期显示以下内容:Hello, Spring Webflux Example!

至少,我们需要一个路由器和一个处理程序,我们必须确保Router Bean具有唯一的名称,否则,它可能被另一个具有相同名称的Bean覆盖。RouterFunction确定它匹配的路由并最终解析为Handler方法。

Spring Webflux“更进一步”的例子

现在我们知道如何设置,让我们更进一步,探索一些额外的功能。我们在类ExampleRouter中创建了一个方法routeExampleOneStepFurther,并通过andRoute方法将两个路由相互链接起来。这样,我们可以将多个路由链接到一起,让它们解析为不同的处理程序方法。 路由是逐个评估的,因此您必须确保在更通用的路由之前定义特定路由。方法routeExampleOneStepFurther如下:

处理程序方法在类ExampleHandler中创建,只返回一个字符串:

现在构建并运行应用程序并调用URL http:// localhost:8080/exampleFurther1,结果如下:

同样,URL http://localhost:8080/exampleFurther2向我们显示以下结果:

我们已经手动测试,现在让我们为它创建一个单元测试。 单元测试如下:

该测试基于Spring Webflux示例,在测试期间,服务器将在随机端口上启动,并将一个接一个地调用URL。首先,检查响应状态,然后检查响应是否正确。在Spring Webflux示例中,equals方法用于验证响应,但即使响应不等于结果,这也会导致成功。 这是不正确的,方法isEqualTo必须使用才能进行正确的测试。

Spring Webflux的“最后一步”示例

最后,我们将创建一个路径,该路由接受一个参数,为其添加测试。在我们的routeExampleOneStepFurther方法中,我们添加另一个路由并让它解析为类ExampleHandler的方法helloFurther3。 代码如下:

.andRoute(RequestPredicates.GET("/exampleFurther3").and(RequestPredicates.accept(MediaType.TEXT_PLAIN)), exampleHandler::helloFurther3)

方法helloFurther2提取名称参数并对给定名称说“你好”:

构建并运行应用程序并转到url http://localhost:8080/exampleFurther3?name=My%20Developer%20Planet。这给了我们预期的结果:

我们添加的测试类似于我们之前编写的测试:

最后,我们添加一个将返回404 http响应的测试。 使用isNotFound方法测试未解析的url路径的预期状态:

总结

在这篇文章中,我试图提供一些有关如何开始使用Spring Webflux的信息:在开始使用Reactive编程之前建议阅读Spring提供的基本Spring Webflux示例,还有很多其他的东西要探索。欢迎批评和指正,也欢迎点赞和转发。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值