springboot를 개발에 사용하는 과정에서 우리는 종종 다음과 같은 시나리오를 처리해야 합니다. 서비스가 시작되면 서비스 상태가 서비스 등록 센터(예: zk)에 등록되어야 서비스 상태가 변경될 때 , 장애 제거와 부하를 균형 있게 수행할 수 있습니다.
등록하는 두 가지 방법을 만났습니다.
1. Spring 웹 애플리케이션이 시작된 후 직접 등록합니다.
2 서블릿 컨테이너가 시작된 후 리스너를 통해 등록합니다.
이 기사에서는 zk에 등록하는 전통적인 솔루션을 사용하여 이 두 가지 등록 방법을 설명하는 데모를 사용합니다.
1. Spring 웹애플리케이션이 시작된 후 등록
먼저 코드를 살펴보겠습니다
@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를 가져와서 등록합니다.
여기서 한 가지 설명해야 할 것이 있습니다. 우리는 zkClient의 빈을 얻기 위해 ApplicationContext를 사용합니다. 그 이유는 webApplication의 초기화 프로세스 중에 모든 구성을 읽고 빈이 초기화되기 때문에 Autowired를 사용하여 빈을 주입할 수 없기 때문입니다. webApplication의 시작 프로세스 중에는 초기화가 완료될 때까지 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. 이 두 가지 방법의 비교
http 프로토콜을 외부에 제공하는 웹 서비스의 경우 서블릿 컨테이너 등록이 의미적으로 더 명확해지지만 스프링 컨테이너를 시작하는 데 시간이 너무 오래 걸리면 서블릿이 나타날 수 있습니다. 초기화가 완료되어 등록이 완료되었으나 서비스에서 외부 접근에 대한 Gap Time을 제공할 수 없기 때문에 저는 주로 첫 번째 방법으로 등록을 합니다.
이 시나리오는 다음과 같습니다
서블릿이 성공적으로 등록된 후에도 웹 애플리케이션이 아직 실제로 시작되지 않았으며 현재로서는 서비스가 정상적인 액세스를 제공할 수 없음을 알 수 있습니다.
zk에서 두 등록이 성공적으로 이루어진 것을 볼 수 있습니다.
위 내용은 springboot에서 등록 서비스를 구현하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!