我在通过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从我的角度服务直接连接到它,则可以正常工作:
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); };
现在,我的角度服务连接到流,等待默认的zuul超时(10秒),然后返回406并重新连接。那就是如果我没有数据。
如果我在接收器中有数据,它会连接到sse流,只要我将数据推入流中,什么都不会发生。当我停止推送数据时,EventSource等待zuul超时(10秒),然后接收流中的所有数据并断开连接/重新连接。
我知道zuul 1.x不支持SSE,但是我希望zuul与Spring Boot 2.1.1捆绑在一起。
有人知道吗
问题是,即使您使用的是Springboot版本2.x,您也正在使用Zuul1.x。我遇到了同样的问题,似乎Spring Cloud Netflix当前和将来都将不支持Zuul2.x。因此,当您使用Spring Cloud环境时,我建议切换到spring-cloud- gateway。我在SSE上使用它,并且对当前的解决方案感到满意。另一个选择是直接切换到Zuul 2.0。