본문 바로가기

개발/java

Spring Actuator 로 Custom Endpoint 등록 및 변수 전달

서론

옛날에 좋아했던 래퍼 배치기. Batch기 노래 들으면 배치개발 잘 됨 ㅎ

회사 정산 시스템 구축을 위해 Spring Batch 5 기반 프로젝트를 시작했다.

시스템 구축에 앞서 나는 배치를 실행 및 모니터링할 UI 를 연구하기를 맡았다.

후보는 총 3가지:

  1. 젠킨스
  2. Spring Cloud Data Flow (이하 SCDF)
  3. Spring Admin Server & Client + Actuator + Scheduler

젠킨스와 SCDF 는 이 글에선 안다루고,

3번째 옵션에 대해서 다뤄본다.


 

1. Spring Admin Server

어드민 서버는 지속적으로 Client 를 호출해 Client 의 정보를 수집해서 웹에 표시한다.

설정은 매우매우 간단하다.

build.gradle 에 의존성을 추가하고,

메인 클래스파일에 @EnableAdminServer 을 추가해주면 된다.

이렇게 하면 바로 WEB UI 가 제공된다.

TMI : 
보통 Spring Security 를 추가해서 Login 페이지를 간단하게 만들지만,
Spring Security가 Version 6 로 올라오면서 많은 부분이 바뀌었고, 23년 6월에 변경되서 자료가 많이 없어
러닝커브가 매우매우 커져 일단은 스킵한다.

 

 

2. Spring Admin Client

클라이언트는 뭘 설정해주면 될까?

당연히 라이브러리 추가 + 관리 주체인 Admin Server 의 url을 기입해야겠다.

spring.boot.admin.client.instance.name 은 admin server 에 표시될 이름,

service-url 은 자기 자신의 URL,

그 밑에 url 은 관리 주체, admin server 의 URL 을 기입한다.

그럼 이 둘이 서로 연결할 수 있다.

(물론 Spring Security 를 사용하면 csrf() disable 처리를 해줘야 한다. 근데 해줘도 계속 연결이 안되서 포기했다..)

 

 

3. Spring Actuator

이 시스템에 액추에이터는 필수적이다.

Client 설정으로 Admin Server 과 연결을 지정하고, Actuator 가 모니터링 정보를 제공하기 때문. 

Actuator를 라이브러리에 추가하고, 클라이언트의 어떤 정보를 제공할지 yml에 세팅해주면,

그 정보들이 json 형태로 노출된다.

위에 적힌 customEndpoint, env, health, metrics, logfile 전부 Endpoint 라고 부른다.

Run 콘솔에도 엔드포인트가 노출되었다고 알려준다.  (Exposing 5 endpoints)

잘 되었는지 확인하는 방법도 매우 간단하다.

아무 브라우저나 cmd curl 등 어떤 방법이든 요청만 하면 된다.

이렇게 /acutator/ (endpoint 이름) 을 입력하면 전부 확인이 가능하다.

Spring Admin Server 은 이 정보를 주기적으로 끌어와 시각화하는 것이다.

※ 여기서 중요한게 customEndpoint 이다.

말그대로 내가 정의해서 사용할 수 있는 Endpoint 이다.

/actuator/customEnpoint/특정값 을 호출하여 값을 전달하고, 함수를 실행하는 등 원하는 모든 작업이 가능하다.

위와 같이 @Endpoint(id="내가 원하는 이름") 을 설정해 정의할 수 있다.

크롬 브라우저로 customEndpoint/1 2 3 1 2 3 을 호출했고, 콘솔에 값을 받았다고 확인이 된다.

이후에 이 기능과 스케줄러, yaml 으로 연금술을 할 것이다.

 

4. Spring Scheduler

스프링 스케줄러는 말그대로 어노테이션 정의에 따라 스케줄링을 해준다.

cron 은 cron 식일테고, fixedRate 는 5초마다 실행할 것이라고 예측되고, 예측대로다.

위와 같이 application.yml 에 정의된 값을 읽어올 수도 있다. (@Value 태그와 같다)

그러면 @Scheduled(cron = "1 2 3 1 2 3") 이 되는 것이다.

 

5. Actuator + Snakeyml 으로 Yaml 수정

Actuator 로 제공된 Endpoint 중, customEndpoint 가 있었다.

이 엔드포인트를 통해 자바 함수를 호출할 수 있다.

customEndpoint 가 호출되면, 전달받은 값으로 yaml 값을 수정하고,

수정된 cron 주기로 배치 작업을 돌릴 수 있도록 하면 목적을 달성한다.

이렇게 함수를 작성하면 완성이다!
inputStream 으로 yaml 을 <String, Object> 형태의 Map 으로 받고 (여기서 호출 시 src/main/resource/ 가 기본 경로)
Map 을 수정 후, ( 하위 값들을 모두 Object 형태로 받게 된다. 그래서 (Map) 형변환 후 get을 호출한 모습 )
yaml.dump(obj) 로 String 형변환 후
FileWriter 로 실제 파일에 써준다.

다만 이 작업으로 yml 파일 속 주석이 모두 날라갔다 ㅋㅋㅋ 조심할 것.

 

반응형