1. Manejo de solicitudes de clientes
Buscar controlador de instancia
@RequestMapping(UtilsAndCommons.NACOS_NAMING_CONTEXT + "/instance")
Esta dirección es la dirección de nuestro servicio de registro de servicio al cliente. El proceso de registro del servicio de servicio al cliente se puede ver en esta publicación de blog [Spring Cloud] Código fuente del proceso de registro del servicio Nacos_Autumn Sunset Blog-CSDN Blog
ver método de controlador
Acérquese y obtenga primero el namespaceId y el serviceName
Espacio de nombres predeterminado: público
Grupo: DEFAULT_GROUP@@ + el nombre del servicio registrado por el cliente
El objeto de instancia de análisis encapsula los parámetros del proveedor de servicios
A continuación, registre el servicio y llame al método registerInstance
serviceManager.registerInstance(namespaceId, serviceName, instance);
seguir
com.alibaba.nacos.naming.core.ServiceManager. registroInstancia
2. Registrar la instancia
com.alibaba.nacos.naming.core.ServiceManager. registroInstancia
Primero llame a createEmptyService para crear una estructura de servicio vacía en el registro
Seguimiento del método createServiceIfAbsent
La primera vez que ingrese a Service service = getService(namespaceId, serviceName) debe ser nulo
Ingrese la lógica si
Creó un nuevo objeto de servicio para establecer el nombre del servicio, el espacio de nombres, el nombre del grupo para registrar la hora de modificación
Ven a putServiceAndInit(servicio)
seguir
`mapa de doble capa serviceMap
Mire los datos de serviceMap después de ejecutar putService
La clave del mapa externo es el valor del espacio de nombres y también un mapa, la clave del mapa interno es el nombre del grupo y el valor del nombre del grupo es el objeto de servicio
3. Comprobación del latido de la instancia de servicio
Volver al método putServiceAndInit
Luego ejecute el método service.init()
Acceda al método com.alibaba.nacos.naming.core.Service.init
Ejecute una tarea programada después de los primeros 5 segundos y luego ejecútela cada 5 segundos para ver qué tarea de seguimiento es cuando se ejecuta la tarea del subproceso
tarea de hilo
com.alibaba.nacos.naming.healthcheck.ClientBeatCheckTask.run()
El valor de `instance.getInstanceHeartBeatTimeOut() es de 15 segundos
Si el tiempo actual menos el tiempo del último latido de la instancia es superior a 15 segundos, ingrese el juicio if y establezca el estado de salud en falso
Es decir, HealthCheckReactor.scheduleCheck(clientBeatCheckTask) habilita un latido para detectar el estado de salud de todas las instancias. Una vez que el tiempo desde la última detección de latido supera los 15 s, el estado de salud se establece en falso
4. Envía un mensaje a la cola
Volver al método registerInstance
Continúe mirando addInstance(namespaceId, serviceName, instance.isEphemeral(), instance)
Seguimiento de com.alibaba.nacos.naming.core.ServiceManager.addInstance
Primero genere un valor de clave de instancia com.alibaba.nacos.naming.iplist.ephemeral.public##DEFAULT_GROUP@@nacos-test
String key = KeyBuilder.buildInstanceListKey(namespaceId, serviceName, ephemeral);
Generar una colección de instancias
List<Instance> instanceList = addIpAddresses(service, ephemeral, ips)
Las nuevas instancias encapsulan los datos de la colección.
Instances instances = new Instances();
instances.setInstanceList(instanceList);
Vaya al método de consistenciaService.put(clave, instancias)
来到 com.alibaba.nacos.naming.consistency.ephemeral.distro.DistroConsistencyServiceImpl.put
`El valor de registro es la encarnación de Instancias que encapsula Instancias Instancias Instancias heredan Polimorfismo de registro
Seguimiento del método onPut
Ven al método com.alibaba.nacos.naming.consistency.ephemeral.distro.DistroConsistencyServiceImpl.onPut
Otro nuevo objeto de Datum, el valor de Datum es la clave Instances es la clave de instancia generada anteriormente
Luego arroje el Datum en el mapa del DataStore
Finalmente llame al método notifier.addTask para seguir con el método addTask
Poner la clave en los servicios es el valor datumKey es una cadena vacía
private ConcurrentHashMap<String, String> services = new ConcurrentHashMap<>(10 * 1024)
Finalmente, la llamada task.offer
arroja la clave y la acción ejecutada a la cola de memoria y devuelve nulo.El método ha terminado.
¿La dificultad está aquí?
5. Escuche la cola y saque la nueva instancia de servicio
Echemos un vistazo a la clase a la que pertenece esta tarea.
`Notifier también es una clase de tarea de subprocesos, así que echemos un vistazo a sus tareas de subprocesos
Obtenga la clave de datos de la cola y llame al método de manejo
Llegue a un punto de interrupción, mire el flujo de ejecución y vuelva a registrar el servicio
ven a listener.onChange
Uno de los dos parámetros del método onChange es datumKey y el otro es Instances
Se puede ver que la colección de instancias de servicio se extrae del almacén de datos a través de datumKey.
Seguimiento del método com.alibaba.nacos.naming.core.Service.onChange
Atraviese todas las instancias de instancia para establecer pesos razonables
Luego llame al método updateIPs para realizar un seguimiento.
Se me ocurrió un nuevo ipMap y muchos mapas
iterar sobre todas las instancias
Agregar a IP de clúster
Ir al siguiente para atravesar
Llame a clusterMap.get(entry.getKey()).updateIps(entryIPs, ephemeral) para obtener el clúster y llamar al método updateIps
Ven a com.alibaba.nacos.naming.core.Cluster.updateIps
6. Copia en escritura, registre una nueva instancia de servicio en el registro
efímero Si el parámetro pasado en el método anterior es verdadero, entonces asigne el valor de ephemeralInstances a Set toUpdateInstances
Set<Instance> toUpdateInstances = ephemeral ? ephemeralInstances : persistentInstances;
Entonces, ¿qué son estas instancias efímeras?
Es el antiguo conjunto de instancias de servicio de almacenamiento en clúster.
private Set<Instance> ephemeralInstances = new HashSet<>();
Asigne el conjunto de instancias anterior a toUpdateInstances. El siguiente paso es operar la instancia de servicio recién registrada y, finalmente, asignar todas las instancias más recientes a toUpdateInstances.
Luego asigne el valor de toUpdateInstances a ephemeralInstances.En este punto, se registra una nueva instancia de servicio.
Esta es una idea de copia en escritura, copie una instancia de servicio registrada, opere los datos copiados y luego reemplace los datos antiguos originales con los datos copiados una vez que se complete la operación.
El propósito es resolver el conflicto de concurrencia.Durante el proceso de escritura, otros subprocesos leen los datos antiguos y luego actualizan los datos una vez que se completa la escritura real. Los datos sucios no se leerán. Asegúrese de que todas las instancias de servicio leídas estén disponibles