Diagramme + code source pour expliquer le processus d'inscription au service Eureka Client

Prenez l'habitude d'écrire ensemble ! C'est le 5ème jour de ma participation au "Nuggets Daily New Plan·April Update Challenge", cliquez pour voir les détails de l'événement

Processus d'inscription au service client Eureka

La détermination est le début du succès

Articles connexes
Diagramme + explication du code source Diagramme d'analyse du processus de démarrage du serveur Eureka + explication du code source Diagramme
d'analyse du processus de démarrage du client Eureka + explication du code source Diagramme
logique du cache du registre du serveur Eureka
+ explication du code source Processus de registre d'extraction du client Eureka

Organigramme de base d'enregistrement

image.png

Par où commencer votre analyse

Lorsque le client est initialisé, clientConfig.shouldEnforceRegistrationAtInit() Indique s'il faut activer l'enregistrement obligatoire lors de l'initialisation, cette valeur est fausse par défaut, elle ne sera donc pas enregistrée. Elle est enregistrée dans la méthode refresh() dans la tâche de mécanisme d'envoi de pulsation des 30 secondes suivantes. .

if (clientConfig.shouldRegisterWithEureka() && 
    // clientConfig.shouldEnforceRegistrationAtInit() 默认是false
    clientConfig.shouldEnforceRegistrationAtInit()) {
    if (!register()) {
        throw new IllegalStateException("Registration error at startup. Invalid server response.");
    }
}
复制代码

logique de base

    Lorsque le battement de cœur est envoyé via refresh(), il renvoie que les informations d'instance sont introuvables. L'opération d'enregistrement est donc effectuée à nouveau et l'opération de demande de battement de cœur est effectuée via le client eurekaTransport.registrationClient.

1. Lancer l'enregistrement via des tâches de synchronisation des pulsations

boolean renew() {
EurekaHttpResponse<InstanceInfo> httpResponse;
    httpResponse = eurekaTransport.registrationClient.
        sendHeartBeat(instanceInfo.getAppName(), 
                      instanceInfo.getId(), instanceInfo, null);
    if (httpResponse.getStatusCode() == Status.NOT_FOUND.getStatusCode()) {
        REREGISTER_COUNTER.increment();
        long timestamp = instanceInfo.setIsDirtyWithTime();
        boolean success = register(); // 注册实例
        if (success) {
            instanceInfo.unsetIsDirty(timestamp);
        }
        return success;
    }
    return httpResponse.getStatusCode() == Status.OK.getStatusCode();
}
复制代码

    L'enregistrement de l'instance est effectué via la méthode register() et l'accès à la méthode d'enregistrement est effectué via eurekaTransport.registrationClient, qui accède à la méthode register de AbstractJersey2EurekaHttpClient

boolean register() throws Throwable {
    EurekaHttpResponse<Void> httpResponse;
    httpResponse = eurekaTransport.registrationClient.register(instanceInfo);
    ....
}
复制代码

    La méthode de registre de AbstractInstanceRegistry sous le projet eureka-core est accessible via le framework jersey2

public void register(InstanceInfo registrant, int leaseDuration,
                     boolean isReplication) {
    /**
     * 通过服务名字从本地的 gMap 中获取一个服务实例信息
     */
    Map<String, Lease<InstanceInfo>> gMap = registry.get(registrant.getAppName());
    if (gMap == null) {
        // 如果本地gMap中没有当前要注册的实例的话创建一个 gNewMap 
        // 也就是 registry 中的一个服务实例
        final ConcurrentHashMap<String, Lease<InstanceInfo>> gNewMap = 
            new ConcurrentHashMap<String, Lease<InstanceInfo>>();
        // 将当前服务名字为key并且服务名字,value就是当前要注册的 gNewMap
        gMap = registry.putIfAbsent(registrant.getAppName(), gNewMap);
        if (gMap == null) {
            gMap = gNewMap;
        }
    }
    // 说白了上面就是创建了一个gMap中的一个实例
    gMap.put(registrant.getId(), lease);
}
复制代码

2. Mettre l'instance actuelle dans la file d'attente

    Cette file d'attente d'inscription et cette file d'attente de modification sont créées lors de l'initialisation du service. L'état récemment modifié peut être surveillé via cette file d'attente récemment modifiée. La file d'attente nouvellement enregistrée et la file d'attente hors connexion sont principalement destinées à être affichées sur la page . La file d'attente récemment modifiée est utilisée lors de l'obtention d'informations d'instance d'enregistrement incrémentiel .

/**
 * 将当前实例放入到最近注册的队列
 */
recentRegisteredQueue.add(new Pair<Long, String>(System.currentTimeMillis(),
             registrant.getAppName() + "(" + registrant.getId() + ")"));
// 设置类型为添加类型
registrant.setActionType(ActionType.ADDED);
/**
 * 添加也属于改变所以创建一个最近的改变对象【RecentlyChangedItem】放入到最近的改变队列中,
 * 时间戳是当前的系统时间
 */
recentlyChangedQueue.add(new RecentlyChangedItem(lease));
复制代码

3. Invalider le cache local

/**
 * 当有新实例过来的时候无效当前读写缓存
 */
invalidateCache(registrant.getAppName(), registrant.getVIPAddress(),
                registrant.getSecureVipAddress());
复制代码

    L'invalidation de l'opération de cache local consiste à supprimer certaines clés du cache via la méthode d'invalidation de ResponseCacheImpl et à supprimer la valeur de la clé dans le cache en lecture-écriture.

public void invalidate(Key... keys) {
    for (Key key : keys) {
        // 移除读写缓存中的key
        readWriteCacheMap.invalidate(key);
        Collection<Key> keysWithRegions = regionSpecificKeys.get(key);
        if (null != keysWithRegions && !keysWithRegions.isEmpty()) {
            for (Key keysWithRegion : keysWithRegions) {
                readWriteCacheMap.invalidate(keysWithRegion);
            }
        }
    }
}
复制代码

sommaire

  1. Lancer l'enregistrement via heartbeat
  2. Placer l'instance actuelle dans la file d'attente d'enregistrement et la file d'attente des modifications récentes
  3. Invalider le cache côté serveur

Je suppose que tu aimes

Origine juejin.im/post/7082929115703017486
conseillé
Classement