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:
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
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}