当前位置: 首页 > 知识库问答 >
问题:

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

侯令雪
2023-03-14

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

我的设置:

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

我有一个小型Rest服务,使用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从我的角服务直接连接到它,这很好:

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);
};

如果我到达 /incrementendpoint,服务将接收具有递增值的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 service更新为通过代理:

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);
};

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

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

我知道zuul 1. x不支持SSE,但我希望与Spring Boot 2.1.1捆绑的zuul会。

有人知道吗?

共有1个答案

陶唯
2023-03-14

问题是您正在使用Zuul 1。x、 即使您使用的是springboot版本2。x、 我也遇到了同样的问题,看来Spring Cloud Netflix将不支持Zuul 2。x当前和未来。因此,当您使用spring云环境时,我建议您切换到spring云网关。我将其用于SSE,我对当前的解决方案感到满意。另一种选择是直接切换到Zuul 2.0。

 类似资料:
  • 我想要实现的是: user1向服务器发送消息(一个简单的POST请求) 服务器部分是(events.php) 我在(true)时尝试了无限循环以避免3秒的轮询。我也尝试过没有那个无限循环。只有发送消息的用户收到事件。 我理解这种做法并不好。但是,将SSE用于聊天应用程序的最佳实践是什么? 如何向所有用户发送事件?

  • 我是 SSE(服务器发送事件)的新手。我找到了一种在Spring启动中使用SSE发送响应的方法。我能够每 20 秒发送一次响应。我用下面的代码做同样的事情。 但问题是,这个方法每20秒就被调用一次。 但是,我的要求是每20秒向客户端发送一次空响应,并在新用户添加到数据库时发送响应。 如何实现我的目标?或者我在概念上完全错了。

  • 您好,我正在React中开发一个web应用程序,它使用Nginx从Express服务器接收SSE数据。 JS服务器 索引:JS const events=新事件源('https://api.myDomain.com/events', ); axios。post(<代码>https://api.myDomain.com/addCart,{客户端:this.state.clientId,购物车:car

  • 我无法理解HTML5s服务器发送的事件是否真的适合ReST体系结构。我知道并非HTML5/HTTP的所有方面都需要适合ReST架构。但我想从专家那里知道HTTP的哪一半是SSE(ReSTful的一半还是另一半!)。 一种观点是它是ReSTful的,因为客户端向服务器发出了一个“初始”HTTP GET请求,其余的只能看作是不同内容类型的部分内容响应(“文本/事件流”) 发送的请求不知道有多少响应将作

  • 我有一个ASP。net core 3.1服务器项目,它有一个非常简单的API发送单向服务器发送事件(SSE),如下所示: 现在,我想通过C#UWP客户端接收这些事件。很遗憾,我只收到第一个事件: 如何在UWP中创建行为以始终监听该连接并接收我可以进一步处理的事件?

  • 我有以下Quarkus资源: 这将生成没有事件名称的事件,并且只生成数据部分。如何指定事件名称?