在 Spring 里使用 Akka Streams

Akka Streams 作为 Reactive Streams 的一种实现,可以很方便的与其它 Reactive Streams 实现进行互操作。而从 Spring 5 开始,也提供了 Reactive Streams 实现的版本: WebFlowAlpakka Spring Web 项目提供了对Spring Boot的支持,可以让我们在 Spring 项目中使用 Akka Streams。

添加 Akka Streams 支持

需要给Spring项目添加 Akka Streams 依赖:

sbt
libraryDependencies += "com.lightbend.akka" %% "akka-stream-alpakka-spring-web" % "2.0.0-RC2"
Maven
<dependency>
  <groupId>com.lightbend.akka</groupId>
  <artifactId>akka-stream-alpakka-spring-web_2.13</artifactId>
  <version>2.0.0-RC2</version>
</dependency>
Gradle
dependencies {
  compile group: 'com.lightbend.akka', name: 'akka-stream-alpakka-spring-web_2.13', version: '2.0.0-RC2'
}

编写控制器

在添加了 Akka Streams 支持后,我们就可以在控制器代码里直接返回 Source[T, Mat] 类型的结果了。

import akka.NotUsed;
import akka.stream.javadsl.Source;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class SampleController {
  @RequestMapping("/")
  public Source<String, NotUsed> index() {
    return Source.repeat("Hello world!").intersperse("\n").take(10);
  }
}

运行程序

SampleApplication.java 代码如下,如通常的Spring Boot程序并无起二致。

@SpringBootApplication
public class SampleApplication {
  public static void main(String[] args) {
    SpringApplication.run(SampleApplication.class, args);
  }
}

运行 SampleApplication 启动Spring Web程序,通过curl访问服务示例如下:

$ curl -i http://localhost:8080
HTTP/1.1 200 
Content-Type: text/plain
Transfer-Encoding: chunked
Date: Wed, 20 Nov 2019 03:47:44 GMT

Hello world!
Hello world!
Hello world!
Hello world!
Hello world!

可以看到响应头里有:Transfer-Encoding: chunked,这个结果是以流的形式将数据一块一块返回的。

在此文档中发现错误?该页面的源代码可以在 这里 找到。欢迎随时编辑并提交Pull Request。