images - Utilice Eureka a pesar de tener un puerto externo aleatorio de contenedores docker
docker run (2)
Puede configurar un directorio para cada instancia de la ventana acoplable y compartirlo entre el host y la instancia y luego escribir el puerto y la dirección IP en un archivo en ese directorio.
$ instanceName=$(generate random instance name)
$ dirName=/var/lib/docker/metadata/$instanceName
$ mkdir -p $dirName
$ docker run -name $instanceName -v ${dirName}:/mnt/metadata ...
$ echo $(get port number and host IP) > ${dirName}/external-address
Luego, acaba de leer / mnt / metadata / external-address desde su aplicación y usa esa información con Eureka.
Estoy escribiendo una aplicación que se compone de unos pocos microservicios basados en arranque con un proxy inverso basado en zuul en la parte frontal
Funciona cuando inicio los servicios en mi máquina, pero para la implementación del servidor me gustaría usar la ventana acoplable para los servicios, pero parece que esto no es posible en este momento.
Normalmente, tendría un puerto "interno" fijo y puertos aleatorios en el exterior del contenedor. Pero la aplicación en el contenedor no conoce el puerto exterior (e IP).
Las herramientas de Netflix coinciden con lo que me gustaría escribir una arquitectura de microservicio eficiente y, conceptualmente, me gusta mucho la ventana acoplable. Por lo que puedo ver, sería muy molesto iniciar el contenedor, reunir el puerto externo en el host y pasarlo a la aplicación, porque no puede simplemente cambiar el puerto después de que se inicie la aplicación.
¿Hay alguna forma de usar eureka con clientes basados en ventana acoplable?
[Actualización] Supongo que hice un mal trabajo explicando el problema. Así que tal vez esto lo aclare un poco más:
El servidor eureka puede ejecutarse en la ventana acoplable, ya que solo tengo uno y el puerto externo no importa. Puedo usar la función de enlace para acceder desde los clientes.
El problema es la URL con la que se registran los clientes. Esto es, por ejemplo, https://localhost:8080/ pero debido a la asignación dinámica de puertos, solo se puede acceder a través de https://localhost:54321/
Así que eureka devolverá la URL incorrecta para los servicios.
ACTUALIZACIÓN He actualizado mi respuesta a continuación, así que eche un vistazo allí.
Yo mismo he encontrado una solución, que tal vez no sea la mejor solución, pero me queda ...
Cuando inicia la ventana acoplable con "--net = host" (red de host), entonces utiliza la pila de red de hosts directamente. Luego, solo uso 0 como puerto para spring-boot y spring aleatoriza el puerto para mí y, al usar la pila de redes del host, no hay traducción a un puerto diferente (e IP).
Sin embargo, hay algunos inconvenientes:
- Cuando utiliza la red de host, no puede usar la función de enlace para estos contenedores como origen de enlace o destino.
- El uso de la pila de red del host lleva a una menor encapsulación de la instancia, lo que puede ser un problema dependiendo de su proyecto.
Espero que ayude
Ha pasado mucho tiempo y creo que debería explicarlo un poco más:
Si usa la ventana acoplable para alojar su aplicación Spring, ¡no use un puerto aleatorio! Use un puerto fijo porque cada contenedor tiene su propia IP de todos modos, por lo que cada servicio puede usar el mismo puerto. Esto hace la vida mucho más fácil.
Si tiene un servicio público, entonces usaría un puerto fijo de todos modos.
Para los inicios locales a través de maven o, por ejemplo, la línea de comandos tiene un perfil dedicado que utiliza puertos aleatorios para que no tenga conflictos (pero tenga en cuenta que hay o ha habido algunos errores relacionados con los puertos aleatorios y el registro del servicio)
Si por alguna razón quiere o necesita usar una red de host, puede usar puertos aleatorios, por supuesto, ¡pero la mayoría de las veces no debería!