Dans le processus d'utilisation de Springboot pour le développement, nous devons souvent faire face à de tels scénarios : lorsque le service est démarré, l'état du service doit être enregistré auprès du centre d'enregistrement du service (comme zk), de sorte que lorsque l'état du service change , la suppression des défauts et la charge peuvent être effectuées de manière équilibrée.
J'ai rencontré deux façons de m'inscrire :
1. Enregistrez-vous directement après le démarrage de l'application Web Spring ;
2. Enregistrez-vous via l'écouteur après le démarrage du conteneur de servlet.
Cet article utilise une démo pour décrire ces deux méthodes d'inscription, en utilisant la solution traditionnelle d'inscription avec zk.
1. Inscrivez-vous après le démarrage de l'application Web Spring
Jetons d'abord un coup d'œil au code
@SpringBootApplication public class WebApplication { private static final Logger logger = LoggerFactory.getLogger(WebApplication.class); private static volatile boolean IS_REGISTRY = false; public static void main(String[] args) { ApplicationContext context = run(WebApplication.class, args); if (IS_REGISTRY) { logger.info("注册2: WebApplication启动完成后"); ZkClient zkClient = context.getBean(ZkClient.class); zkClient.register(); IS_REGISTRY = true; logger.info("注册2: 注册成功"); } } }
Ici, nous récupérons le zkClient dans l'application Web et l'enregistrons.
Une chose doit être expliquée ici. Nous utilisons ApplicationContext pour obtenir le bean de zkClient. La raison est que vous ne pouvez pas utiliser Autowired pour injecter des beans pendant le processus d'initialisation de webApplication, car toutes les configurations sont lues et les beans sont initialisés pendant le processus. processus de démarrage de webApplication Terminé, vous ne pouvez pas injecter de bean tant que l'initialisation n'est pas terminée.
Le code détaillé pour l'inscription ne sera pas développé ici.
2. Une fois le conteneur de servlet initialisé, enregistrez-le via un écouteur
Écrivez toujours le code en premier
@WebListener public class RegisterListener implements ServletContextListener { protected final Logger logger = LoggerFactory.getLogger(this.getClass()); private static volatile boolean IS_REGISTRY = false; @Autowired private ZkClient zkClient; @Override public void contextInitialized(ServletContextEvent servletContextEvent) { try { if (!IS_REGISTRY) { logger.info("注册1: Servelet容器启动成功后"); zkClient.register(); logger.info("注册1: 注册成功"); } IS_REGISTRY = true; } catch (Exception e) { IS_REGISTRY = false; logger.info("注册1: 注册失败"); } } @Override public void contextDestroyed(ServletContextEvent servletContextEvent) { if (IS_REGISTRY) { zkClient.stop(); } } }
Vous devez d'abord écrire un écouteur implémente l'interface ServletContextListener et l'annote avec @WebListener. l'annotation springboot La manière suivante d'écrire l'écouteur.
Une fois le conteneur de servlet démarré avec succès, la méthode contextInitialized de cet écouteur sera appelée. Si le conteneur de servlet est détruit et ne peut pas fournir de services, la méthode contextDestroyed de l'écouteur sera appelée. En d'autres termes, cet écouteur surveille l'état du conteneur de servlet.
Ensuite, il vous suffit d'ouvrir la configuration de l'écouteur dans la classe principale de l'application.
@ServletComponentScan @SpringBootApplication public class WebApplication { }
3. Comparaison de ces deux méthodes
Pour un service Web qui fournit le protocole http au monde extérieur, l'enregistrement du conteneur de servlet sera sémantiquement plus clair, mais si votre conteneur Spring met trop de temps à démarrer, un servlet peut apparaître L'initialisation est terminée et a été enregistrée, mais le service ne peut pas fournir un intervalle de temps pour l'accès externe, j'utilise donc généralement la première méthode pour m'inscrire.
Ce scénario est le suivant
Vous pouvez voir qu'une fois le servlet enregistré avec succès, l'application Web n'a pas encore été démarrée. À ce stade, le service ne peut pas fournir un accès normal.
Vous pouvez voir sur zk que les deux inscriptions ont été réussies.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!