spring boot/actuator in spring boot

spring boot 3.x + actuator 파헤치기. 13. spring boot admin 연동

Hello World Study 2023. 4. 14. 11:44

https://youtu.be/YEfnxsrVPtw

https://youtu.be/Q9fbNzlQCJI

 

이제까지는 actuator 의 값을 보기 위해 웹브라우저에 http://127.0.0.1:8080/actuator/ 로 시작하는 url 을 넣고 일일이 확인을 했습니다. 

단순히 조회만 할것이면 웹브라우저로 가능하나, 값을 변경하는 작업은 HTTP GET이 아닌 HTTP PUT, POST 와 같은 걸 사용해야 하는데 웹브라우저 자체는 이를 지원하지 않습니다. 게다가 json 형식으로 아주 많은 데이터가 나올 경우 눈으로 일일이 확인하기가 어렵습니다.

 

또한 여러 application이 있을때, ip가 서로 다를 것이므로 일일이 ip를 변경해가면서 값을 확인해야 합니다.

 

이런 불편함은 spring boot admin 이라는 걸 이용하면 많이 해소될 수 있습니다.

spring boot admin 에서는 UI 를 제공하기에 마우스 클릭만으로 쉽게 값 조회/수정이 가능하며

여러 application 의 actuator 정보를 server 로 모아서 통합관리할 수 있습니다.

 

spring boot admin 은 서버와 클라이언트로 구분되며,  actuator를 통해 정보를 제공하는 쪽이 client 이며, 

actuator 의 정보를 수집해서 ui로 보여주는게 server 입니다.

또한 spring boot 기반 application에 library 형태로 추가해주면 동작을 합니다.

 

즉 아래 그림처럼 spring boot application 에 spring boot admin client 라이브러리를 넣어주고, 

UI제공용 spring boot admin server 를 구동하고, 웹 브라우저에서는 각각의 application 에 접속하는게 아니라 spring boot admin server 에 접속해서 일괄 조회/변경을 하면 됩니다.

 

 

spring boot admin client

우선 기존 spring boot 에 spring boot admin client 모듈을 설치 및 설정을 합시다.

현재 사용중인 spring boot 는 3.x 이므로 spring boot admin client 도 3.x 버전을 이용해야 합니다.

아래처럼 구글에서 검색 한 후 적절한 버전을 이용하면 됩니다. 나와있는 버전을 보면 spring boot 와 거의 동일하게 매핑되어 나오는걸 알 수 있습니다.

spring boot 가 2.7.x 까지만 나와있는데, spring boot admin client 도 2.7.x 까지만 나와있습니다. 즉 spring boot 버전과 동일한 major minor 버전을 선택하면 되겠습니다. 

현 시점(2023.04)에는 아래 버전이 가장 적절해보이니 이걸 사용하겠습니다. 

<dependency>
	<groupId>de.codecentric</groupId>
	<artifactId>spring-boot-admin-starter-client</artifactId>
	<version>3.0.2</version>
</dependency>

 

pom.xml 이 변경되었으니 refresh 를 눌러서 위 의존성을 가져오도록 합니다.

이후 아래처럼 spring boot admin server 의 ip, port 정보를 기입해줍니다. 아직 우린 server 를 만들지 않았지만 localhost 에서 9090 포트로 만들것이므로 아래처럼 설정을 했습니다. 

 

spring:
  boot:
    admin:
      client:
        url:
          - http://127.0.0.1:9090  # spring boot admin 서버의 ip, port 기입

IDE 에서 자동완성을 잘 해주기에 아래 설정 정보를 찾는건 어렵지 않습니다.

이것으로 spring boot admin client 설정이 끝났습니다. 

 

 

spring boot admin server

server 구성을 위해서 별도의 spring boot application을 하나 만들어야 합니다. 

https://start.spring.io/ 에서 아래처럼 프로젝트를 하나 생성합니다. 

의존성에 spring boot admin server 를 검색해서 넣는걸 잊지 마세요. 혹시 잊고 만들었다면 아래를 pom.xml에 넣어주세요.

<dependency>
	<groupId>de.codecentric</groupId>
	<artifactId>spring-boot-admin-starter-server</artifactId>
	<version>3.0.2</version>
</dependency>

main 메서드가 있는 클래스에서 아래처럼 @EnableAdminServer 를 적어줍니다. 이를 통해 admin server 관련 bean 들이 자동 생성됩니다.

@EnableAdminServer    // 이걸 추가
@SpringBootApplication
public class SpringBootAdminServerApplication {

	public static void main(String[] args) {
		SpringApplication.run(SpringBootAdminServerApplication.class, args);
	}

}

아래처럼 EnableAdminServer 내부를 보면 Marker 라는 타입의 bean을 생성해주며,

Marker.class 라는 문자열을 검색해보면 AdminServerAutoConfiguration 이라는 클래스에서 Marker.class 문자열을 @ConditionalOnBean 에서 사용하는 걸 알 수 있습니다.

AdminServerAutoConfiguration 의 윗부분을 아래에 복붙해봤습니다.

Marker.class 타입의 bean 이 있을 경우, AdminServer 자동 구성이 활성화 되는걸 알 수있습니다. AdminServer 자동 구성에는 웹서버를 구동하고, config 정보를 읽어오는 등의 작업을 할 것으로 예상됩니다.


@ConditionalOnBean(AdminServerMarkerConfiguration.Marker.class)  <-- Marker.class 라는 타입이 bean으로 등록된 경우에만 활성화된다는 뜻
@ImportAutoConfiguration({ AdminServerInstanceWebClientConfiguration.class, AdminServerWebConfiguration.class })
생략
public class AdminServerAutoConfiguration {

 

마지막으로 application.properties 파일에 아래처럼 9090 포트를 적어줍니다. 이건 제 PC 에서 2대의 spring boot 를 동시에 구동해야 하다보니 port 충돌이 나지 않도록 하기 위해 임의로 설정한 값입니다. 실무에서는 서로 다른 서버에서 구동될 것이므로 굳이 port 를 변경할 필요가 없습니다.

server.port=9090

 

test

 

이제 client와 server 모두 구동을 해줍니다. 서버 주소인 http://127.0.0.1:9090/ 으로 접속해보면 아래처럼 다양한 정보를 볼 수 있습니다. 단순 조회성은 굳이 spring boot admin을 사용할 필요가 없어 보이나 logger level 실시간 변경, thread dump 등의 HTTP PUT/POST 성의 actuator 작업은 spring boot admin  으로 쉽게 조작을 할 수 있으니 편리해보입니다.

spring boot admin client 단 코드는 아래에서 확인할 수 있습니다.

https://github.com/ChunGeun-Yu/spring-actuator-study/tree/springBootAdminClient

 

spring boot admin server 단 코드는 너무 간단해서 공유하지는 않겠습니다.

 

spring boot admin 은 actuator 의 다양한 정보를 쉽게 알 수 있으나, 1시간전과 같이 예전 값을 저장하기가 어렵습니다.

그래서 실무에서는 spring boot admin 보다는 prometheus, grafana 와 같은 통합 모니터링 도구를 이용하는게 더 일반적입니다. 다만 힙덤프, 쓰레드덤프 와 같이 조회가 아닌 특정 작업을 수행할 경우에는 spring boot admin이 더 효과적이며, prometheus, grafana 조합에 비해 단순히 라이브러리 추가만으로 쉽게 구축이 가능하므로, 용도에 맞게 사용하시기 바랍니다.

 


spring boot admin 이라는 친구가 있으니 spring boot actuator 가 더 쉽게 느껴지죠?