angular - 如何使服务器发送事件(SSE)通过 Zuul 代理 spring-boot 2.1.1 工作

标签 angular spring-boot kotlin server-sent-events netflix-zuul

我在通过 zuul 反向代理让 SSE 工作时遇到一些问题

我的设置:

Spring boot version: 2.1.1.RELEASE
Spring cloud dependencies: Greenwich.RC1
Angular-cli: Angular 7
Kotlin: 1.3.11
os: Linux

我有一个使用 SSE 的小型休息服务

@SpringBootApplication
@RestController
@CrossOrigin("http://localhost:19195")
class RestApplication {
    private final val processor = DirectProcessor.create<Int>().serialize()
    private final val sink = processor.sink()
    private final val counter = AtomicInteger()

    @GetMapping("/stream")
    fun stream(): Flux<ServerSentEvent<Int>> {
        println("Stream connected")
        return processor.map { n -> ServerSentEvent.builder<Int>(n).build() }
    }

    @GetMapping("/increment")
    fun sink() {
        sink.next(counter.incrementAndGet())
    }

}

如果我的 EventSource 从我的 Angular 服务直接连接到它,则效果很好:

const sse = new EventSource('http://localhost:8080/stream');
sse.onopen = (event) => {
  console.log('OnOpen ' + event);
};
sse.onmessage = (event) => {
  console.log(event);
sse.onerror = (error) => {
  console.log(error);
};

如果我点击/increment 端点,服务就会收到具有递增值的 sse 事件。

现在使用这个 zuul 配置:

zuul:
 sensitive-headers:
 routes:
  rest:
    path: /rest/**
    url: http://192.168.75.90:8080
 add-proxy-headers: true
 add-host-header: true

Angular 服务已更新为通过代理进行:

const sse = new EventSource('rest/stream');
sse.onopen = (event) => {
  console.log('OnOpen ' + event);
};
sse.onmessage = (event) => {
console.log(event);

};
sse.onerror = (error) => {
console.log(error);
};

现在我的 Angular 服务连接到流,等待默认的 zuul 超时(10 秒),然后返回 406 并重新连接。那是如果我没有数据。

如果我的接收器中有数据,它会连接到 sse 流,只要我将数据推送到流中,就不会发生任何事情。当我停止推送数据时,EventSource 等待 zuul 超时(10 秒),然后接收流上的所有数据并断开/重新连接。

我知道 zuul 1.x 不支持 SSE,但我希望与 spring boot 2.1.1 捆绑的 zuul 能够支持。

有人知道吗?

最佳答案

问题是你使用的是 Zuul 1.x,即使你使用的是 springboot 版本 2.x。我遇到了同样的问题,而且 Spring Cloud Netflix 目前和将来似乎不会支持 Zuul 2.x。所以当你使用spring cloud环境时,我建议切换到spring-cloud-gateway 。我正在 SSE 中使用它,我对当前的解决方案感到满意。另一种选择是直接切换到 Zuul 2.0。

关于angular - 如何使服务器发送事件(SSE)通过 Zuul 代理 spring-boot 2.1.1 工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53835804/

相关文章:

html - 无法解决angular4和html中的文本溢出

javascript - 如何按 JSON 元素排序

java - 卡夫卡生产者和消费者问题

kotlin - 在Kotlin/TornadoFX中关闭 View 后如何执行清理操作?

javascript - 获取嵌套对象值并将其放在表头上

java - 如何在 Spring Boot 中验证类型 'java.lang.Boolean'

java - 具有有效证书的 spring boot https 获取 ERR_SSL_VERSION_OR_CIPHER_MISMATCH,自签名工作正常

android - Kotlin:检查 JSONObject 键是否存在

Kotlin For 循环从给定的索引开始

android - 拖放干扰 Angular 7 CDK 中的滚动