>  기사  >  Java  >  springboot에서 등록 서비스를 구현하는 방법

springboot에서 등록 서비스를 구현하는 방법

WBOY
WBOY앞으로
2023-05-12 12:28:061426검색

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을 제공할 수 없기 때문에 저는 주로 첫 번째 방법으로 등록을 합니다.

이 시나리오는 다음과 같습니다

springboot에서 등록 서비스를 구현하는 방법

서블릿이 성공적으로 등록된 후에도 웹 애플리케이션이 아직 실제로 시작되지 않았으며 현재로서는 서비스가 정상적인 액세스를 제공할 수 없음을 알 수 있습니다.

springboot에서 등록 서비스를 구현하는 방법

zk에서 두 등록이 성공적으로 이루어진 것을 볼 수 있습니다.

위 내용은 springboot에서 등록 서비스를 구현하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 yisu.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제