Esencia
Tengo una aplicación que se ejecuta en una arquitectura basada en microservicios (en Kubernetes). Toda la comunicación hacia / desde fuera de la aplicación ocurre a través de un API Gateway .
Lo que significa que las solicitudes de mi interfaz no van directamente a los servicios, sino que tienen que pasar por el Gateway.
Motivo
Ahora necesito implementar una función que requiera comunicación en tiempo real entre la interfaz y un servicio interno. Pero como el servicio interno no está expuesto al exterior, necesito una forma de "enrutar" los datos en tiempo real a través de la puerta de enlace.
Todos mis servicios se ejecutan en Node.js, por lo que quiero usar Socket.IO para implementar la comunicación en tiempo real.
Problema
Pero, ¿cómo implementar la flecha doble púrpura del boceto?
Por lo general, el cliente frontend se conectaría al servidor donde se ejecuta Socket.IO. Pero en mi caso, este servidor (el servidor de funciones en tiempo real) no es accesible desde el cliente (y nunca debería serlo), lo que significa que el cliente tiene que conectarse a la puerta de enlace. Por lo tanto, el Gateway necesita implementar algún mecanismo para enrutar todos los mensajes entrantes al servicio en tiempo real y viceversa.
Ideas
(1) Haga que un segundo servidor HTTP escuche eventos en el Gateway y emita esos eventos al servidor en tiempo real. En la otra dirección, el servidor en tiempo real emitirá eventos a la puerta de enlace, que luego los emitirá a la interfaz. Creo que este enfoque definitivamente funcionará, pero parece redundante emitir todo dos veces. ¿Y definitivamente dañaría el rendimiento?
(2) Use un adaptador Socket.IO para " pasar el evento entre nodos ", lo que parece ser el camino correcto porque se usa para "pasar mensajes entre procesos o computadoras". Pero tengo problemas para comenzar debido a la falta de documentación / ejemplos. Tampoco estoy usando Redis (¿es necesario usar el adaptador?)
(3) Use el paquete socket.io-emitter , que no parece ser una buena opción ya que la última confirmación fue de hace 3 años.
(4) ¿Algo más?
fuente
ingress-controller
k8s envía elsocket
tráfico al servicio de fútbol.nginx
como controlador de ingreso. También puede usar haproxy si lo prefiere. Tendrá 2 servicios (implementación) 1 para administrar las solicitudes HTTP (s) y 1 para administrar las solicitudes de socket. Con el ingreso, puede exponer la ruta y redirigir el tráfico al servicio adecuado, por ejemplo, cada solicitud que/socket
se redirija a lasocket-service
aplicación.Respuestas:
Bien, básicamente diseñé la aplicación así
Ingreso
Servicio
Luego crea su implementación para implementar el servicio ws. De esta manera, también puede activar k8s HPA (escalado automático de pod horizontal) para ampliar el servicio socket.io. Debe cambiar las anotaciones y otras opciones en función de su versión de k8s (creo que la anotación
service.beta.kubernetes.io/external-traffic: "OnlyLocal"
ha quedado en desuso).fuente
socket-service
y lo agregaría al Ingress?Como el servicio interno no está expuesto al exterior, recomiendo usar un túnel. ngrok es un comando para una URL instantánea y segura a su servidor localhost a través de cualquier NAT o firewall. Si su servidor expone el servicio de socket a través de un determinado puerto, use ngrok para crear un proxy inverso para exponer el mundo con el que puede conectarse a su aplicación frontend. Usar este comando es muy simple, aquí hay un ejemplo de cómo usarlo:
Simplemente ejecute las siguientes instrucciones para que funcione
./ngrok http 3000
Para hacerlo permanente, debe crear un servicio y usar un archivo ngrok.yml para la mejor configuración.
Aquí está la documentación oficial. Aquí
fuente