Al reemplazar eureka por naocs como centro de registro, la configuración es correcta, pero no se puede registrar el servicio

origen:

Debido a las siguientes razones, naocs se usa para reemplazar eureka

  1. Centro de configuración y registro de servicios unificados: Nacos proporciona una función de gestión de configuración y registro de servicios unificados, que puede integrar la gestión de configuración y registro de servicios en una plataforma. Esto simplifica la arquitectura del sistema y reduce el número de componentes dependientes.
  2. Gestión de configuración dinámica: Nacos proporciona una función de gestión de configuración dinámica, que puede modificar la información de configuración en tiempo real y notificar instancias de servicio sin reiniciar aplicaciones ni volver a implementar. Esto hace que las actualizaciones de configuración del sistema sean más convenientes y eficientes.

  3. Admite múltiples modos de registro: Nacos admite múltiples modos de registro, incluido el descubrimiento de servicios basado en DNS y el descubrimiento de servicios basado en RPC. Esto hace que Nacos sea más flexible en diferentes entornos de red y escenarios de aplicaciones.

  4. Actividad de la comunidad y tendencia de desarrollo: Nacos es un proyecto de código abierto de Alibaba y ha recibido una gran atención y contribuciones en la comunidad de código abierto. Cuenta con el apoyo activo de la comunidad y tendencias de rápido desarrollo.

composición del proyecto

  1. Dos contenedores nacos v2.2.0 iniciados en una sola instancia usando docker-compose
  2. El proyecto springboot introduce la dependencia nacos de la versión 2.2.0
  3. El proxy nginx realiza la carga de reenvío de dos puertos nacos

 proceso

Registro de errores del proyecto:

ERROR o.s.boot.SpringApplication.reportFailure(SpringApplication.java:826) - Application run failed
java.lang.reflect.UndeclaredThrowableException: null
        at org.springframework.util.ReflectionUtils.rethrowRuntimeException(ReflectionUtils.java:147)
        at com.alibaba.cloud.nacos.registry.NacosServiceRegistry.register(NacosServiceRegistry.java:73)
        at org.springframework.cloud.client.serviceregistry.AbstractAutoServiceRegistration.register(AbstractAutoServiceRegistration.java:239)
        at com.alibaba.cloud.nacos.registry.NacosAutoServiceRegistration.register(NacosAutoServiceRegistration.java:76)
        at org.springframework.cloud.client.serviceregistry.AbstractAutoServiceRegistration.start(AbstractAutoServiceRegistration.java:138)
        at org.springframework.cloud.client.serviceregistry.AbstractAutoServiceRegistration.bind(AbstractAutoServiceRegistration.java:101)
        at org.springframework.cloud.client.serviceregistry.AbstractAutoServiceRegistration.onApplicationEvent(AbstractAutoServiceRegistration.java:88)
        at org.springframework.cloud.client.serviceregistry.AbstractAutoServiceRegistration.onApplicationEvent(AbstractAutoServiceRegistration.java:47)
        at org.springframework.context.event.SimpleApplicationEventMulticaster.doInvokeListener(SimpleApplicationEventMulticaster.java:172)
        at org.springframework.context.event.SimpleApplicationEventMulticaster.invokeListener(SimpleApplicationEventMulticaster.java:165)
        at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:139)
        at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:403)
        at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:360)
        at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.finishRefresh(ServletWebServerApplicationContext.java:165)
        at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:553)
        at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:141)
        at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:747)
        at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:397)
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:315)
        at net.novelcomic.server.author.NcAuthorApplication.main(NcAuthorApplication.java:95)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:48)
        at org.springframework.boot.loader.Launcher.launch(Launcher.java:87)
        at org.springframework.boot.loader.Launcher.launch(Launcher.java:51)
        at org.springframework.boot.loader.JarLauncher.main(JarLauncher.java:52)
Caused by: com.alibaba.nacos.api.exception.NacosException: failed to req API:/api//nacos/v1/ns/instance after all servers([172.25.151.166:8848]) tried: <html><body><h1>Whitelabel Error Page</h1><p>This application has no explicit mapping for /error, so you are seeing this as a fallback.</p><div id='created'>Thu Jun 15 09:10:16 CST 2023</div><div>There was an unexpected error (type=Bad Request, status=400).</div><div>receive invalid redirect request from peer 172.19.0.2</div></body></html>
        at com.alibaba.nacos.client.naming.net.NamingProxy.reqAPI(NamingProxy.java:496)
        at com.alibaba.nacos.client.naming.net.NamingProxy.reqAPI(NamingProxy.java:401)
        at com.alibaba.nacos.client.naming.net.NamingProxy.reqAPI(NamingProxy.java:397)
        at com.alibaba.nacos.client.naming.net.NamingProxy.registerService(NamingProxy.java:212)
        at com.alibaba.nacos.client.naming.NacosNamingService.registerInstance(NacosNamingService.java:207)
        at com.alibaba.cloud.nacos.registry.NacosServiceRegistry.register(NacosServiceRegistry.java:64)
        ... 26 common frames omitted

