comnic's Dev&Life

[MSA]1. Config Server를 통한 설정 관리 본문

MSA(MicrosofService Architecture)

[MSA]1. Config Server를 통한 설정 관리

comnic 2019. 4. 19. 16:54
반응형

Java Version: 11, Spring Boot 2.1.4

 

[MSA]1. Config Server를 통한 설정 관리
[MSA]2. 메시지 브로커를 통한 설정값 관리
[MSA]3. 마이크로 서비스 간 호출 #1 - Feign

[MSA]4. 마이크로 서비스 간 호출 #2 - Ribbon
[MSA]5. Eureka를 통한 서비스 관리

 

Step 1. Config Server 만들기

 

1. Dependencies 설정 및 추가

 - Cloud Config / Config Server

 - Ops / Actuator

 - Core / DevTools



2. MainApplication에 Annotation추가

@EnableConfigServer 추가

@EnableConfigServer
@SpringBootApplication
public class ConfigServerApplication {

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

}

 

 

3. 설정을 관리할 git setting

Config server는 설정을 아래와 같이 여러 형태로 관리 할 수 있습니다.

- git repository

- JDBC

- file system

이 중 우리는 형상관리가 가능한 git을 사용해 세팅해 보고자 합니다.

$ git init
$ vim microservice-a.properties
//내용
application.message=Hello~! TEST!!

$ vim microservice-a-dev.properties
$ vim microservice-a-local.properties
$ vim microservice-a-release.properties
$ git add .
$ git commit -m 'Init Props'

위와 같이 git을 초기화 하고,

profile별로 필요에 따라 설정 파일을 생성해 줍니다.

파일명은 [service_name-{profile}.properties]로 하는 것이 좋습니다.

 

내용은 Test에서 사용할 [application.message]를 포함합니다.

application.message=Hello~! TEST!!!

 

 

4. application.properties 설정 추가

spring.application.name=Config-Server
server.port=8888
#spring.profiles.active=native
#spring.cloud.config.server.native.search-locations=classpath:/configs
spring.cloud.config.server.git.uri=file://Users/comnic/Documents/workspace/sts/config-repo

위와 같이 git을 기준으로 repository의 위치를 설정 해 줍니다.

프로젝트의 파일을 기준으로 작동시킬 경우 위 주석을 풀면 됩니다.

 

 

5. Test

위와 같이 설정을 다 하셨다면 Config Server을 위한 모든 준비가 끝이 났습니다.

사실 코딩은 한 줄도 없이(annotation추가 빼고) 설정만으로 뚝딱 끝이난 샘입니다.

이제 실행하고 정상적으로 작동하는지 테스트 해 보도록 하겠습니다.

 

먼저 spring boot를 Run 합니다.

설정한 포트 8888번으로 접속해 확인 합니다.

간단하게 postman으로 확인 해 보도록 하겠습니다.

단순히 http://localhost:8888로 접속을 하시면 404 Not Found가 뜹니다.

endpoint는 생성한 파일 이름을 기준으로 접속하셔야 합니다.

git repository에 microservice-a.properties라고 파일을 생성하셨다며,

http://localhost:8888/microservice-a/로 접속하시면 됩니다.

혹은, microservice-a-dev.properties라고 추가적으로 만드셨다면,

http://localhost:8888/microservice-a/dev로 접속하시면 해당 내용을 보실 수 있습니다.

