[입 개발] spring-cloud-config-server 이야기…

spring cloud 에서 가장 중요한 서버를 뽑으라면, 일단 Eureka 서버를 뽑을 수 있습니다.(아니면, concul 이나, etcd 등등등) 그런데 이 Eureka를 잘 쓰기 위해서 먼저 설정해야 할 서버가 있습니다.(사실 Eureka 는 구조를 설명할 능력이 안되므로…)

twelve factors application 개발이라는 어려운 용어를 쓰는 것에 보면, 실제 코드와 설정을 분리하라는 말이 나옵니다. 한글로 번역된 좋은 페이지가 http://12factor.net/ko/ 를 보시면 됩니다.

이런 역할이 지금 얘기할 config server 입니다. 간단하게 설명하면, 다른 서버들의 설정을 제공하는 서비스입니다. 예를 들어, 어떤 API Server 가 있다면, 설정에 자신의 서비스 이름과 config server 주소만 적어주면 됩니다. 그리고 config server 에 해당 API Server에 사용될 port 정보라든지 여러가지 설정들이 들어가게 됩니다. 보통 시작 Port는 설정 파일이나, 코드에 박혀있는 경우도 흔한데, 이럴 경우 쉽게 설정을 변경하기가 어렵습니다.

즉 config server는 바뀌기 쉬운 설정을 외부에서 받아와서 각각의 서비스를 실행하게 하자가 핵심인 겁니다. 그래서 Eureka 서버라든지, API Gateway 라든지, 모든 서비스가 config server에 접근하여 해당 설정을 가져가게 됩니다.

그래서 spring cloud 를 쓸 때 가장 먼저 고민해야 할 것들이… config server 와 Eureka의 HA나 clustering 입니다. 전에 Eureka를 통해서 클러스터 멤버쉽을 관리해주는게 어떻게 보면 spring cloud의 핵심이라고 얘기했었는데, 당장 config server 와 Eureka 가 죽어버리면… 서비스에 문제가 생기게 됩니다.(정확히는 config server나 Eureka 가 죽었을 경우 기존 설정 값을 이용하게 되지만, 신규 장비가 추가되거나 빠져야 할때 이슈가 발생하게 됩니다.)

spring_cloud_01

실제로 Config Service 의 경우는 Stateless 한 서버라, 여러 개를 띄우고, L4든… 클라이언트에서 여러 대 중에 DNS RR이든 알아서 시도하게 하면… 큰 문제가 없습니다.(즉, 기존에  옛날부터 사용되던 HA 방법이 여기에 그대로 적용될 수 있습니다.)

Spring Cloud Config Server의 동작은 실제 코드의 경우는 이것보다 훨씬 복잡하지만,  단순하게 생각하면 아래와 같은 부분이 다입니다. 여기에 Rest Request Handler만 추가되어 있는… 즉 특정 설정을 읽어서 거기 내용을 읽어온 다음, 내부적으로 관리하는 겁니다.

import java.io.*;
import java.net.*;

public class Test {
public static void main(String [] args) {
try {
URL url = new URL("https://raw.githubusercontent.com/charsyam/springboot-config-server-config/master/reservation-service.properties");
BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream()));

String inputLine;
while ((inputLine = in.readLine()) != null) {
System.out.println(inputLine);
}
in.close();
} catch (Exception e) {
}
}
}

Eureka 서버의 경우에는 Eureka Replication을 만들 수 있습니다. 그리고, 여러 대 Eureka 서버의 주소를 적어두면, 알아서, 접속을 시도하게 됩니다. Eureka의 경우는 여러 IDC에 존재할 수도 있으므로, 자신이 속해있는 IDC의 Eureka 서버로 우선 접근하게 하는 그런 옵션도 제공합니다.

이런 분산 시스템을 만들때는… SPOF(Single Point of Failure) 를 없애는게 중요합니다. 서비스 자체는 잘 만들었는데,  이런 부분을 놓치는 경우가 많기 때문에 간단하게 정리했습니다.(이제 한동안 Spring Cloud는 패스를…)