websockets di envoy per configurazione delle rotte, impostazione del test JavaScript

Nel mio articolo di ieri ho discusso il configurazione e test di envoy per il proxy dei websockets a lungo.

Oggi vorrei aggiungere alcune informazioni supplementari.

sintassi corretta per l'aggiornamento del websocket per rotta

Potete abilitare l'aggiornamento del websocket per ogni rotta. Non c'è bisogno di aggiungerlo globalmente:

- nome: envoy.http_connection_manager
    config:
      #upgrade_configs:
      # - upgrade_type: websocket
      prefisso statico: ingress_https
      indirizzo_remoto: vero
      xff_num_trusted_hops: 0
      route_config:
        virtual_hosts:
        - nome: picockpit_withport
          domini: ["picockpit.local:443"]
          percorsi:
            - match: { prefix: "/mqtt/webclient" }
              percorso:
                cluster: target_dwebsocket
                upgrade_configs:
                  - tipo_di_aggiornamento: "websocket"
                    abilitato: vero
            - match: {prefisso: "/"}
              percorso: {cluster: target_picockpit}

Notate che ho deciso di fare un mirroring della configurazione includendo la porta, e senza - per sicurezza:

- nome: picockpit
   domini: ["picockpit.local"]
   percorsi:
     - match: { prefix: "/mqtt/webclient" }
       percorso:
         cluster: target_dwebsocket
         upgrade_configs:
           - tipo_di_aggiornamento: "websocket"
             abilitato: vero
     - match: {prefisso: "/"}
       percorso: {cluster: target_picockpit}

Si prega di vedere sotto (Update 3) per combinare entrambi in una singola stanza, che è più elegante, e Update 2 per i miei dubbi sul fatto che la notazione della porta sia necessaria per il client JavaScript.

Abilitato globalmente per default?

Si prega di notare che la documentazione di envoy sembra implicare che gli aggiornamenti dei websocket siano abilitati di default a livello globale. Non ho testato questo.

Forse hai solo bisogno di specificare il dominio compreso il porto, come discusso nel mio articoloper far funzionare le connessioni websocket.

Test Javascript

Un semplice client di prova JavaScript sarebbe come questo:

funzione connect(){
     console.log("Building up websocket");
     var socket = nuovo WebSocket("wss://key:[email protected]/mqtt/webclient");
     socket.onerror = function(event){
         console.log("è stato riscontrato un errore");
         console.log(evento);
     }

    socket.onopen = function(){
         console.log("La presa è stata aperta");
         console.log('Stato della presa: '+ socket.readyState);
         socket.send("Ciao server!");
     }
     socket.onmessage = function(msg){
         console.log("messaggio ricevuto");
         console.log(msg);
     }
     console.log("Finito con il primo websocket");
}

connect();

In combinazione con l'altro mio poste il semplice client websocket echo, si otterrebbe un "Ciao server!" come messaggio:

immagine

Aggiornamento 2

Sembra che il client JavaScript non stia usando la sintassi di autorità dominio:porta. Quindi la prima stanza probabilmente non è necessaria

immagine

Questo dovrebbe essere sufficiente, allora:

- nome: picockpit
  domini: ["picockpit.local"]
  percorsi:
    - match: { prefix: "/mqtt/webclient" }
      percorso:
        cluster: target_dwebsocket
        upgrade_configs:
          - tipo_di_aggiornamento: "websocket"
            abilitato: vero
     - match: {prefisso: "/"}
       percorso: {cluster: target_picockpit}

Aggiornamento 3

Il modo più semplice è probabilmente solo la corrispondenza per entrambe le varianti di dominio e avere lo stesso codice:

- nome: envoy.http_connection_manager
   config:
     #upgrade_configs:
     # - upgrade_type: websocket
     prefisso statico: ingress_https
     indirizzo_remoto: vero
     xff_num_trusted_hops: 0
     route_config:
       virtual_hosts:
       - nome: picockpit_withport
        domini: ["picockpit.local:443", "picockpit.local"]
         percorsi:
           #- match: { prefix: "/mqtt/webclient" }
           - match: { prefix: "/mqtt" }
             percorso:
               cluster: target_dwebsocket
               upgrade_configs:
                 - tipo_di_aggiornamento: "websocket"
                   abilitato: vero
           - match: {prefisso: "/"}
             percorso: {cluster: target_picockpit}