- El problema es que la interfaz de acceso a nacos /api//nacos/v1/ns/instance reporta un error, las razones son las siguientes

  • La configuración de la instancia de registro de Nacos es incorrecta o no se puede acceder, puede intentar acceder curla la dirección con un comando o un navegador para confirmar si se puede acceder con normalidad.

  • La configuración de la ruta del centro de registro de Nacos es incorrecta. Verifique los elementos de configuración de Nacos en el proyecto Spring para asegurarse de que server-addrla configuración apunte correctamente a la dirección y el puerto de la instancia de Nacos.

  • La versión del registro de Nacos no es compatible con su proyecto Spring. Asegúrese de que la versión de Nacos utilizada sea compatible con la versión de Spring Cloud. Puede intentar actualizar o degradar la versión de Nacos, o consultar los documentos relacionados para confirmar la compatibilidad.

- He confirmado que no habrá problemas con el 2 y el 3, el problema está en el 1

[root@MT01 nc-author-service]# curl http://172.25.151.166:8848/nacos/v1/ns/instance?serviceName=nc-author-service
caused: Param 'ip' is required.

Al acceder /nacos/v1/ns/instancea la interfaz, se debe proporcionar el parámetro ip, ya que esta interfaz se utiliza para registrar información de la instancia de servicio en el registro de servicios de Nacos. ipEl parámetro especifica la dirección IP de la instancia de servicio registrada.

Pero estoy usando la nueva versión de nacos v2.x.

En versiones anteriores de Nacos (como las versiones v1.x), ipel parámetro es obligatorio porque se usa para identificar la dirección IP de la instancia que se va a registrar. Si no ipse proporciona ningún parámetro, aparecerá un error como "Param 'ip' is required".

Pero en la versión más nueva (como la versión v2.x), Nacos introduce la función de obtener automáticamente la dirección IP, incluso si no ipse proporciona ningún parámetro, la instancia se puede registrar correctamente. Nacos obtendrá automáticamente una dirección IP de acuerdo con la configuración de red del servidor y la utilizará para el registro. De esta forma, /nacos/v1/ns/instanceya no es necesario llevar manualmente ipel parámetro al acceder a la interfaz.

¡Aquí es donde radica el problema! ! !

Debido a que se usa el nacos iniciado por docker, la ip es la ip en el contenedor, por lo que no se puede registrar. Solo necesita dejar que la ip en el contenedor obtenga la ip de la máquina host.

solución

  1. Use el nombre de host en lugar de la dirección IP: al registrar una instancia de servicio, use el nombre de host como ipvalor del parámetro en lugar de la dirección IP específica. De esta forma, Nacos utilizará el nombre de host para identificar la dirección de red de la instancia de servicio.

  2. Configure la adquisición automática de direcciones IP: algunos marcos y componentes pueden obtener automáticamente la dirección IP local y registrarla en Nacos sin especificarla manualmente. Por ejemplo, en Spring Cloud spring-cloud-starter-alibaba-nacos-discoveryse puede configurar spring.cloud.inetutils.ignored-interfacespara ignorar la interfaz de red especificada, a fin de obtener automáticamente una dirección IP disponible y registrarse.

Use la primera solución para modificar nacos, network_mode: hosty port_bindingsno se puede usar al mismo tiempo, debe quitar los puertos

version: '3'
services:
  nacos-node1:
    image: nacos/nacos-server:v2.2.0
    container_name: nacos-node1
    environment:
      - PREFER_HOST_MODE=hostname
      - MODE=cluster
      - NACOS_SERVERS=nacos-node1:8848,nacos-node2:8848
      - JVM_XMS=512m
      - JVM_XMX=1024m
      - NACOS_SERVER_IP=你的私网ip
    restart: always
    volumes:
      - /data/nacos/conf/application.properties:/home/nacos/conf/application.properties
      - /data/nacos/logs/8847:/home/nacos/logs
    network_mode: host

  nacos-node2:
    image: nacos/nacos-server:v2.2.0
    container_name: nacos-node2
    environment:
      - PREFER_HOST_MODE=hostname
      - MODE=cluster
      - NACOS_SERVERS=nacos-node1:8848,nacos-node2:8848
      - JVM_XMS=512m
      - JVM_XMX=1024m
      - NACOS_SERVER_IP=你的私网ip
    restart: always
    volumes:
      - /data/nacos/conf/application1.properties:/home/nacos/conf/application.properties
      - /data/nacos/logs/8849:/home/nacos/logs
    network_mode: host

Supongo que te gusta

Origin blog.csdn.net/weixin_43820024/article/details/131221441
Recomendado
Clasificación