使用 Kotlin+WebFlux/RxJava 2 实现响应式以及尝试正式版本的协程

在前一篇文章

《使用 Kotlin + Spring Boot 进行后端开发》

中,曾介绍过尝试使用 Kotlin 来做后端开发。这一次,尝试 WebFlux 以及协程。

首先,在build.gradle中添加插件和依赖的库。

此次,使用了 allopen 插件。它是官方提供的插件详见:https://kotlinlang.org/docs/reference/compiler-plugins.html

Kotlin 的类默认是final的,一般需要使用 关键字。使用了allopen插件就可以节省 关键字。值得注意的是,需要打开 Intellij 的 Enable annotation processing 选项。

这样,创建 SpringKotlinApplication 就不需要使用 :

另外,不要忘记配置数据库的信息,例子采用的是 MongoDB。

WebFlux

WebFlux 是 Spring 5 新增的特性,相对于传统 MVC 的同步阻塞IO模型,它采用异步非阻塞的IO模型。

WebFlux 的 Flux 取自于 Reactor 中的类 Flux。Reactor 是 Spring 5 响应式开发的基础。

Reactor 是完全基于响应式流规范设计和实现的库,Flux 和 Mono 是 Reactor 中的两个基本概念。

Flux 类似 RxJava 的 Observable,它可以触发零到多个事件,并根据实际情况结束处理或触发错误。Mono 最多只触发一个事件,它跟 RxJava 的 Single 和 Maybe 类似,所以可以把 Mono 用于在异步任务完成时发出通知。

1.1 创建 Model

首先,创建几个 Model 类。

User 表示用户对象。

Address 记录用户的地址。

Audit 用于记录用户操作的时间。

1.2 创建 Repository

创建 UserReactiveRepository 用于 User 对象的查询操作,它实现 ReactiveMongoRepository 接口。

创建 AuditRepository 用于查询用户最近一条的操作时间。

1.3 创建 Service

创建 UserReactiveService,通过依赖注入了 userRepository、auditRepository。

1.4 创建 Controller

创建 UserController 编写两个 reactive 的接口:

创建用户的方式:

基于城市查询用户的方式:

RxJava 2

RxJava 库是 JVM 上响应式编程的先驱,也是响应式流规范(Reactive Streams)的基础。

如果对 RxJava 2 不熟悉,也可以购买我的《RxJava 2.x 实战》

2.1 创建 Repository

创建 UserRxJavaRepository 功能跟 UserReactiveRepository 一样,只是多了一个 findUserByName() 方法。

2.2 创建 JavaService

创建 UserRxJavaService ,类似于 UserReactiveService。但是,多了两个方法:findByName()、login()。其中,调用 login() 会添加一条审计的记录。

2.3 创建 Controller

在原有的 UserController 中新增两个 rxjava 的接口:

Kotlin 1.3 的 Coroutines

协程(coroutine)相比于线程更加轻量级,协程又称为微线程。线程和协程的一个显著区别是,线程的阻塞代价是昂贵的,而协程使用了更简单、代价更小的挂起(suspend)来代替阻塞。

Coroutines 是 Kotlin 1.1 增加的实验的功能,到 Kotlin 1.3 已经变成了正式的功能。

先在 UserController 创建一个模拟登陆的接口,访问该接口时会添加一条审计的记录

然后尝试用传统的 blocking 方式来编写一个获取登陆信息的接口:

再尝试用 RxJava 的方式来编写该接口:

最后,使用 Coroutines 的方式来编写接口:

可以看到,使用协程的方式类似于传统的 blocking 的方式来编写代码。

模拟用户登陆:

使用 Coroutines 的方式获取登陆信息:

关于协程,更多可以参考之前写的 Coroutines 笔记:

虽然 Kotlin 1.3 之后有些变动,但是大体是不变的。之后,也会整理更多 Kotlin Coroutines 笔记。

总结

响应式开发是未来的趋势,无论是服务端开发还是移动端开发,都会顺应这个趋势。

另外,Kotlin 1.3 之后的协程已经是正式版本,Kotlin 在语言级别上支持了协程,它是异步编程的另一个不错的选择。

本文 demo 的 github 地址:https://github.com/fengzhizi715/kotlin-spring-reactive-coroutine-demo

关注【Java与Android技术栈】

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20181123G1KAX200?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券