如何使服务器发送的事件 (SSE) 通过 Zuul 代理 spring-boot 2.1.1 工作
How to make Server sent events (SSE) work trough Zuul Proxy spring-boot 2.1.1
我在通过我的 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 秒)然后 returns 406 并重新连接。那就是如果我没有数据。
如果我在接收器中有数据,它会连接到 sse 流,只要我将数据推送到流上就不会发生任何事情。当我停止推送数据时,EventSource 等待 zuul 超时(10 秒)然后接收流上的所有数据和 disconnects/reconnects.
我知道 zuul 1.x 不支持 SSE,但我希望 zuul 与 spring boot 2.1.1 捆绑在一起。
有人知道吗?
问题是您使用的是 Zuul 1.x,即使您使用的是 spring 引导版本 2.x。我遇到了同样的问题,看起来 Spring Cloud Netflix 目前和将来都不支持 Zuul 2.x。所以当你使用spring云环境时,我建议切换到spring-cloud-gateway。我将它与 SSE 一起使用,我对当前的解决方案感到满意。另一种选择是直接切换到 Zuul 2.0。
我在通过我的 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 秒)然后 returns 406 并重新连接。那就是如果我没有数据。
如果我在接收器中有数据,它会连接到 sse 流,只要我将数据推送到流上就不会发生任何事情。当我停止推送数据时,EventSource 等待 zuul 超时(10 秒)然后接收流上的所有数据和 disconnects/reconnects.
我知道 zuul 1.x 不支持 SSE,但我希望 zuul 与 spring boot 2.1.1 捆绑在一起。
有人知道吗?
问题是您使用的是 Zuul 1.x,即使您使用的是 spring 引导版本 2.x。我遇到了同样的问题,看起来 Spring Cloud Netflix 目前和将来都不支持 Zuul 2.x。所以当你使用spring云环境时,我建议切换到spring-cloud-gateway。我将它与 SSE 一起使用,我对当前的解决方案感到满意。另一种选择是直接切换到 Zuul 2.0。