Неверный ответ на рукопожатие GetStatus: 502 Плохой шлюз

#java #spring-boot #istio #spring-websocket #spring-cloud-gateway

Вопрос:

У нас есть микросервис OpenShift, Istio, Облачный шлюз, Несколько микросервисов.

  • Пружинная загрузка 2.3.6.ВЫПУСК,
  • Весна-Облако Hoxton.SR9
  • Spring-Cloud-Starter-Шлюз 2.2.6.ВЫПУСК

Наша проблема заключается в следующем: недопустимое рукопожатие в веб-магазине.

Когда мы исключаем Istio из нашего набора, все работает нормально. Кроме того, если использовать Istio, но исключить облачный шлюз, все тоже работает нормально.

Похоже, проблема в том, что Istio добавляет длину содержимого заголовка=0, и облачный шлюз падает на рукопожатие websocket.

Как мы можем с этим справиться? Может быть, нам нужно что-то добавить в application.yml или какие-то бобы и т. Д.?

приложение.yml

 spring:
  profiles:
    active: default
  cloud:
    discovery:
      reactive:
        enabled: false
    kubernetes:
      discovery:
        enabled: false
    gateway:
      streaming-media-types:
        - application/stream json
        - text/event-stream
        - application/javascript
      routes:
      - id: microservice_name_websocket_sockjs_route
        uri: ${MICROSERVICE_NAME_SOCKJS_URI:lb://microservice-name}
        predicates:
          - Path=/microservice-name/ui/groupoperations/tasks/**
        filters:
          - RewritePath=/microservice-name/(?<segment>.*), /${segment}
      - id: microservice_name_webSocketRoute
        uri: ${MICROSERVICE_NAME_WEBSOCKET_URI:lb:ws://microservice-name}
        predicates:
          - Path=/microservice-name/ui/groupoperations/tasks/**
        filters:
          - RewritePath=/microservice-name/(?<segment>.*), /${segment}

server:
  port: 8889
ribbon:
  MaxAutoRetries: 1
  MaxAutoRetriesNextServer: 1
  ReadTimeout: 2000
  ConnectTimeout: 1000
  NIWSServerListClassName: io.fabric8.kubeflix.ribbon.KubernetesServerList
  PortName: http

logging:
  level:
    ROOT: TRACE
    com.corporation.project: TRACE
    org.springframework: TRACE
    reactor.netty.http.client: TRACE

white-list-filter:
  file:
    location: ${WHITE_LIST_FILE_LOCATION:classpath:filters}
    fileName: ${WHITE_LIST_FILE_NAME:cloud-gateway-whitelist.list}

management:
  security:
    enabled: false
  health:
    jms:
      enabled: false
  endpoint:
    metrics:
      enabled: true
    prometheus:
      enabled: true
  endpoints:
    web:
      exposure:
        include: '*'
      base-path: /
  metrics:
    export:
      prometheus:
        enabled: true

exception-control:
  enable: false
  forbidden-words-regex: (stack)|(exception)|(select)|(update)|(delete)|(insert)
  action: log_only
  status-to-replace: 418
  body-to-replace: 'Data leak prevented'

opentracing:
  jaeger:
    service-name: cloud-gateway
    enable-b3-propagation: true
    log-spans: true
  spring:
    cloud:
      jdbc:
        enabled: false
 

Исключение:

 2021-09-05 16:28:14.779 TRACE 1 --- [or-http-epoll-1] o.s.w.s.adapter.HttpWebHandlerAdapter    : [2a7a738e-7] Completed 200 OK, headers={masked}
2021-09-05 16:28:14.779 TRACE 1 --- [or-http-epoll-1] o.s.h.s.r.ReactorHttpHandlerAdapter      : [2a7a738e-7] Handling completed
2021-09-05 16:28:14.781 DEBUG 1 --- [or-http-epoll-4] r.netty.http.client.HttpClientConnect    : [id: 0x0c5a1b20, L:/1.2.15.231:56854 - R:microservice-name/1.8.15.171:8080] Handler is being applied: {uri=ws://microservice-name:8080/ui/gp/t/516/tzc151tm/websocket, method=GET}
2021-09-05 16:28:14.803 DEBUG 1 --- [or-http-epoll-4] r.n.http.client.HttpClientOperations     : [id: 0x0c5a1b20, L:/1.2.15.231:56854 - R:microservice-name/1.8.15.171:8080] Attempting to perform websocket handshake with ws://cloud-gateway.ob3dl-opa1-devel.svc.cluster.local:8889/ui/gp/t/516/tzc151tm/websocket
2021-09-05 16:28:14.828 DEBUG 1 --- [or-http-epoll-4] i.n.h.c.h.w.WebSocketClientHandshaker13  : WebSocket version 13 client handshake key: I YlMp qLtlj4iBhDlsBzg==, expected response: FK9mNuXf/KDCCE3Qyelp7dBdbZ8=
2021-09-05 16:28:14.891  WARN 1 --- [or-http-epoll-4] r.netty.http.client.HttpClientConnect    : [id: 0x0c5a1b20, L:/1.2.15.231:56854 - R:microservice-name/1.8.15.171:8080] The connection observed an error

io.netty.handler.codec.http.websocketx.WebSocketClientHandshakeException: Invalid handshake response getStatus: 502 Bad Gateway
    at io.netty.handler.codec.http.websocketx.WebSocketClientHandshaker13.verify(WebSocketClientHandshaker13.java:272) ~[netty-codec-http-4.1.54.Final.jar!/:4.1.54.Final]
    at io.netty.handler.codec.http.websocketx.WebSocketClientHandshaker.finishHandshake(WebSocketClientHandshaker.java:302) ~[netty-codec-http-4.1.54.Final.jar!/:4.1.54.Final]
    at reactor.netty.http.client.WebsocketClientOperations.onInboundNext(WebsocketClientOperations.java:116) ~[reactor-netty-0.9.21.RELEASE.jar!/:0.9.21.RELEASE]
    at reactor.netty.channel.ChannelOperationsHandler.channelRead(ChannelOperationsHandler.java:96) ~[reactor-netty-0.9.21.RELEASE.jar!/:0.9.21.RELEASE]
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379) ~[netty-transport-4.1.54.Final.jar!/:4.1.54.Final]
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365) ~[netty-transport-4.1.54.Final.jar!/:4.1.54.Final]
    at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357) ~[netty-transport-4.1.54.Final.jar!/:4.1.54.Final]
    at io.netty.handler.codec.MessageToMessageDecoder.channelRead(MessageToMessageDecoder.java:103) ~[netty-codec-4.1.54.Final.jar!/:4.1.54.Final]
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379) ~[netty-transport-4.1.54.Final.jar!/:4.1.54.Final]
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365) ~[netty-transport-4.1.54.Final.jar!/:4.1.54.Final]
    at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357) ~[netty-transport-4.1.54.Final.jar!/:4.1.54.Final]
    at io.netty.channel.CombinedChannelDuplexHandler$DelegatingChannelHandlerContext.fireChannelRead(CombinedChannelDuplexHandler.java:436) ~[netty-transport-4.1.54.Final.jar!/:4.1.54.Final]
    at io.netty.handler.codec.ByteToMessageDecoder.fireChannelRead(ByteToMessageDecoder.java:324) ~[netty-codec-4.1.54.Final.jar!/:4.1.54.Final]
    at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:296) ~[netty-codec-4.1.54.Final.jar!/:4.1.54.Final]
    at io.netty.channel.CombinedChannelDuplexHandler.channelRead(CombinedChannelDuplexHandler.java:251) ~[netty-transport-4.1.54.Final.jar!/:4.1.54.Final]
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379) ~[netty-transport-4.1.54.Final.jar!/:4.1.54.Final]
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365) ~[netty-transport-4.1.54.Final.jar!/:4.1.54.Final]
    at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357) ~[netty-transport-4.1.54.Final.jar!/:4.1.54.Final]
    at io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1410) ~[netty-transport-4.1.54.Final.jar!/:4.1.54.Final]
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379) ~[netty-transport-4.1.54.Final.jar!/:4.1.54.Final]
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365) ~[netty-transport-4.1.54.Final.jar!/:4.1.54.Final]
    at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:919) ~[netty-transport-4.1.54.Final.jar!/:4.1.54.Final]
    at io.netty.channel.epoll.AbstractEpollStreamChannel$EpollStreamUnsafe.epollInReady(AbstractEpollStreamChannel.java:795) ~[netty-transport-native-epoll-4.1.54.Final-linux-x86_64.jar!/:4.1.54.Final]
    at io.netty.channel.epoll.EpollEventLoop.processReady(EpollEventLoop.java:480) ~[netty-transport-native-epoll-4.1.54.Final-linux-x86_64.jar!/:4.1.54.Final]
    at io.netty.channel.epoll.EpollEventLoop.run(EpollEventLoop.java:378) ~[netty-transport-native-epoll-4.1.54.Final-linux-x86_64.jar!/:4.1.54.Final]
    at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:989) ~[netty-common-4.1.54.Final.jar!/:4.1.54.Final]
    at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74) ~[netty-common-4.1.54.Final.jar!/:4.1.54.Final]
    at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30) ~[netty-common-4.1.54.Final.jar!/:4.1.54.Final]
    at java.base/java.lang.Thread.run(Thread.java:834) ~[na:na]
 

Ответ Websocket. Вкладка «Сообщения» пуста

Комментарии:

1. у вас есть более одного бэкенда? Если это так, установите только одну реплику и посмотрите, работает ли она.

2. У нас есть только один сервер, одна копия.

3. ОК. это похоже на проблему, с которой мы столкнулись, когда веб-сайт устанавливал соединение, но у нас не была включена привязка к сеансу, поэтому следующий запрос не удался.