[Spring]

Spring Boot Admin으로 관리 및 모니터링 서버 구현해보기

팡펑퐁 2023. 5. 17. 14:38
728x90

Spring Boot Admin

  • Spring Boot 웹 애플리케이션을 위한 관리 및 모니터링 인터페이스를 제공한다.
  • 관리 및 모니터링 대상은 서버의 상태(프로세스, 스레드, 메모리), 빈, 스케줄, 로거. JVM, 캐시 등이 있다.
  • Codecentric에서 진행하고 있는 오픈소스 커뮤니티 프로젝트로 Spring에서 공식적으로 지원하는 것이 아니다.
  • 간단하게 얘기해 Spring boot Admin이 서버가 되고, 관리 및 모니터링 대상 서버(우리가 개발한 Spring Boot 서버)가 클라이언트가 된다.
  • 클라이언트에 admin 서버 주소를 설정하면 admin에 인스턴스가 하나 생기고 대시보드에서 모니터링을 할 수 있다.

 

 

 

본격적으로 Spring Boot Admin Server를 구축해 보자.

Spring Boot의 버전 Spring Boot Admin의 버전
2.6 2.6.Y
2.7 2.7.Y
3.0 3.0.Y

 구축을 시작하기 전에 주의할 점은 Spring Boot Admin Server의 버전은 Admin 서버의 Spring Boot 버전과 반드시 일치해야 한다는 것이다. 그러나, Spring Boot Admin Server가 관리 및 모니터링을 하는 대상 서비스(서버)의 경우는 버전에 상관없이 관리 및 모니터링을 할 수 있다. 예를 들어 Spring Boot Admin Server의 버전이 2.7일 때 Admin 서버의 Spring Boot 버전은 2.7이어야 한다. 그러나  관리 및 모니터링 대상 서버의 Spring Boot 버전은 2.3이라도 문제없이 동작한다.

 

 

 

Spring Boot Admin Server

프로젝트 생성하기

  • https://start.spring.io/ 에서 쉽게 만들 수 있다.
  • 의존성에 codecntric's Spring Boot Admin (Server)를 추가한다.

 

 

build.gradle

plugins {
	id 'java'
	id 'org.springframework.boot' version '2.7.11'
	id 'io.spring.dependency-management' version '1.0.15.RELEASE'
}

group = 'spring.boot.admin'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '11'

repositories {
	mavenCentral()
}

ext {
	set('springBootAdminVersion', "2.7.4")
}

dependencies {
	implementation 'de.codecentric:spring-boot-admin-starter-server'
	testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

dependencyManagement {
	imports {
		mavenBom "de.codecentric:spring-boot-admin-dependencies:${springBootAdminVersion}"
	}
}

tasks.named('test') {
	useJUnitPlatform()
}
  • spring initializr로 spring boot admin server의 의존성을 추가하여 프로젝트를 생성하면 별도의 의존성 추가 작업을 할 필요 없다.

 

 

application.properties

server.port=8080 # 포트설정
management.endpoints.web.exposure.include=* #

management.endpoints.web.exposure.include=*

  •  자바 애플리케이션의 관리 엔드포인트에 관한 설정으로 Spring Boot에는 응용프로그램을 모니터링하고 관리하기 위한 다양한 엔드포인트를 제공하는 Actuator라는 기능이 있다. 이 엔드포인트들은 애플리케이션의 상태, 구성, 로깅 등의 정보 및 기능을 보여준다. 
  •  management.endpoints.web.exposure.include 속성은 HTTP 요청을 통해 액세스 되는 관리 엔드포인트를 지정할 수 있다. 위의 설정의 경우 *라는 모든 엔드포인트를 나타내는 와일드카드 문자를 사용했으므로 모든 관리 엔트포인트가 노출되며 액세스 가능함을 의미한다. 실제 상용 서버의 경우 모든 관리 엔드포인트를 노출시키는 것은 보안상 문제를 발생시킬 수 있으므로 권장되지 않으며 모니터링 및 관리가 필요한 엔드포인트만 적용하는 것이 좋다.

 

 

Application 엔트리 포인트 클래스

@EnableAdminServer

  • Spring Boot Admin의 실행을 도와주는 애너테이션이다.

 

 

서버 실행

  • 실행 로그에 Exposing 13 endpoint(s) beneath base path '/actuator'가 보인다.
  • actuator를 이용해 엔드포인트를 확인한 것으로 보인다.

 

 

로컬 서버 접속해 보기

localhost:8080

  • 잘 작동되는 것을 확인했으니 이제 관리 대상 서버에 Spring Boot Admin Client를 적용해 보자.

 

 

 

Spring Boot Admin Client

  • Client 역시 Spring initializr를 사용하면 별도의 의존성 추가 없이 프로젝트를 생성할 수 있다.

 

 

build.gradle

`plugins {
	id 'java'
	id 'org.springframework.boot' version '2.7.11'
	id 'io.spring.dependency-management' version '1.0.15.RELEASE'
}

group = 'spring.boot.client'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '11'

configurations {
	compileOnly {
		extendsFrom annotationProcessor
	}
}

repositories {
	mavenCentral()
}

ext {
	set('springBootAdminVersion', "2.7.4")
}

dependencies {
	implementation 'org.springframework.boot:spring-boot-starter-web'
	implementation 'de.codecentric:spring-boot-admin-starter-client'
	compileOnly 'org.projectlombok:lombok'
	annotationProcessor 'org.projectlombok:lombok'
	testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

dependencyManagement {
	imports {
		mavenBom "de.codecentric:spring-boot-admin-dependencies:${springBootAdminVersion}"
	}
}

tasks.named('test') {
	useJUnitPlatform()
}
  • Spring Boot Admin Server와 마찬가지로 Client가 되는 서버에도 Spring Boot Admin에 대한 의존성을 추가한다.

 

 

application.properties

server.port=20000 # 클라이언트 포트
spring.boot.admin.client.instance.service-url=http://localhost:20000 # 클라이언트 주소
spring.boot.admin.client.url=http://localhost:30000 # 클라이언트와 연결할 Spring Boot Admin 서버 주소
management.endpoints.web.exposure.include=*
management.endpoint.health.show-details=always

 

 

 

두 서버를 실행

  • 사진에서 보이는 것처럼 관리 및 모니터링 대상 서버의 실시간 정보를 확인할 수 있다.

 

 

 

참고

https://jaehyun8719.github.io/2019/06/20/springboot/admin/

https://github.com/codecentric/spring-boot-admin

https://blog.naver.com/skyhool/222972599698

728x90