Essência
Eu tenho um aplicativo que é executado em uma arquitetura baseada em microsserviço (no Kubernetes). Toda a comunicação de / para fora do aplicativo ocorre através de um API Gateway .
O que significa apenas que solicitações do meu front-end não vão diretamente para os serviços, mas precisam passar pelo Gateway.
Motivo
Agora preciso implementar um recurso que exija comunicação em tempo real entre o frontend e um serviço interno. Mas como o serviço interno não é exposto ao exterior, preciso de uma maneira de "rotear" os dados em tempo real através do Gateway.
Todos os meus serviços estão em execução no Node.js, motivo pelo qual desejo usar o Socket.IO para implementar a comunicação em tempo real.
Questão
Mas como implementar a seta dupla roxa do esboço?
Geralmente, o cliente front-end se conecta ao servidor em que o Socket.IO está sendo executado. Mas, no meu caso, esse servidor (o servidor de recursos em tempo real) não pode ser acessado pelo cliente (e nunca deveria estar), o que significa que o cliente precisa se conectar ao Gateway. Portanto, o Gateway precisa implementar algum mecanismo para rotear todas as mensagens recebidas para o serviço em tempo real e vice-versa.
Ideias
(1) Tenha um segundo servidor HTTP escutando eventos no Gateway e emita esses eventos para o servidor em tempo real. Na outra direção, o servidor em tempo real emitirá eventos para o Gateway, que os emitirão para o frontend. Eu acho que essa abordagem definitivamente funcionará, mas parece redundante emitir tudo duas vezes. E isso definitivamente prejudicaria o desempenho?
(2) Use um adaptador Socket.IO para " passar evento entre nós ", o que parece ser o caminho certo, pois é usado para "transmitir mensagens entre processos ou computadores". Mas tenho problemas para começar devido à falta de documentação / exemplos. Também não estou usando Redis (é necessário usar o adaptador?)
(3) Use o pacote socket.io-emitter , que não parece ser uma boa opção, já que o último commit foi de 3 anos atrás.
(4) Algo mais?
fonte
ingress-controller
k8s envia osocket
tráfego para o serviço de futebol.nginx
como um controlador de entrada. Você também pode usar haproxy, se preferir. Você terá 2 serviços (implantação) 1 para gerenciar solicitações HTTP (s) e 1 para gerenciar solicitações de soquete. Usando o ingresso, você pode expor o caminho e redirecionar o tráfego para o serviço certo, por exemplo, toda solicitação atingida/socket
será redirecionada para osocket-service
aplicativo.Respostas:
Tudo bem, basicamente eu projetei o aplicativo assim
Entrada
Serviço
Em seguida, você cria sua implementação para implantar o serviço ws. Assim, você também pode ativar o k8s HPA (escalonamento automático do pod horizontal) para ampliar o serviço socket.io. Você deve alterar as anotações e outras opções com base na sua versão do k8s (acho que a anotação
service.beta.kubernetes.io/external-traffic: "OnlyLocal"
foi descontinuada).fonte
socket-service
e o acrescentaria ao Ingress?Como o serviço interno não é exposto ao exterior, recomendo usar um túnel. ngrok é um comando para uma URL instantânea e segura para o servidor localhost através de qualquer NAT ou firewall. Se o seu servidor expuser o serviço de soquete através de uma determinada porta, use o ngrok para criar um proxy reverso para expor o mundo com o qual você pode se conectar ao seu aplicativo de front-end. Usando este comando é muito simples, aqui está um exemplo de como usá-lo:
Basta executar as seguintes instruções para fazê-lo funcionar
./ngrok http 3000
Para torná-lo permanente, você deve criar um serviço e usar um arquivo ngrok.yml para obter a melhor configuração.
Aqui está a documentação oficial Aqui
fonte