websockets envoy por configuração de rota, configuração de teste JavaScript

No meu artigo de ontem discuti o configuração & teste de enviado para proxy de websockets em profundidade.

Hoje eu gostaria de acrescentar algumas informações adicionais.

sintaxe correta para atualização do websocket por rota

Você pode habilitar a atualização do websocket por rota. Não há necessidade de adicioná-lo globalmente:

- nome: envoy.http_connection_manager
    configurar:
      #upgrade_configs:
      # - upgrade_type: websocket
      stat_prefix: ingresso_https
      use_remote_address: true
      xff_num_trusted_hops: 0
      route_config:
        virtual_hosts:
        - nome: picockpit_withport
          domínios: ["picockpit.local:443"]
          rotas:
            - ...partida: Prefixo: "/mqtt/webclient" }
              rota:
                cluster: target_dwebsocket
                upgrade_configs:
                  - upgrade_type: "websocket"
                    habilitado: true
            - ...partida: Prefixar: “/”}
              rota: {cluster: target_picockpit}

Por favor note que decidi espelhar a configuração incluindo a porta, e sem - só por precaução:

- nome: picockpit
   domínios: ["picockpit.local"]
   rotas:
     - ...partida: Prefixo: "/mqtt/webclient" }
       rota:
         cluster: target_dwebsocket
         upgrade_configs:
           - upgrade_type: "websocket"
             habilitado: true
     - ...partida: Prefixar: “/”}
       rota: {cluster: target_picockpit}

Veja abaixo (Atualização 3) para combinar ambos em uma única estrofe, que é mais elegante, e Atualização 2 para minhas dúvidas sobre a notação de porta sendo necessária para o cliente JavaScript.

Ativado globalmente por padrão?

Por favor, note que a documentação do enviado parece implicar que as actualizações do websocket estão activadas por defeito a nível global. Eu não testei isto.

Talvez você só precise de especificar o domínio incluindo o porto, como discutido no meu artigopara conexões websocket ao trabalho.

teste de Javascript

Um simples cliente de teste JavaScript teria este aspecto:

function connect(){
     console.log("Building up websocket");
     var socket = novo WebSocket("wss://key:[email protected]/mqtt/webclient");
     socket.onerror = function(event){
         console.log("um erro foi encontrado");
         console.log(evento);
     }

    socket.onopen = function(){
         console.log("A tomada foi aberta.");
         console.log('Socket Status: '+ socket.readyState);
         socket.send("Olá servidor!");
     }
     socket.onmessage = function(msg){
         console.log("mensagem recebida");
         console.log(msg);
     }
     console.log("Terminado com o primeiro websocket");
}

connect();

Em combinação com o meu outro postoe o simples cliente websocket echo, você receberia um "Hello server!" de volta como uma mensagem:

imagem

Atualização 2

Parece que o cliente JavaScript não está usando a sintaxe domain:port authority. Portanto, a primeira estrofe provavelmente não é necessária

imagem

Isto deve ser suficiente, então:

- nome: picockpit
  domínios: ["picockpit.local"]
  rotas:
    - ...partida: Prefixo: "/mqtt/webclient" }
      rota:
        cluster: target_dwebsocket
        upgrade_configs:
          - upgrade_type: "websocket"
            habilitado: true
     - ...partida: Prefixar: “/”}
       rota: {cluster: target_picockpit}

Atualização 3

A maneira mais simples é provavelmente combinar para ambas as variações de domínio e ter o mesmo código:

- nome: envoy.http_connection_manager
   configurar:
     #upgrade_configs:
     # - upgrade_type: websocket
     stat_prefix: ingresso_https
     use_remote_address: true
     xff_num_trusted_hops: 0
     route_config:
       virtual_hosts:
       - nome: picockpit_withport
        domínios: ["picockpit.local:443", "picockpit.local"]
         rotas:
           #- partida: { prefixo: "/mqtt/webclient" }
           - ...partida: Prefixo: "/mqtt" }
             rota:
               cluster: target_dwebsocket
               upgrade_configs:
                 - upgrade_type: "websocket"
                   habilitado: true
           - ...partida: Prefixar: “/”}
             rota: {cluster: target_picockpit}