[Spring Cloud] Code source du processus du service d'enregistrement du serveur de registre Nacos

1. Traitement des demandes des clients

Trouver un contrôleur d'instance

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

image-20220403201854097

image-20220403225439877

Cette adresse est l'adresse de notre service d'inscription au service client. Le processus d'inscription du service client peut être vu dans cet article de blog [Spring Cloud] Code source du processus d'inscription au service Nacos_Autumn Sunset Blog-CSDN Blog

image-20220403202018706

voir la méthode du contrôleur

image-20220403202126755

Montez et obtenez d'abord le namespaceId et le serviceName

image-20220403211359081

Espace de noms par défaut : public

Groupe : DEFAULT_GROUP@@ + le nom du service enregistré par le client

L'objet d'instance d'analyse encapsule les paramètres du fournisseur de services

image-20220403211543798

Enregistrez ensuite le service et appelez la méthode registerInstance

serviceManager.registerInstance(namespaceId, serviceName, instance);

suivi

com.alibaba.nacos.naming.core.ServiceManager. registerInstance

2. Enregistrez l'instance

com.alibaba.nacos.naming.core.ServiceManager. registerInstance

image-20220403211736900

Appelez d'abord createEmptyService pour créer une structure de service vide dans le registre

Suivi de la méthode createServiceIfAbsent

image-20220403211850798

La première fois que vous entrez dans Service service = getService(namespaceId, serviceName) doit être nul

Entrez la logique if

Création d'un nouvel objet de service pour définir le nom du service, l'espace de noms, le nom du groupe pour enregistrer l'heure de modification

image-20220403212012868

Venez à putServiceAndInit(service)

image-20220403212208988

suivi

image-20220403212312468

`serviceMap carte double couche

image-20220403212330991

Regardez les données de serviceMap après avoir exécuté putService

image-20220403212509535

La clé de la carte externe est la valeur de l'espace de noms et également une carte, la clé de la carte interne est le groupName et la valeur du nom du groupe est l'objet de service

image-20220403213220448

3. Vérification du rythme cardiaque de l'instance de service

Retour à la méthode putServiceAndInit

Exécutez ensuite la méthode service.init()

image-20220403213346275

Accédez à la méthode com.alibaba.nacos.naming.core.Service.init

image-20220403213427424

Exécuter une tâche planifiée après les 5 premières secondes, puis l'exécuter toutes les 5 secondes pour voir quelle est la tâche de suivi lorsque la tâche de thread est exécutée

image-20220403213506026

tâche de thread

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

image-20220403214111904

La valeur de `instance.getInstanceHeartBeatTimeOut() est de 15 secondes

Si l'heure actuelle moins la dernière pulsation de l'instance est supérieure à 15 secondes, entrez le jugement if et définissez l'état de santé sur false

C'est-à-dire que HealthCheckReactor.scheduleCheck(clientBeatCheckTask) active une pulsation pour détecter l'état de santé de toutes les instances. Une fois que le temps écoulé depuis la dernière détection de pulsation dépasse 15 s, l'état de santé est défini sur faux.

4. Envoyer un message à la file d'attente

Retour à la méthode registerInstance

Continuez à regarder addInstance(namespaceId, serviceName, instance.isEphemeral(), instance)

Suivi de com.alibaba.nacos.naming.core.ServiceManager.addInstance

image-20220403215331621

Générez d'abord une valeur de clé d'instance com.alibaba.nacos.naming.iplist.ephemeral.public##DEFAULT_GROUP@@nacos-test

String key = KeyBuilder.buildInstanceListKey(namespaceId, serviceName, ephemeral);

Générer une collection d'instances

List<Instance> instanceList = addIpAddresses(service, ephemeral, ips)

de nouvelles instances encapsulent les données de collecte

Instances instances = new Instances();
            instances.setInstanceList(instanceList);

image-20220403215727082

Accédez à la méthode consistanceService.put(key, instances)

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

image-20220403215853870

