Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
를 수강하면서 작성한 글입니다.
제가 지금까지 작성한 코드는 user service가 실행이 될 때 spring cloud config server로 부터 설정 정보를 가져와 애플리케이션을 실행했었습니다. 그리고 spring cloud config server는 ecommerce.yml로부터 설정 정보를 가져와서 다른 서비스에 설정값을 제공했습니다.
중간에 ecommerce.yml 파일의 값이 변경된다면 user service를 재가동해야만 반영이 변경된 설정값이 반영이 되는 불편함이 있었습니다.
이를 해결하기 위해서는
1. Actuator
2. Spring cloud bus
방법이 있습니다. 이글에서는 Actuator에 대해 작성해보겠습니다.
Actuator 공식문서에 의하면
라고 적혀있습니다.
말그대로 어플리케이션을 모니터링하고 관리하는 기능을 제공합니다.
Actuator는 user-service에 적용해보도록 하겠습니다.
build.gradle
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-actuator'
}
위와 같이 의존성을 추가합니다.
WebSecurity.java
@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf().disable();
http.authorizeRequests()
.antMatchers("/error/**").permitAll()
.antMatchers("/actuator/**").permitAll()
.antMatchers("/**")
.hasIpAddress("192.168.219.109")
.and()
.addFilter(getAuthenticationFilter());
http.headers().frameOptions().disable();
}
actuator에 관한 요청은 필터를 거치지 않도록 코드를 Spring Security 관련 정보를 수정해줍니다.
application.yml
management:
endpoints:
web:
exposure:
include: refresh, health, beans
우선 3가지 정도의 옵션을 추가해보았습니다.
refresh : config server에서 가져와야할 정보를 refresh 하겠다는 뜻입니다.
health : 애플리케이션의 상태 확인 옵션입니다.
beans : 애플리케이션에 있는 모든 Spring 빈의 전체 목록을 표시합니다.
user service를 재실행 해보도록 하겠습니다.
/health
상태에 대한 정보가 잘 나옵니다.
/beans
애플리케이션에 있는 모든 Spring 빈의 전체 목록을 표시해줍니다.
기존의 ecommerce.yml은 아래와 같이 작성되어 있습니다.
user service가 실행중인 상태에서 아래와 같이 값을 변경해보겠습니다.
/health_check
를 호출해보면 아직 변경된 값이 반영되어 있지 않습니다.
post
방식으로 아래와 같이 요청을 보내면
변경된 값이 response body에 담겨서 오게되고 health_check를 다시 확인해보면
위와 같이 변경된 값이 잘 반영되어있는 것을 알 수 있습니다.
Actuator를 이용하여 서버를 재가동하지 않고도 변경된 설정 값이 반영되는 것을 볼 수 있었습니다. 이렇게 서버를 재가동하지 않고도 변경된 값이 반영된다는 장점을 가지고있었습니다. 하지만 만약 변경된 설정값이 반영이 되어야 할 서버가 1,2개가 아니라 엄청 많다면 각각의 서버 모두 api를 호출해야한다는 단점을 가지고 있었습니다. 이를 보완하기 위한 방법으로는 Spring Cloud Bus가 있습니다.
다음 글에서는 Spring Cloud Bus에 대해 작성해보도록 하겠습니다.