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:
Update 2
Het lijkt erop dat de JavaScript client de domain:port authority syntax niet gebruikt. Daarom is de eerste stanza waarschijnlijk niet nodig
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}