春季WebFlux与Kotlin– Reactive Web

春季5.0-甚至更高

在本文中,我将展示如何将Spring和Kotlin一起使用。如果您对我最近的文章不熟悉,请查看其他与Kotlin相关的文章 这里。除了Kotlin之外,我一直对与 弹簧 自从我从2011年开始使用Java以来​​。我仍然喜欢该框架,尽管它变得越来越大,而且您常常不十分了解在所有替代方案中选择哪个功能。随着框架本身的发展, 文件资料,这也是您有史以来最好的体验之一。

我最喜欢Spring的一件事是,您可以从一开始就专注于业务逻辑,而在启动之前就没有太多技术性,基础设施方面的内容。 弹簧通过封装很多完成某些任务所需的样板并提供了我们可以应用的简单注释,以利用这些功能。最著名的模块之一当然是 弹簧 Web MVC,它在JVM上的Web服务中被广泛使用。

响应式编程-非阻塞方式

您可能已经注意到 反应式编程 最近越来越受到关注。有许多新兴的框架想要鼓励这种编程风格,即 RxJava的, Vert.X 要么 阿卡 例如。如果您从未遇到过这些,可以阅读我的文章 科特林与Vert.X 作为第一步。

弹簧反应

What does this have to do with 弹簧 though? Well, of course, there’s yet another library for building reactive systems, which in fact is powered 通过 弹簧: [Project Reactor] //projectreactor.io). Reactor is used in the current 弹簧 Release 5.0, available since September 2017, which introduces a 反应式Web框架Web助焊剂.
这个事实本身就是让我深入研究的一个很好的理由,因为将Web MVC视为Spring的杰出模块,这听起来真是太神奇了。但是,还要考虑到此扩展的另一个重要原因:Spring大力支持 科特林 甚至介绍 科特林专用 最新主要版本ðŸ™的功能,这是通过使用扩展功能来扩展现有API以及引入Kotlin DSL来实现的,您可以在我的文章中阅读此功能 用Kotlin创建DSL。这些新的DSL之一与Spring齐头并进 Web助焊剂:用于描述由WebFlux支持的Web服务的功能DSL。实际上,这就是我接下来要在一个非常简短的示例中向您介绍的内容……

Web助焊剂和Kotlin在行动

让我们来看看一个非常基本的应用程序 春季WebFlux 在一个 科特林 应用。初始设置可以轻松下载为 弹簧靴 来自的申请 春季初始化,如果您选择Kotlin作为编程语言,并且还启用了“ Reactive Web”依赖关系,该依赖关系从SpringBoot 2.0.0开始可用。

春季启动

As soon as we’ve imported this project into our IDE, we can start with creating a reactive web service. For the sake of brevity, I chose a 非常 simple, not 非常 useful, example: An internally managed repository of simple Strings that is populated through the web interface and also is searchable from it. Thanks to 科特林 and also 弹簧, there's not much code that has to be written:

回购和处理程序

@Component
class ReactiveHandler(val repo: StringRepo) {
    fun getText(search: String): Mono<String> =
        repo.get(search).toMono().map { "Result: $it!" }
    fun addText(text: String): Mono<String> =
        repo.add(text).toMono().map { "Result: $it!" }
    fun getAllTexts(): Flux<String> =
        repo.getAll().toFlux().map { "Result: $it" }
}

@Component
class StringRepo {
    private val entities = mutableListOf<String>()
    fun add(s: String) = entities.add(s)
    fun get(s: String) = entities.find { it == s } ?: "not found!"
    fun getAll() = listOf(entities)
}

We simply create a repository that maintains a list of Strings and another class ReactiveHandler, which is responsible for delegating to the repository and providing "reactive types" defined in Reactor. These are mandatory for Web助焊剂: Flux and Mono (Read about them 这里). Regardless of their intention, have a look at how they are created: toMono() and toFlux() are examples of extension functions added in 弹簧 5.0, a feature dedicated to 科特林. The much more interesting part though is where the web routing is defined. This part in particular is where the already mentioned functional DSL comes into play. Let’s observe how it works.

功能性WebFlux DSL。

@Configuration
class RoutingConfiguration {

    @Bean
    fun routerFunction(handler: ReactiveHandler): RouterFunction<ServerResponse> = router {
        ("/reactive").nest {
            val searchPathName = "search"
            val savePathName = "save"
            得到("/{$searchPathName}") { req ->
                val pathVar = req.pathVariable(searchPathName)
                ServerResponse.ok().body(
                        handler.getText(pathVar)
                )
            }
            得到("/") {
                ServerResponse.ok().body(handler.getAllTexts())
            }
            放("/{$savePathName}") { req ->
                val pathVar = req.pathVariable(savePathName)
                ServerResponse.ok().body(
                        handler.addText(pathVar)
                )
            }
        }
    }
}

The router function is the entry point of the new DSL, which can be inspected on 的GitHub。所示解决方案只是众多解决方案中的一种,因为DSL提供了更多可供选择的方式。按照我的定义,服务器在“ / reactive”下启动一个Web服务,并接受两个 得到 还有一个 request, each of which is delegated to the previously shown ReactiveHandler (see method parameter) before the results are put into a ServerResponse. Of course, you’d have to handle errors 在一个 real-world scenario and "ok" wouldn’t be the only response.

效益

如果您问我,这种方法的结构非常简洁,甚至提供了使用任何Kotlin代码来定义变量,循环,条件等实际DSL代码中任何内容的机会。鉴于此,您将拥有一个非常强大的工具,可以以非常自然的编程方式来使用它。

如果您想检查一下,可以在此找到代码 的GitHub资料库.

总结与展望

我介绍了一个小项目,该项目利用Spring 5.0及其新模块WebFlux与Kotlin的组合。我认为,Spring正式使用和支持Kotlin的事实是 非常 重要的一点,我想再次强调。

科特林-不仅是Android!

我们都知道Kotlin进入了Android,这是有可能的,因为Google几个月前宣布了官方支持。但是在服务器端,当Kotlin出现时,人们尤其是公司会犹豫。他们倾向于对Kotlin的成熟度是否已经足够怀疑。
当你 问我,没有犹豫的充分理由。许多项目已经使用Kotlin,框架支持Kotlin,甚至使用Kotlin专用功能扩展了它们的库。 弹簧作为最常见的Java框架之一,似乎与他们迅速采用Kotlin作为 另类 弹簧靴应用程序的Java和Groovy。下一步是Spring 5.0的一部分,这是下一步,我们在本文中已经观察到了其中的一些内容。如果您和我一样对将Kotlin推广为Java的替代品感兴趣,请进行讨论,并向您的同事介绍Spring的支持以及实际上的支持。
发生

特别感谢

如你所见 文章,Spring引入了许多Kotlin功能。有一个人, 塞巴斯蒂安·德勒兹(SébastienDeleuze),他对Spring框架中的这项开发负有高度责任。他也曾是 Talkingkotlin
已经。在Kotlin社区拥有如此有影响力的人真的很棒,非常感谢! 继续努力。

如果您想看一下我的示例,可以在这里找到代码:
吉特。随时提供任何反馈意见,我总是很乐意提供帮助。另外,如果你愿意,看看我的 推特 帐户,如果您对更多Kotlin产品ðŸ™感兴趣,请关注。非常感谢。

关于6条想法“春季WebFlux与Kotlin– Reactive Web

发表评论

您的电子邮件地址不会被公开。 必需的地方已做标记 *