Metamorphosis représente un système de messagerie distributive hautement disponible et performant, doté d'une mécanisme d'extensions flexible permettant aux développeurs d'étendre ses fonctionnalités fondamentales par le biais de plugins personnalisés. Ce guide détaillera le processus de développement de plugins spécifiques pour Metamorphosis, incluant une explication des interfaces de plugins, les étapes de développement, des exemples pratiques ainsi que les meilleures pratiques à adopter.
Architecture des plugins dans Metamorphosis
L'écosystème de plugins Metamorphosis repose sur l'interface fondamentale ModulePlugin, autour de laquelle tous les plugins doivent être construits. Le système fournit une classe abstraite BaseBrokerPlugin comme implémentation de base, permettant aux développeurs d'hériter rapidement de celle-ci pour créer leurs propres modules.
Les principaux types de plugins incluent :
- Plugins de service HTTP : tels que
JettyBrokerModule - Plugins de réplication maître-esclave : comme
EsclaveCourtieretMaitreCourtier - Plugins de synchronisation de métadonnées : tels que
CourtierEsclaveMetamorphosis - Plugins de gestion de modules : comme
GestionnaireModulesCourtier
Interface de plugin fondamentale
Interface ModulePlugin
L'interface ModulePlugin constitue la base de tous les plugins, définissant les méthodes du cycle de vie du plugin :
interface ModulePlugin {
public void demarrer(); // Démarrage du plugin
public void arreter(); // Arrêt du plugin
public void initialiser(CourtierMetaMorphose courtier, Proprietes props); // Initialisation du plugin
public String nom(); // Obtention du nom du plugin
}
Classe abstraite BaseBrokerPlugin
La classe BaseBrokerPlugin implémente l'interface ModulePlugin et fournit des fonctionnalités de base :
- Implémente les méthodes
equalsethashCodebasées sur le nom du plugin - Fournit les variables membres
courtieretpropspour accéder à l'instance du courtier et aux propriétés de configuration - Définit un objet de journalisation pour faciliter l'enregistrement dans le développement de plugins
Étapes de développement d'un plugin personnalisé
Préparation de l'environnement
- Cloner le dépôt Metamorphosis :
git clone https://gitcode.com/gh_mirrors/me/Metamorphosis
- Importer le projet dans un IDE, en s'assurant que les dépendances sont correctement configurées
Création de la classe de plugin
Créer une nouvelle classe Java qui hérite de BaseBrokerPlugin et implémente les méthodes nécessaires :
public class MonModulePersonnalise extends BaseBrokerPlugin {
@Override
public void demarrer() {
// Logique de démarrage du plugin
log.info("MonModulePersonnalise démarré");
}
@Override
public void arreter() {
// Logique d'arrêt du plugin
log.info("MonModulePersonnalise arrêté");
}
@Override
public void initialiser(CourtierMetaMorphose courtier, Proprietes props) {
super.initialiser(courtier, props);
// Logique d'initialisation, comme la lecture des paramètres de configuration
String valeurConfig = props.getProperty("monmodule.cle.config");
}
@Override
public String nom() {
return "MonModulePersonnalise"; // Retourner un nom de plugin unique
}
}
Implémentation de la logique métier
En fonction des besoins fonctionnels du plugin, implémenter la logique métier spécifique. Par exemple :
- Filtrage de messages : implémenter l'interception et le filtrage des messages envoyés/consommés
- Surveillance et statistiques : collecter des indicateurs personnalisés et les rapporter
- Conversion de protocole : ajouter le support de nouveaux protocoles
Configuration et chargement du plugin
- Ajouter la configuration du plugin dans le fichier de configuration du serveur :
# Dans metamorphosis-server-wrapper/conf/server.ini
modules=com.taobao.metamorphose.MonModulePersonnalise
monmodule.cle.config=valeur
- Le plugin sera chargé et géré automatiquement par la classe
GestionnaireModulesCourtier
Exemple de développement pratique : module de journalisation
Voici un module de journalisation simple qui enregistre l'envoi et la réception de messages :
public class ModuleJournalisationMessages extends BaseBrokerPlugin {
private Logger logger = LoggerFactory.getLogger(ModuleJournalisationMessages.class);
@Override
public void demarrer() {
logger.info("Module de journalisation des messages démarré");
// Enregistrer l'intercepteur de messages
this.courtier.getMagasinMessages().ajouterEcouteurMessages(new EcouteurMessages() {
@Override
public void surMessage(Message message) {
logger.info("Message reçu : " + message.getSujet() + " - " + message.getIdentifiant());
}
});
}
@Override
public void arreter() {
logger.info("Module de journalisation des messages arrêté");
}
@Override
public void initialiser(CourtierMetaMorphose courtier, Proprietes props) {
super.initialiser(courtier, props);
}
@Override
public String nom() {
return "ModuleJournalisationMessages";
}
}
Configuration et utilisation du module
- Compiler et empaqueter la classe du module, puis la placer dans le répertoire lib de Metamorphosis
- Configurer le module dans server.ini :
modules=com.taobao.metamorphose.ModuleJournalisationMessages
- Redémarrer le service Metamorphosis, le module sera chargé automatiquement
Meilleures pratiques pour le développement de plugins
Conventions de nommage
- Les noms de classes de plugins doivent se terminer par "Module", comme
ModuleJournalisationMessages - Assurer que la méthode
nom()retourne un nom de plugin unique pour éviter les conflits
Gestion des exceptions
- Le plugin doit gérer toutes les exceptions internes pour ne pas affecter le service principal
- Utiliser des blocs try-catch pour capturer les exceptions et enregistrer les journaux détaillés
Gestion des ressources
- Libérer toutes les ressources dans la méthode
arreter(), telles que les connexions à la base de données, les connexions réseau, etc. - Éviter les fuites de mémoire, en particulier lors de l'utilisation d'écouteurs et de fonctions de rappel
Considérations de performance
- La logique du plugin doit être aussi légère que possible, en évitant de bloquer le thread principal
- Pour les opérations chronophages, utiliser un traitement asynchrone
Références aux modules officiels
Metamorphosis fournit pluseiurs implémentations de modules officiels qui peuvent servir de référence pour le développement :
- Module de service HTTP : metamorphosis-server-wrapper/src/main/java/com/taobao/metamorphose/http/JettyBrokerModule.java
- Module de réplication maître-esclave : metamorphosis-server-wrapper/src/main/java/com/taobao/metamorphose/gregor/esclave/EsclaveCourtier.java
- Classe de gestion de modules : metamorphosis-server-wrapper/src/main/java/com/taobao/metamorphose/GestionnaireModulesCourtier.java
Problèmes courants et solutions
Le module ne se charge pas
- Vérifier si la classe du module se trouve dans le chemin de classes
- Valider que la méthode
nom()retourne un nom unique - Contrôler si le nom de classe du module dans le fichier de configuration est correct
Conflits entre modules
- Utiliser la classe
GestionnaireModulesCourtierpour gérer plusieurs modules - S'assurer que les fonctionnalités des modules ne se chevauchent ou ne sont pas en conflit
- Dans la méthode
initialiser(), vérifier si les modules dépendants sont déjà chargés
Problèmes de performance
- Utiliser des outils d'analyse de performance pour identifier les goulets d'étranglement
- Optimiser la logique du module pour réduire les calculs inutiles
- Adopter un traitement asynchrone pour les opérations chronophages