Un consommateur s'abonne à la liste des fournisseurs auprès d'un registre. Si le registre change, rencontre un problème inattendu ou si la connexion entre un fournisseur et le registre est interrompue (par exemple, en raison de problèmes réseau ou d'une charge CPU élevée), des exceptions d'abonnement peuvent se produire. Le consommateur risque alors de recevoir une liste vide de fournisseurs. Vous pouvez activer la protection contre les listes vides sur le client Nacos ou le serveur Microservices Engine (MSE) Nacos afin d'améliorer la disponibilité globale du système.
Prérequis
MSE est activé. Pour plus d'informations, consultez Activer MSE.
Un moteur Nacos a été créé. Pour plus d'informations, consultez Créer un moteur Nacos.
Activer la protection contre les listes vides sur le client
Limites
Le client Java Nacos version 1.4.1 ou ultérieure prend en charge la protection contre les listes vides.
Afin de prévenir les risques liés à certaines versions, nous vous recommandons de choisir les versions appropriées pour le client, les applications Spring Cloud et les applications Dubbo en vous basant sur les versions recommandées.
Procédure
-
Si vous utilisez le client Java Nacos, procédez comme suit :
-
Ajoutez la dépendance suivante du
Nacos client:<!-- ${nacos-client.version} must be 1.4.1 or later. --> <dependency> <groupId>com.alibaba.nacos</groupId> <artifactId>nacos-client</artifactId> <version>${nacos-client.version}</version> </dependency> -
Configurez les paramètres suivants dans le code de l'application :
Properties properties = new Properties(); properties.put(PropertyKeyConst.SERVER_ADDR, "${Endpoint of the MSE Nacos instance}"); properties.put(PropertyKeyConst.NAMING_PUSH_EMPTY_PROTECTION, "true"); NamingService naming = NamingFactory.createNamingService(properties);
-
-
Si votre application est basée sur Spring Cloud Alibaba, ajoutez la configuration suivante au fichier de configuration de votre application :
spring.cloud.nacos.discovery.namingPushEmptyProtection=true -
Si votre application est basée sur Dubbo, ajoutez la configuration d'URL de registre suivante au fichier de configuration de votre application Dubbo :
dubbo.registry.address=nacos://${Endpoint of the MSE Nacos instance}:8848?namingPushEmptyProtection=true
Activer la protection contre les listes vides sur le serveur
De nombreux clients non Java et des clients Java Nacos antérieurs à la version 1.4.1 sont encore utilisés. MSE optimise les fonctionnalités des serveurs Nacos par rapport à Nacos open source afin de fournir une protection contre les listes vides pour les serveurs Nacos.
Limites
La version du moteur Nacos doit être 2.1.0.0 ou ultérieure. Pour plus d'informations sur la mise à niveau de la version du moteur Nacos, consultez Mettre à jour une version Nacos.
Procédure
La méthode d'activation de la protection contre les listes vides varie selon la version de votre moteur MSE Nacos.
Si la version de votre moteur MSE Nacos est 2.1.0.0 ou 2.1.0.1, aucune action n'est requise. La protection contre les listes vides est automatiquement activée dans ces versions.
-
Si la version de votre moteur MSE Nacos est 2.1.0.2 ou ultérieure, suivez les étapes ci-dessous pour activer la protection contre les listes vides :
Connectez-vous à la console MSE et sélectionnez une région dans la barre de navigation supérieure.
Dans le volet de navigation de gauche, choisissez Microservices Registry > Instances.
Sur la page Instances, cliquez sur le nom de l'instance.
Dans le volet de navigation de gauche, cliquez sur Parameter Settings. Dans la section Real-time Effective Parameters de la page Parameter Settings, cliquez sur Edit dans la colonne Actions du paramètre forcePushEmptyProtectionForAllService.
-
Dans la boîte de dialogue Edit Parameters, sélectionnez Yes pour Value et cliquez sur OK.
RemarquePour garantir une disponibilité maximale du service, nous vous recommandons de sélectionner Yes pour Value du paramètre forcePushEmptyProtectionForAllService dans tous les cas.
Vérifier le résultat
Lorsqu'un service déclenche la protection contre les listes vides, le message Trigger push empty protection for Service s'affiche dans le fichier naming.log situé dans le répertoire ${user.home}/logs/nacos du nœud où réside le consommateur.
Normalement, ce type d'information n'apparaît pas fréquemment. Si ces messages apparaissent souvent, vous pouvez résoudre le problème en examinant les causes possibles suivantes :
-
Les fournisseurs auxquels le consommateur est abonné n'existent pas.
Si le consommateur est abonné à un fournisseur inexistant, vérifiez si la dépendance applicative est nécessaire. Si elle ne l'est pas, supprimez la dépendance invalide. Si elle est requise, republiez le fournisseur.
-
Aucun fournisseur n'apparaît dans la liste des instances.
Vérifiez si les fournisseurs auxquels le consommateur est abonné subissent des déconnexions fréquentes.
Vérifiez si la connexion réseau entre chaque fournisseur et l'instance MSE Nacos est normale. En cas d'anomalie réseau, l'instance MSE Nacos considère que le fournisseur est déconnecté.
Identifier le service qui déclenche la protection contre les listes vides
Le message d'erreur contient des informations sur le service qui déclenche la protection contre les listes vides. Vous pouvez identifier le service vide auquel le consommateur est abonné en vous basant sur Service{namespace='XXX', group='xx', name='xxxxxxx', ephemeral=true, revision=0}.
Scénarios de déclenchement connus
|
Scénario |
Cause |
Solution |
|
Dans les scénarios multi-abonnements avec compatibilité des versions Dubbo 2, les fournisseurs dont les noms de service utilisent l'ancien format n'apparaissent pas dans la liste des instances. |
Le format du nom de service d'un fournisseur pour les versions antérieures à Dubbo 2.7.6 diffère de celui des versions Dubbo 2.7.6 et ultérieures. Dans les scénarios multi-abonnements utilisant des fournisseurs Dubbo 2.7.6 ou ultérieurs, le consommateur s'abonne à la fois aux fournisseurs avec l'ancien format de nom de service et à ceux avec le nouveau format. Si tous les fournisseurs utilisent Dubbo 2.7.6 ou une version ultérieure, les fournisseurs avec l'ancien format de nom de service ne peuvent pas s'enregistrer auprès de l'instance Nacos. Par conséquent, la protection contre les listes vides est déclenchée lorsque le consommateur s'abonne à un fournisseur dont le nom de service utilise l'ancien format. |
Mettez à niveau la version de votre moteur vers 2.1.0.1 ou ultérieure, ou mettez à niveau la version de Dubbo vers 2.7.17 ou ultérieure. Pour plus d'informations, consultez Mettre à niveau une version de moteur. |
|
Dans les scénarios multi-abonnements avec compatibilité des versions Dubbo 3, les fournisseurs dont les noms de service sont au niveau de l'interface n'apparaissent pas dans la liste des instances. |
Dubbo 3 prend en charge la découverte de services au niveau de l'application. Les noms de service enregistrés ne sont pas au niveau de l'interface, mais au niveau de l'application. Pour assurer une mise à niveau fluide des versions de Dubbo, le consommateur s'abonne à la fois aux fournisseurs dont les noms de service sont au niveau de l'application et à ceux dont les noms de service sont au niveau de l'interface. Si tous les fournisseurs utilisent Dubbo 3, les fournisseurs dont les noms de service sont au niveau de l'interface ne peuvent pas s'enregistrer auprès de l'instance Nacos. Par conséquent, la protection contre les listes vides est déclenchée lorsque le consommateur s'abonne à un fournisseur dont le nom de service est au niveau de l'interface. |
Ajoutez la configuration |
|
Si la fonctionnalité NacosWatch est activée pour la première fois sur une application Spring Cloud Alibaba et qu'aucun réplica d'instance n'existe, le consommateur reçoit une liste d'instances vide. |
La fonctionnalité NacosWatch est fournie dans la nouvelle version des applications Spring Cloud Alibaba pour surveiller l'état des services des applications. Elle permet à une application Spring Cloud Alibaba de surveiller son service au démarrage. Si la fonctionnalité NacosWatch est activée pour la première fois et qu'aucun réplica d'instance n'existe, la protection contre les listes vides est déclenchée car l'instance d'application n'est pas enregistrée auprès de l'instance Nacos. Une fois l'instance d'application démarrée, la protection contre les listes vides n'est plus déclenchée. |
Ignorez le problème si la fonctionnalité NacosWatch est activée pour la première fois sur une application Spring Cloud Alibaba et qu'aucun réplica d'instance n'existe. Vous pouvez également ajouter la configuration |
|
Dans les scénarios où un service est complètement désactivé pour une passerelle Spring Cloud Gateway, l'état du service n'est pas synchronisé. |
Lors du démarrage de la passerelle Spring Cloud Gateway, celle-ci interroge tous les services auprès de l'instance Nacos et s'y abonne. Par exemple, après le démarrage d'une passerelle Spring Cloud Gateway, un service peut être complètement désactivé car l'instance Nacos supprime automatiquement toutes les instances d'application. Cependant, la passerelle Spring Cloud Gateway ne détecte pas cet état de service et continue de s'y abonner. Par conséquent, la protection contre les listes vides est déclenchée. |
La passerelle Spring Cloud Gateway ne peut pas détecter dynamiquement l'état d'un service ni se désabonner si le service est désactivé. Nous vous recommandons de redémarrer la passerelle Spring Cloud Gateway. |
Scénarios d'activation forcée de la protection contre les listes vides
Dans MSE Nacos 2.1.0.2 ou ultérieur, la logique d'activation de la protection contre les listes vides a été optimisée. Cette optimisation garantit que la protection contre les listes vides est activée uniquement si Yes est sélectionné pour Value du paramètre forcePushEmptyProtectionForAllService. Toutefois, le système active toujours automatiquement la protection contre les listes vides pour assurer la disponibilité et la stabilité dans les scénarios suivants, même si No est sélectionné pour Value du paramètre forcePushEmptyProtectionForAllService.
Lors de la mise à niveau, du redémarrage ou de la récupération après panne d'un nœud de moteur, le nœud active automatiquement une protection contre les listes vides de deux minutes pour toutes les applications afin de garantir la disponibilité du service pendant cette période.
Si toutes les instances d'une application sont supprimées de la liste des instances d'application sur l'instance MSE, l'instance MSE active automatiquement une protection contre les listes vides d'une minute pour l'application. Cette opération empêche le déclenchement inattendu de la protection contre les listes vides en cas de problèmes tels que des performances réseau instables ou des pannes temporaires des fournisseurs de services. Ainsi, la disponibilité du service est assurée dans ce scénario.
Pour garantir une disponibilité maximale du service, nous vous recommandons de sélectionner Yes pour Value du paramètre forcePushEmptyProtectionForAllService afin d'activer la protection contre les listes vides dans tous les cas.
Références
Vous pouvez utiliser les capacités de haute disponibilité fournies par Microservices Registry de MSE pour améliorer considérablement la gestion des risques au sein des applications. Pour plus d'informations, consultez Implémenter les capacités de haute disponibilité de MSE Microservices Registry.