Spring boot 를 사용하면서, 개발은 쉬워졌지만, 모니터링에 대한 부담은 커졌다.
각 인스턴스에 대한 CPU, Memory, Heap, Thread 등 리소스 관리를 개별로 모니터링 하기란.. 정만 어려운 난제다.
이를 위해서 Spring boot에서 내놓은 것이 Actuator이다.
https://aboullaite.me/actuator-in-spring-boot-2-0/
단순한 library 추가 및 설정 Properties 만으로 Resource 를 모니터링 할수 있다.
= 구성 요소
- Spring boot actuator
- Service Discovery ( Consul / Eureka 등 )
- Spring boot Admin UI
. 이것만 있으면 된다. 그럼 어떻게?? 이렇게
* Spring boot Actuator
pom.xml 에 dependency 추가
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> <version>2.1.1.RELEASE</version> </dependency> |
application properties에 아래 설정 추가
spring.application.name=service-name spring.cloud.consul.host=localhost spring.cloud.consul.port=8500 spring.cloud.consul.discovery.enabled=true spring.cloud.consul.discovery.register=true spring.cloud.consul.discovery.prefer-ip-address=true spring.cloud.consul.discovery.health-check-interval=3s spring.cloud.consul.discovery.register-health-check=true spring.cloud.consul.discovery.instance-id=${spring.application.name}:${vcap.application.instance_id:${spring.application.instance_id:${random.value}}} spring.cloud.consul.discovery.tags=urlprefix-/${spring.application.name} management.endpoints.web.exposure.include=* management.endpoint.shutdown.enabled=true |
application.yml의 경우
spring: application: name: service-name ## Consul cloud: consul: host: localhost #enviroment property port: 8500
discovery: enabled: true register: true prefer-ip-address: true healthCheckInterval: 3s register-health-check: true instanceId: ${spring.application.name}:${vcap.application.instance_id:${spring.application.instance_id:${random.value}}} tags: urlprefix-/${spring.application.name} management: endpoints.web.exposure.include: '*' endpoint.shutdown.enabled: true |
* Service Discovery
Spring 계열이라, Eureka를 생각하겠지만, 전 Routing을 고려해서, Consul로 결정
Hashcorp 사에서 나온 오픈소스로, 그야말로 대세죠..
주의) consul을 별도로 기동해야 합니다.. 그래야 서비스에 종속적이지 않고.. service를 Discovery 할수 있음.
역시 pom.xml에 consul library 추가
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-consul-all</artifactId> <version>2.0.1.RELEASE</version> </dependency> |
* Springboot Admin UI
https://github.com/codecentric/spring-boot-admin
아직 따끈따끈한 아이지만, 보면 볼수록 괜찮다는..
별도 Project를 사용하거나 기본 서비스중 한곳에 Admin lib와 annotation을 설정해주면 됨.
상세 설정은 아래 URL 참조
http://codecentric.github.io/spring-boot-admin/current/
pom.xml에 library 추가
<dependency> <groupId>de.codecentric</groupId> <artifactId>spring-boot-admin-starter-server</artifactId> <version>2.1.2-SNAPSHOT</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> |
admin server application annotation 추가
@Configuration @EnableAutoConfiguration @EnableDiscoveryClient @EnableAdminServer public class SpringBootAdminApplication { public static void main(String[] args) { SpringApplication.run(SpringBootAdminApplication.class, args); } } |
application.yml 설정
spring: application: name: admin-ui ## Consul cloud: consul: host: localhost #enviroment property port: 8500 discovery: enabled: true register: true prefer-ip-address: true healthCheckInterval: 3s register-health-check: true instanceId: ${spring.application.name}:${vcap.application.instance_id:${spring.application.instance_id:${random.value}}} tags: management.context-path=/, health.path=/actuator/health, user.name=user, user.password=password, urlprefix-/admin profiles: active: - secure ## Admin UI boot: admin: discovery: ignored-services: "consul, fabio" context-path: /admin management: endpoints.web.exposure.include: '*' endpoint.shutdown.enabled: true |
덤으로, Routing을 위하여 fabio는 그냥 띄워주면 됨.
https://github.com/fabiolb/fabio
※ 무엇보다 중요한건, 서비스 올리기 전에, Service Discory Consul을 먼저 띄워야 한다는거..!!!
띄운 그림은 다음과 같다.
<consul> http://localhost:8500/
<fabio> http://localhost:9998 (routing은 http://localhost:9999/{서비스명} )
<admin-ui> http://localhost:8100/admin (port 사용자지정)
더이상 service instance Monitoring 많은 고민 하지 말자..