Dalam proses menggunakan springboot untuk pembangunan, kita sering perlu menangani senario seperti ini: apabila perkhidmatan dimulakan, status perkhidmatan perlu didaftarkan dengan pusat pendaftaran perkhidmatan (seperti zk), supaya apabila perkhidmatan perubahan status, kerosakan boleh dialih keluar dan pengimbangan beban.
Saya telah menemui dua cara untuk mendaftar:
1 Selepas aplikasi web Spring dimulakan, daftar terus
2 dimulakan, daftarkannya melalui pendengar.
Artikel ini menggunakan demo untuk menerangkan kedua-dua kaedah pendaftaran ini, menggunakan penyelesaian tradisional iaitu mendaftar dengan zk.
1. Daftar selepas aplikasi web Spring dimulakan
Mari kita lihat kod dahulu
@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: 注册成功"); } } }
Di sini, kami mendapat zkClient dalam WebApplication dan mendaftarkannya.
Satu perkara perlu dijelaskan di sini Kami menggunakan ApplicationContext untuk mendapatkan biji zkClient Sebabnya ialah anda tidak boleh menggunakan Autowired untuk menyuntik kacang semasa proses permulaan aplikasi web, kerana semua konfigurasi dibaca semasa permulaan. proses webApplication Dan pemulaan kacang selesai Anda tidak boleh menyuntik kacang sebelum pemulaan selesai.
Kod terperinci untuk pendaftaran tidak akan dikembangkan di sini.
2. Selepas bekas servlet dimulakan, daftar melalui pendengar
Masih kod dahulu
@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(); } } }
Anda perlu menulis pendengar terlebih dahulu, yang melaksanakan antara muka ServletContextListener , dan anotasikannya dengan @WebListener, iaitu kaedah penulisan pendengar beranotasi springboot.
Selepas bekas servlet berjaya dimulakan, kaedah contextInitialized pendengar ini akan dipanggil Jika bekas servlet dimusnahkan dan tidak dapat menyediakan perkhidmatan, kaedah contextDestroyed pendengar akan dipanggil. Dalam erti kata lain, pendengar ini memantau status bekas servlet.
Kemudian anda hanya perlu membuka konfigurasi pendengar dalam kelas utama aplikasi.
@ServletComponentScan @SpringBootApplication public class WebApplication { }
3 Perbandingan dua kaedah
Untuk perkhidmatan web yang menyediakan protokol http kepada dunia luar, pendaftaran bekas servlet akan menjadi lebih jelas dari segi semantik, tetapi jika bekas spring anda bermula Jika masa terlalu lama, mungkin terdapat jurang masa apabila servlet dimulakan dan didaftarkan, tetapi perkhidmatan itu tidak dapat menyediakan akses luaran, jadi saya biasanya menggunakan kaedah pertama untuk mendaftar.
Senario ini adalah seperti ini
Seperti yang anda lihat, selepas servlet berjaya didaftarkan, aplikasi web belum dimulakan lagi. perkhidmatan tidak boleh biasa.
Seperti yang anda lihat di zk, kedua-dua pendaftaran telah berjaya.
Atas ialah kandungan terperinci Bagaimana untuk melaksanakan perkhidmatan pendaftaran dalam springboot. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!