시작이 반

[MSA] Spring Cloud ( Config, actuator refresh ) 본문

Programming/MSA

[MSA] Spring Cloud ( Config, actuator refresh )

G_Gi 2021. 8. 7. 20:57
SMALL

https://happycloud-lee.tistory.com/207

  • 분산 시스템에서 서버, 클라이언트 구성에 필요한 설정 정보(application.yml)를 외부 시스템에서 관리
  • 하나의 중앙화 된 저장소에서 구성요소 관리 가능
  • 각 서비스를 다시 빌드하지 않고, 바로 적용 가능
  • 어플리케이션 배포 파이프라인을 통해 DEV-UAT-PROD 환경에 맞는 구성 정보 사용

Local 저장소, Git저장소 등에서 관리를 할 수 있다.

 

우선 Spring Cloud Config 프로젝트를 생성하자

config server를 디펜던시로 등록한다.

 

main 클래스에 EnableConfigServer를 등록해준다.

 

application.yml 파일 (포트번호 8888)

server:
  port: 8888

spring:
  application:
    name: config-service
  profiles:
    active: native
  cloud:
    config:
      server:
        native:
          search-locations: file:///${user.home}/Desktop/GItHub/config
        git:
          uri: https://github.com/tmdrl5779/spring-cloud-config
#          username: private일때 id
#          password: private일때 pwd

여기서 local 저장소를 사용할 것인지 git저장소를 사용할 것인지 등을 설정 할 수 있다.

profiles.active: 를 통해 지정 할 수 있으며

이번 예제로는 local 저장소를 사용할 것이다.

active : native로 해주면 local저장소로 사용할 수 있다. 설정 정보가 들어있는 폴더의 위치를 작성해준다.

(default 로 하면 git 설정이 사용됨)

 

설정파일을 임의로 일단 만들어보자

 

 

이제 config-service를 실행해고 해당 주소로 접속해보자.

127.0.0.1:8888/test/default

해당 test.yml파일의 정보를 볼 수 있으며

application.yml파일의 정보도 기본으로 볼 수 있다.

 

127.0.0.1:8888/application/default 에 접속하면

application.yml파일 정보를 볼 수 있다.

 

해당 파일을 수정해보면 자동으로 감지가 되서 정보가 바뀌는 것을 볼 수 있다.

 

 

 

이제 각각의 마이크로서비스에(apigateway, user, order, catalog) configuration 정보를 읽어오기 위해 추가해보자

모든 서비스에 해당 디펜던시를 작성해준다.

또한 각 서비스에 bootstrap.yml파일을 추가해준다.

이는 application.yml파일보다 우선순위가 높은 설정파일이 생긴다.

여기에 읽어오고자 하는 config 정보를 등록한다.

uri 에는 config 서버의 주소

name 에는 설정파일로 지정하고싶은 파일의 이름을 작성하면된다. 즉, 외부에 만들었던 ( test, application 등) yml파일의 이름을 넣어주면된다.

만약에 user-service.yml 파일을 따로만들어서 관리하고싶다면 user-service프로젝트에 이 yml파일의 이름을 등록하여 해당 설정 파일을 외부에서 변경하여 따로 프로젝트를 재시작하지 않고 값들을 변경할 수 있다.

 

bootstrap.yml파일을 사용하는 이유는 원레 application.yml파일에 있던 정보를 빼서 외부에서 관리하기위함이다. 때문에 application.yml파일보다 먼저 읽혀야 한다. 

 

확인해보자.

user-service 의 health_check에서 해당 설정 값을 가져와보자.

test.yml파일에는 test: config test값이 들어있다.

 

분명 외부에 있는 값임에도 잘 읽어오는 것을 확인할 수 있다. 

 

그러면 외부의 값을 바꾸면 바로 적용이 될까??

test.yml값을 변경해주었다.

 

우선 config-server에는 바꼈는지 확인해보자.

잘 바뀐것을 볼 수 있다.

하지만 마이크로서비스에서 불러오면 그대로 이다. 

이를 바꾸기 위해서는 해당 서비스를 재실행 해야 한다.

 

바뀐 설정 정보를 적용하기 위해서는

- 서비스 재기동

- Actuator refresh

- Spring cloud bus

이렇게 3가지가 있는데 서비스를 재기동하는 것은 그냥 값을 바꾸고 재기동하는 것과 다르지 않다. 때문에 이는 비효율적인 방법이다.

 

Actuator refresh 방법을 먼저 알아보자.

우선 config 서버와 연결해준 마이크로 서비스 즉, 아래와 같은 값을 추가해준 서비스에

actuator 디펜던시를 추가해준다. ( 나는 config, apigateway, user, order, catalog 서비스 )

 

또한 내부 application.yml파일에 아래와 같은 옵션(refresh, health, beans)을 설정을 감지하고자 하는 서비스에 추가해준다. ( apigateway, user, order, catalog )

 

이제 작동하는지 확인해보자.

해당 서비스를 클릭해서 들어가면 

이렇게 나오는데 info는 등록하지 않았으니까 없는 페이지라 뜨고

우선 health를 확인해보자

작동중인 것을 확인할 수 있다. 또한 beans를 확인하면 spring에 등록된 beans를 확인할 수 있다.

 

우리는 설정 변경값을 적용해야 할려고 했으니

우선 기존값은 config test이다.

값을 바꾼다음 config server에도 적용됐는지 확인하고

 

postman을 통해 post방식으로 해당서비스의 주소로 refresh를 해주고 확인해본다.

 

서비스를 재실행 하지 않아도 값이 바뀐 것을 볼 수있다.

 

refresh는 api gateway를 통해서도 할 수 있다.

그런데 이를 위해서는 routes정보에 filters를 추가해줘야한다.

RewritePath를 작성해줘야한다. 이는 만약 api gateway를 통해 user-service에 들어온다면

gateway주소/user-service/ 이런식으로 접근을 하게 된다. 때문에 user-service의 controller에서는

이렇게 기본으로 /user-service를 인식하게 해줘야 했는데 이를 무시하게 해주는 필터이다. 이 필터를 사용하면

 

이런식으로 user-service가 무시되고 사용할 수 있다.

그러면 이렇게 api gateway를 통해 refresh또한 할 수있다.

즉 해당 서비스의 설정정보(config.name) 가 바꼈을 경우 해당 서비스 주소의 http end point로 refresh를 통해 바뀐 설정정보를 적용시킬 수 있다. 하지만 Actuator refresh는 어플리케이션 서버가 한두개면 문제가 되지 않지만 수백개의 서비스가 있을경우 각각의 어플리케이션마다 다 refresh를 수동으로 해줘야 하기 때문에 번거롭다.

 

 

너무 길어지니 3번째 방법은 다음 포스트에서 설명하겠다.....

 

<참고 : Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)>

 

 

LIST