MSA 환경에서 Docker Swarm 을 통해 올리는 프로젝트들은 healthy가 뜨더라도 서비스가 정상 가동하는데 몇번의 request(직접 접속해서 새로고침)가 필요하는것에 불편함을 느껴서 찾아본 방법입니다.
저희 서비스에서는 JWT 및 Security 이슈로인해 적용하지 못했으나 WarmUp을 해보시고 싶으시면 아래 3가지 방법을 통해 가능합니다!!!
- Zuul
- Zuul 은 내부적으로 원격 URL을 호출하기 위해 Ribbon을 사용하며 Ribbon클라이언트는 첫 번쨰 호출 시 Spring Cloud에 의해 지연 로드되기때문에 gateway/application.yml에거 zuul 로딩 설정을 eager-load로 변경
- Spring Cloud 최신버전은 Zuul이 아닌 gateway를 사용하기 때문에 본인 Spring Cloud 버전및 사용하는 게이트웨이를 확인 후 사용하시면 됩니다
- JVM
- Bootstrap Class Loading : Java 코드와 java.lang.Object 와 같은 필수 클래스를 메모리에 로드함
- Extension Class Loading : java.ext.dirs 경로에 있는 모든 JAR 파일을 로드함(개발자가 수동으로 JAR을 추가하는 경우)
- Application Class Loading : 애플리케이션 클래스 경로에 있는 모든 클래스를 로드함
- 이때 중요한 것은 이러한 초기화 프로세스가 지연 로딩(LAZY LOADING) 방식을 기반으로 한다는 것이다.
- 클래스 로딩이 완료되면 모든 중요한 클래스(프로세스 시작 시 사용)가 JVM 캐시(네이티브 코드)로 푸시되어 런타임 중에 더 빠르게 엑세스할 수 있다(per-request basis).
- Java 기반 웹 애플리케이션의 첫 번째 요청의 응답이 평균 응답 시간 보다 훨씬 느린 이유는 JVM 아키텍처가 지연 클래스 로딩과 JIT 컴파일로 이루어져 있기 때문이다.
- Ribbon Config
- Spring Warm UP
- RestTemplate 클래스를 통해 직접 애플리케이션에 Http요청을 보내는 방법을 통해 필요한 클래스들을 메모리에 캐싱해 애플리에키션을 Warm Up 하기.
'FrameWork > Spring Cloud' 카테고리의 다른 글
Prometheus + Grafana (0) | 2021.09.18 |
---|---|
Micrometer (0) | 2021.09.17 |
Microservice 분산 추적 (0) | 2021.09.12 |
Microservice에 Circuitbreaker 적용 (0) | 2021.09.11 |
장애 처리와 Microservice 분산 추적 - 1 (0) | 2021.09.11 |