`La valeur d'enregistrement est l'incarnation des instances qui encapsule les instances Les instances Les instances héritent du polymorphisme d'enregistrement

image-20220403215936351

Suivi de la méthode Put

Accédez à la méthode com.alibaba.nacos.naming.consistency.ephemeral.distro.DistroConsistencyServiceImpl.onPut

image-20220403220259020

Un autre nouvel objet Datum, la valeur Datum est Instances key est la clé d'instance générée précédemment

image-20220403220335697

Puis jetez le Datum dans la carte du DataStore

image-20220403220530440

Enfin, appelez la méthode notifier.addTask pour suivre avec la méthode addTask

image-20220403220713239

Mettre la clé dans les services est la valeur datumKey est une chaîne vide

private ConcurrentHashMap<String, String> services = new ConcurrentHashMap<>(10 * 1024)

Enfin, l'appel task.offerjette la clé et l'action exécutée dans la file d'attente mémoire et renvoie null.La méthode est terminée.

La difficulté est-elle là ?

5. Écoutez la file d'attente et sortez la nouvelle instance de service

Regardons la classe à laquelle appartient cette tâche

image-20220403221239669

`Notifier est également une classe de tâche de thread, alors jetons un coup d'œil à ses tâches de thread

image-20220403221332029

Obtenez le datumKey de la file d'attente et appelez la méthode handle

image-20220403221711873

Atteignez un point d'arrêt, examinez le flux d'exécution et réenregistrez le service

venir à listener.onChange

image-20220403221823581

L'un des deux paramètres de la méthode onChange est datumKey et l'autre est Instances

On peut voir que la collection d'instances de service est extraite du dataStore via datumKey.

Suivi de la méthode com.alibaba.nacos.naming.core.Service.onChange

Parcourir toutes les instances d'instance pour définir des pondérations raisonnables

image-20220403221940620

Appelez ensuite la méthode updateIPs pour suivre

Je suis venu avec un nouvel ipMap et beaucoup de cartes

image-20220403222121424

itérer sur toutes les instances

image-20220403222745703

Ajouter aux adresses IP du cluster

Aller au suivant pour la traversée

image-20220403222856196

Appelez clusterMap.get(entry.getKey()).updateIps(entryIPs, ephemeral) pour obtenir le cluster et appelez la méthode updateIps

Venez à com.alibaba.nacos.naming.core.Cluster.updateIps

6. Copie sur écriture, enregistrez une nouvelle instance de service dans le registre

image-20220403223050216

ephemeral Si le paramètre passé dans la méthode précédente est vrai, alors affectez la valeur de ephemeralInstances à Set toUpdateInstances

Set<Instance> toUpdateInstances = ephemeral ? ephemeralInstances : persistentInstances;

Alors, qu'est-ce que c'est que ces instances éphémères ?

Il s'agit de l'ancien ensemble d'instances de service de stockage en cluster

private Set<Instance> ephemeralInstances = new HashSet<>();

Attribuez l'ancien ensemble d'instances à toUpdateInstances L'étape suivante consiste à exploiter l'instance de service nouvellement enregistrée, et enfin à attribuer toutes les dernières instances à toUpdateInstances,

Attribuez ensuite la valeur de toUpdateInstances à ephemeralInstances. À ce stade, une nouvelle instance de service est enregistrée.

image-20220403223554758

Il s'agit d'une idée de copie sur écriture, copiez une instance de service enregistrée, exploitez les données copiées, puis remplacez les anciennes données d'origine par les données copiées une fois l'opération terminée.

Le but est de résoudre le conflit de concurrence. Pendant le processus d'écriture, d'autres threads lisent les anciennes données, puis mettent à jour les données une fois l'écriture réelle terminée. Les données modifiées ne seront pas lues. Assurez-vous que toutes les instances de service lues sont disponibles.

Je suppose que tu aimes

Origine blog.csdn.net/JAVAlife2021/article/details/123946613
conseillé
Classement