端到端反应流式恢复服务



我已经阅读了这篇文章,我不知道这是否是一个愚蠢的问题。我是反应性编程的新手。

这个问题非常简单:假设我有一个反应性的后端,我如何流到浏览器(例如,大型文本(,然后一旦来自服务器,就会向用户打印每个块?

可能我缺少一些重要的概念点,但是我需要知道的是:我可以在一个http get(?或否(请求中发送一小部分数据(从服务器到浏览器(吗?关键是:我可以写那些小零件,直到发送全数据为止?

感谢您的任何帮助。我以前真的尝试过Google,但是我总是会得到有关其他概念的信息(例如WebSocket,长纸,React.js(,我认为不是这样。

编辑:我不要求特定的API OU库。我只想理解这个概念,例如:"您不能使用HTTP协议,期限!"或"这与反应性编程无关,您对流的真正含义感到困惑。请参阅'sosity_else.js'。

edit2:使用此方法使用Spring-MVC(Spring-Boot(进行了一个小的REST控制器:

@RequestMapping(value = "/flush", method = RequestMethod.GET)
public void flushTest(HttpServletResponse response) {
    response.setContentType("text/html");
    response.setStatus(SC_OK);
    try (ServletOutputStream outputStream = response.getOutputStream()) {
        for (int i = 0; i < 3; i++) {
            String chunk = "chunk_" + i;
            outputStream.print(chunk);
            outputStream.flush();
            response.flushBuffer();
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
}

在浏览器中,只有整个响应才能到达,即使使用Flushbuffer。经过一番研究,这可能是一个问题,我更改了我的pom.xml,包括profterts:

<dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-undertow</artifactId>
</dependency>

带有默认配置:

server.undertow.accesslog.enabled=true
server.undertow.accesslog.dir=target/logs
server.undertow.accesslog.pattern=combined
server.compression.enabled=true
server.compression.min-response-size=1l

此刻,使用我的IDE中的调试,在Flushbuffer之后写了每个块。

所以,我相信这可能是tomcat配置。长话短说,我知道有很多事情可以帮助我完成"流媒体解决方案",并感谢所有评论,但我的问题有点概念化。

HTTP顶部有一个协议,该协议允许使用HTTP Transpert在较小的,即将到来的较小,即将到来的块中向浏览器交付服务器响应。它称为 SSE (服务器发送的事件(或 eventsource ,这是有关该主题的完全集成的文章。

还有其他方法可以使用HTTP协议流式传输数据。一种这样的选择是JSON流媒体,其中您在其中从服务器上的电线上编写部分响应,并在到达时消耗JSON块。在消费方面,一个流行的库称为opoe.js,在服务器端,您基本上需要在要发送时在响应线上写下部分数据,或者是可用的。

对于两种方法,RX对于处理服务器端上的流逻辑很有用。您可以将碎片建模为流(处理错误等(,最终在订户中,您在电线上写下单个排放,在可观察到的完成后关闭响应。

在客户端,Eventsource事件可以包裹在新的可观察到的(通过Rx.Observable.create()(中,并作为流进行进一步处理。同样可以将双簧管事件转换为可观察到的(通过Rx.Observable.fromEvent()

(

最新更新