Как заставить отправленные сервером события (SSE) работать через Zuul Proxy spring-boot 2.1.1 - PullRequest
0 голосов
/ 18 декабря 2018

У меня есть некоторые проблемы с работой SSE через мой обратный прокси-сервер zuul

Мои настройки:

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 config:

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 подключается к потоку, ожидает истечения времени ожидания по умолчанию (10 секунд), затемвозвращает 406 и восстанавливает соединение.Это если у меня нет данных.

Если у меня есть данные в приемнике, он подключается к потоку sse и ничего не происходит, пока я отправляю данные в поток.Когда я прекращаю выдвигать данные, EventSource ожидает истечения времени ожидания zuul (10 секунд), затем получает все данные в потоке и отключает / переподключается.

Я знаю, что zuul 1.x не поддерживает SSE, но я надеялся, что zuulв комплекте с пружиной багажник 2.1.1 будет.

Кто-нибудь знает?

1 Ответ

0 голосов
/ 21 января 2019

Проблема в том, что вы используете Zuul 1.x, даже если вы используете Springboot версии 2.x.У меня была такая же проблема, и, как кажется, Spring Cloud Netflix не будет поддерживать Zuul 2.x в настоящее время и в будущем.Поэтому, когда вы используете облачную среду Spring, я бы предложил переключиться на spring-cloud-gateway .Я использую его с SSE, и я удовлетворен текущим решением.Другой вариант - перейти на Zuul 2.0 напрямую.

...