SpringBoot を開発に使用するプロセスでは、次のようなシナリオに対処する必要があることがよくあります。サービスの開始時に、サービスのステータスをサービス登録センター (zk など) に登録する必要があります。ステータスの変更、障害の除去、および負荷分散が可能です。
登録には 2 つの方法がありました:
1. Spring Web アプリケーションの開始後に直接登録します;
2. サーブレット コンテナーが起動された後開始したら、リスナーを介して登録します。
この記事では、zk を使用した従来の登録スキームを使用したこれら 2 つの登録方法についてデモを使用して説明します。
1. Spring Web アプリケーションの開始後に登録します。
まずコードを見てみましょう。
@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: 注册成功"); } } }
ここでは、WebApplication 内の zkClient を取得して登録します。
ここで注意すべき点は、ApplicationContext を使用して zkClient の Bean を取得するということです。その理由は、すべての設定が起動プロセス中に読み取られるため、webApplication の初期化プロセス中に Bean を注入するために Autowired を使用できないためです。 Bean の初期化が完了します。初期化が完了するまで Bean を注入することはできません。
登録用の詳細なコードはここでは展開されません。
2. サーブレット コンテナが初期化された後、リスナーを介して登録します。
まだ最初にコードを作成します。
@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(); } } }
最初にリスナーを作成する必要があります。 ServletContextListener インターフェースを作成し、それに @WebListener という注釈を付けます (Springboot の注釈付きリスナー作成メソッド)。
サーブレット コンテナが正常に起動されると、このリスナーの contextInitialized メソッドが呼び出されます。サーブレット コンテナが破棄されてサービスを提供できない場合は、リスナーの contextDestroyed メソッドが呼び出されます。つまり、このリスナーはサーブレット コンテナのステータスを監視しています。
その後、アプリケーションのメイン クラスでリスナー構成を開くだけで済みます。
@ServletComponentScan @SpringBootApplication public class WebApplication { }
3. これら 2 つの方法の比較
http プロトコルを外部に提供する Web サービスの場合、サーブレット コンテナの登録は意味的により明確になりますが、Spring コンテナが開始されると、時間が長すぎると、サーブレットの初期化が完了して登録されるまでに時間が空く可能性がありますが、サービスは外部アクセスを提供できないため、通常は最初の方法を使用して登録します。
このシナリオは次のようなものです
サーブレットが正常に登録された後、Web アプリケーションは実際にはまだ開始されておらず、サービスは開始できないことがわかります。現時点では正常です。アクセスを提供してください。
zk では、2 つの登録が成功したことがわかります。
以上がSpringbootで登録サービスを実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。