[Spring Cloud] Código fuente del proceso del servicio de registro del servidor de registro de Nacos

1. Manejo de solicitudes de clientes

Buscar controlador de instancia

@RequestMapping(UtilsAndCommons.NACOS_NAMING_CONTEXT + "/instance")

imagen-20220403201854097

imagen-20220403225439877

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

imagen-20220403202018706

ver método de controlador

imagen-20220403202126755

Acérquese y obtenga primero el namespaceId y el serviceName

imagen-20220403211359081

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

imagen-20220403211543798

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

imagen-20220403211736900

Primero llame a createEmptyService para crear una estructura de servicio vacía en el registro

Seguimiento del método createServiceIfAbsent

imagen-20220403211850798

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

imagen-20220403212012868

Ven a putServiceAndInit(servicio)

imagen-20220403212208988

seguir

imagen-20220403212312468

`mapa de doble capa serviceMap

imagen-20220403212330991

Mire los datos de serviceMap después de ejecutar putService

imagen-20220403212509535

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

imagen-20220403213220448

3. Comprobación del latido de la instancia de servicio

Volver al método putServiceAndInit

Luego ejecute el método service.init()

imagen-20220403213346275

Acceda al método com.alibaba.nacos.naming.core.Service.init

imagen-20220403213427424

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

imagen-20220403213506026

tarea de hilo

com.alibaba.nacos.naming.healthcheck.ClientBeatCheckTask.run()

imagen-20220403214111904

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

imagen-20220403215331621

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);

imagen-20220403215727082

Vaya al método de consistenciaService.put(clave, instancias)

来到 com.alibaba.nacos.naming.consistency.ephemeral.distro.DistroConsistencyServiceImpl.put

imagen-20220403215853870

`El valor de registro es la encarnación de Instancias que encapsula Instancias Instancias Instancias heredan Polimorfismo de registro

imagen-20220403215936351

Seguimiento del método onPut

Ven al método com.alibaba.nacos.naming.consistency.ephemeral.distro.DistroConsistencyServiceImpl.onPut

imagen-20220403220259020

Otro nuevo objeto de Datum, el valor de Datum es la clave Instances es la clave de instancia generada anteriormente

imagen-20220403220335697

Luego arroje el Datum en el mapa del DataStore

imagen-20220403220530440

Finalmente llame al método notifier.addTask para seguir con el método addTask

imagen-20220403220713239

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.offerarroja 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.

imagen-20220403221239669

`Notifier también es una clase de tarea de subprocesos, así que echemos un vistazo a sus tareas de subprocesos

imagen-20220403221332029

Obtenga la clave de datos de la cola y llame al método de manejo

imagen-20220403221711873

Llegue a un punto de interrupción, mire el flujo de ejecución y vuelva a registrar el servicio

ven a listener.onChange

imagen-20220403221823581

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

imagen-20220403221940620

Luego llame al método updateIPs para realizar un seguimiento.

Se me ocurrió un nuevo ipMap y muchos mapas

imagen-20220403222121424

iterar sobre todas las instancias

imagen-20220403222745703

Agregar a IP de clúster

Ir al siguiente para atravesar

imagen-20220403222856196

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

imagen-20220403223050216

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.

imagen-20220403223554758

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

Supongo que te gusta

Origin blog.csdn.net/JAVAlife2021/article/details/123946613
Recomendado
Clasificación