[http://localhost:8888/microservice-a/local 결과]

위 처럼 결과가 나온다면 Config Server가 정상 동작하는 것입니다.

 

 

 

Step 2. Config Client - Service 만들기

이제 실제 Config Server에서 설정값을 가져와서 사용하는 Client를 만들어 보도록 하겠습니다.

Config Server에 접속하기 위한 Config Client와 설정값을 가져와서 출력하는 간단한 서비스를 하나 포함하도록 해서 테스트 해 보겠습니다.

 

1. Dependencies :

 - Cloud Config / Config Client

 - Ops / Actuator

 - Core / DevTools

 - Web / Web

 

Config Client는 별도의 설정이나 코딩 없이 dependency 추가 만으로도 작동을 합니다. default로 http://localhost:8888로 서버를 찾도록 되어 있습니다. 서버를 변경하고 싶다면, bootstrap.properties나 yml파일에 spring.cloud.config.uri 값을 설정해 주시면 됩니다.

 

 

2. ApplicationConfiguration Class 생성

먼저, Config Server로 부터 설정값을 가지는 클래스를 하나 만들도록 하겠습니다. 우리의 설정 파일에서 application.message 값을 가져오도록하는 간단한 클래스입니다. @ConfigurationProperties 어노테이션을 사용해서 prefix가 application인 설정값을 가져오도록 하겠습니다.

@Component
@ConfigurationProperties("application")
@Getter @Setter
public class ApplicationConfiguration {
    private String message;
}

Lombok을 추가 하지 않았다면, message에 대한 getter와 setter를 만들어 주시면 됩니다.(setMessage, getMessage)

 

 

3. MessageController Class 생성

정말 간단한 마이크로 서비스를 하나 만듭니다. 설정값 message를 출력하는 단순한 서비스 입니다.

@RestController
public class MessageController {
    @Autowired
    private ApplicationConfiguration configuration;

    @RequestMapping("/message")
    public Map<String, String> welcome(){
        Map<String, String> map = new HashMap<String, String>();
        map.put("message",  configuration.getMessage());
        return map;
    }
}

 

이제 테스트를 위한 준비는 모두 끝났습니다.

 

 

Step 3. Test

테스트를 위해서 postman을 사용합니다. 물론, 브라우저나 curl등을 사용하셔도 무방합니다.

 

 

1. Config Server 확인

먼저 Config Server가 잘 동작하는지 확인 합니다. 위에서 확인 했지만, 정상적으로 잘 작동하고 있는지 한번 더 확인 합니다.

Config Server는 디폴트로 8888 포트를 사용합니다. endpoint는 위에서 설명드린 규칙으로 접속합니다.

[http://localhost:8888/microservice-a/local 결과]

 

위 내용 중 "propertySources"를 보면 설정값을 볼 수 있습니다.

 

 

2. Message Service 확인

 자! 이제 정말 설정값을 제대로 잘 가져오는지 간단한 서비스를 통해 테스트 해 보겠습니다.

우리가 위에서 만든 간단한 서비스인 message의 값을 반환하는 endpoint로 접속해 봅니다.

[http://localhost:8080/message 결과]

{"message": "Hello~! TEST!!!"}

잘 가져 옵니다!

 

 

3. 설정 변경과 적용 확인

 이렇게만 작동한다면 우리가 굳이 Config Server를 사용할 필요가 없겠죠?

서비스를 중단하지 않은 채 설정값을 변경하고 적용되는지 확인 해 보겠습니다.

먼저, 여기서 설정 값을 바꾸고 서버를 재시작 하지 않고 바로 확인 해 보겠습니다.

 

application.message=Hello~! TEST!! Changed!!!

 

위 처럼 설정값을 변경하고 저장 합니다.(현재 로컬에서 하는 것이라 commit은 하지 않아도 되는 듯 합니다. 만약 원격 repository를 사용한다면 commit하고 push를 하셔야 겠죠.)

 

그런데, 다시 [http://localhost:8080/message]를 호출해 보면 값이 변하지 않은 것을 알 수 있습니다,

이를 실시간으로 적용하기 위해서는 Refresh를 POST로 호출 해 주어야 한다.

 

[http://localhost:8080/actuator/refresh

method가 POST인 점에 주의 하셔야 합니다.(이는 Actuator의 endpoint이며, 버전에 따라 다른 듯 합니다.)

정상적으로 호출되면 위와 같이 변경된 내용을 알려준다.

만약, 위 처럼 호출되지 않고 404 Not Found가 뜬다면, 아래 설정값을 application.properties 파일에 추가 하면 된다.

management.endpoints.web.exposure.include=*

 

그리고, 서비스를 다시 호출해 봅니다.

[http://localhost:8080/message 결과]

변경된 내용이 적용된 것을 볼 수 있습니다.

 

이렇게 설정값을 관리 할 수 있습니다.

그런데 만약 동일한 microservice가 2대 이상 떠 있다면, 각각 refresh해 주어야 할 것입니다. 이는 상당히 불편하며, 모든 서비스의 주소를 기억(기록, 관리)하고 있어야 함을 의미 합니다. 이를 해결하기 위해 메시지 브로커를 사용할 수 있습니다.

 

다음에는 메시지 브로커를 활용한 설정값 관리를 해 보도록 하겠습니다.

 

[MSA]1. Config Server를 통한 설정 관리
[MSA]2. 메시지 브로커를 통한 설정값 관리
[MSA]3. 마이크로 서비스 간 호출 #1 - Feign

[MSA]4. 마이크로 서비스 간 호출 #2 - Ribbon
[MSA]5. Eureka를 통한 서비스 관리

 

반응형
Comments