Digital Ocean Droplet 阻止 Spring 端点生成文本事件流的输出
Digital Ocean Droplet blocking output of Spring Endpoint Producing Text Event Stream
我在 Spring 引导应用程序中有一个端点,该应用程序生成文本事件流作为输出。
@GetMapping(value = "/stream", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
public Flux<EventMessage<?>> findStream() {
return eventStream.log().share();
}
当 运行 在本地项目 jar 时,此端点工作正常,但当我在 kubernetes 中将其部署在数字海洋水滴上时,此端点似乎没有响应。
我调试了一下,似乎从浏览器到达终点时,页面一直在加载,但没有数据。但是请求是因为我有日志而发送的,而且当发布新事件时,日志也会出现。但没有结果出现在浏览器中
该服务是 运行 在部署为 NodePort
的单节点 microk8s 环境中
更新:
似乎输出流被节点的防火墙阻止了,因为我可以在节点内部卷曲端点。仍然不确定它是如何被阻止的。
这与您的云提供商无关 - Digital Ocean。
Block malicious downloads
功能阻止 HTML5 功能 Server Sent Events (SSE) 正常工作。由于 SSE 使用 text/event-stream 作为内容类型通过 HTTP 工作,因此它看起来像 never-ending download
。扫描器会保留 SSE 消息,直到通道因某种原因中断并将消息交给浏览器。
就像您可以在节点内部 cURL 端点一样,您也可以从 K8S 环境外部进行 cURL。
一种解决方法(如建议here)是为流的源 IP 添加网站授权。
还有一个类似的github issue讨论了Http流的中断。
我在 Spring 引导应用程序中有一个端点,该应用程序生成文本事件流作为输出。
@GetMapping(value = "/stream", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
public Flux<EventMessage<?>> findStream() {
return eventStream.log().share();
}
当 运行 在本地项目 jar 时,此端点工作正常,但当我在 kubernetes 中将其部署在数字海洋水滴上时,此端点似乎没有响应。
我调试了一下,似乎从浏览器到达终点时,页面一直在加载,但没有数据。但是请求是因为我有日志而发送的,而且当发布新事件时,日志也会出现。但没有结果出现在浏览器中
该服务是 运行 在部署为 NodePort
的单节点 microk8s 环境中更新: 似乎输出流被节点的防火墙阻止了,因为我可以在节点内部卷曲端点。仍然不确定它是如何被阻止的。
这与您的云提供商无关 - Digital Ocean。
Block malicious downloads
功能阻止 HTML5 功能 Server Sent Events (SSE) 正常工作。由于 SSE 使用 text/event-stream 作为内容类型通过 HTTP 工作,因此它看起来像 never-ending download
。扫描器会保留 SSE 消息,直到通道因某种原因中断并将消息交给浏览器。
就像您可以在节点内部 cURL 端点一样,您也可以从 K8S 环境外部进行 cURL。
一种解决方法(如建议here)是为流的源 IP 添加网站授权。
还有一个类似的github issue讨论了Http流的中断。