envoy websockets per route configuratie, JavaScript test opzet

In mijn artikel van gisteren besprak ik de configuratie en test van envoy voor het proxen van websockets ...op de lange duur.

Vandaag wil ik daar nog wat aan toevoegen.

juiste syntax voor websocket upgrade per route

U kunt websocket upgrade per route inschakelen. U hoeft het niet globaal toe te voegen:

- naam: envoy.http_connection_manager
    config:
      #upgrade_configs:
      # - upgrade_type: websocket
      stat_prefix: ingress_https
      use_remote_address: true
      xff_num_trusted_hops: 0
      route_config:
        virtual_hosts:
        - naam: picockpit_withport
          domeinen: ["picockpit.local:443"]
          routes:
            - match: { prefix: "/mqtt/webclient" }
              route:
                cluster: target_dwebsocket
                upgrade_configs:
                  - upgrade_type: "websocket"
                    ingeschakeld: waar
            - match: {prefix: "/"}
              route: {cluster: doel_picockpit}

Merk op dat ik besloten heb om de configuratie te spiegelen inclusief de poort, en zonder - voor het geval dat:

- naam: picockpit
   domeinen: ["picockpit.local"]
   routes:
     - match: { prefix: "/mqtt/webclient" }
       route:
         cluster: target_dwebsocket
         upgrade_configs:
           - upgrade_type: "websocket"
             ingeschakeld: waar
     - match: {prefix: "/"}
       route: {cluster: doel_picockpit}

Zie hieronder (Update 3) voor het combineren van beide in een enkele stanza, wat eleganter is, en Update 2 voor mijn twijfels over het feit dat de port notatie nodig is voor de JavaScript client.

Standaard wereldwijd ingeschakeld?

Merk op dat de documentatie van de gezant lijkt te impliceren dat websocket-upgrades standaard wereldwijd zijn ingeschakeld. Ik heb dit niet getest.

Misschien hoeft u alleen het domein op te geven waaronder de haven, zoals besproken in mijn artikelom websocketverbindingen te laten werken.

Javascript test

Een eenvoudige JavaScript test client zou er zo uit zien:

functie connect(){
     console.log("Opbouw websocket");
     var socket = new WebSocket("wss://key:[email protected]/mqtt/webclient");
     socket.onerror = function(event){
         console.log("er is een fout opgetreden");
         console.log(event);
     }

    socket.onopen = function(){
         console.log("Socket is geopend.");
         console.log('Socket status: '+ socket.readyState);
         socket.send("Hallo server!");
     }
     socket.onmessage = function(msg){
         console.log("bericht ontvangen");
         console.log(msg);
     }
     console.log("Beëindigd met eerste websocket");
}

connect();

In combinatie met mijn andere posten de eenvoudige websocket echo client, zou je een "Hallo server!" als bericht terug krijgen:

afbeelding

Update 2

Het lijkt erop dat de JavaScript client de domain:port authority syntax niet gebruikt. Daarom is de eerste stanza waarschijnlijk niet nodig

afbeelding

Dit zou genoeg moeten zijn, dan:

- naam: picockpit
  domeinen: ["picockpit.local"]
  routes:
    - match: { prefix: "/mqtt/webclient" }
      route:
        cluster: target_dwebsocket
        upgrade_configs:
          - upgrade_type: "websocket"
            ingeschakeld: waar
     - match: {prefix: "/"}
       route: {cluster: doel_picockpit}

Update 3

De eenvoudigste manier is waarschijnlijk om gewoon overeen te komen voor beide domein variaties en dezelfde code te hebben:

- naam: envoy.http_connection_manager
   config:
     #upgrade_configs:
     # - upgrade_type: websocket
     stat_prefix: ingress_https
     use_remote_address: true
     xff_num_trusted_hops: 0
     route_config:
       virtual_hosts:
       - naam: picockpit_withport
        domeinen: ["picockpit.local:443", "picockpit.local"]
         routes:
           #- match: { prefix: "/mqtt/webclient" }
           - match: { prefix: "/mqtt" }
             route:
               cluster: target_dwebsocket
               upgrade_configs:
                 - upgrade_type: "websocket"
                   ingeschakeld: waar
           - match: {prefix: "/"}
             route: {cluster: doel_picockpit}