티스토리 뷰

Programming/Java

MSA 구성을 위한 기술

zepinos 2019. 9. 10. 15:27
반응형

Spring Cloud Config

Spring Cloud Config 은 설정파일을 외부(git 등)에서 관리하고 각 프로그램은 Spring Cloud Config Client(이하 Client) 을 라이브러리에 포함시킨 뒤 Spring Cloud Config Server(이하 Server) 연결 정보를 기술하면 프로그램 시작 시 Spring Boot Application Properties 정보를 자동으로 읽어올 수 있습니다. 뿐만 아니라, @RefreshScope 을 이용하면 변경된 설정 정보를 프로그램 재시작 없이 자동 반영할 수도 있습니다.

Spring Cloud Config Server

Server 에서 git 등에 정의된 설정 정보를 읽어와 Client 에 제공할 수 있습니다. 이 때 다수의 설정 정보를 체계적으로 제공하기 위해 URI 의 형태에 따라 설정 파일을 구분할 수 있습니다. 가장 쉬운 방법은 Client 의 spring.application.name 와 spring.profiles.active 을 이용해서 읽어올 설정 파일을 URI 로 구분하는 방법입니다.

Server 에서 설정해줘야 하는 기본적인 설정은 Client 가 설정 정보를 받아가기 위해 기동되어야 하는 WAS 의 포트인 server.port 와 설정 정보가 저장되어 있는 문서의 위치를 지정하는 spring.cloud.config.server 이하의 저장소 정보(git, svn 등)입니다. 추가적으로 Server 에서는 URI 을 이용해 설정 정보를 제공하기 때문에 다른 웹프로그램과 동시에 사용하게 되면 URI 를 한 쪽이 선점하게 되어 문제가 발생할 수 있습니다. 그래서 spring.cloud.config.server.prefix 설정을 이용해 특정 URI(예를 들면 /config 와 같은) 이하에서만 동작할 수 있도록 제한을 할 수 있습니다.

가장 많이 이용하는 방식은 git 저장소에 설정 정보를 저장해두는 것인데, 이 때 인증을 위해 username 와 password 을 설정에 넣어서 사용하는 방식도 제공을 하지만 개인키/공개키를 이용해서도 가져올 수 있습니다. 개인의 인증정보가 소스 저장소에 저장되어 돌아다니는 것은 좋지 않기 때문에 개인키/공개키를 이용해서 정보를 가져올 수 있도록 구성하는 것이 좋습니다.

 

아래 이미지에서는 기본 설정을 적용한 형태입니다. 위에서 설명했듯이 하나의 서버에서 여러 서비스를 제공하기 위해 prefix 을 지정했습니다. 그래서 또다른 서비스인 Eureka 와 동시 사용이 가능합니다.

그리고 저장소에서는 아래와 같이 설정 파일을 등록해서 Client 가 사용할 수 있게 합니다. 아래 이미지에서는 ribbon 에서 사용할 설정 정보를 Spring Cloud Config 을 이용해 가져올 수 있도록 설정한 것입니다.

Spring Cloud Config Client

Client 은 Server 에서 설정 정보를 가져오는 설정을 통해 외부에서 설정을 관리할 수 있도록 기능을 구성할 수 있습니다. 이 때, application proeprties 에 Server 연결 정보를 기술할 경우 Spring 의 실행 순서에 의해 미리 설정 정보를 가져올 수 없기 때문에 bootstrap properties 파일을 별도로 생성하여 먼저 연결할 수 있도록 해야 합니다.

가장 중요한 설정 정보는 spring.application.name, spring.profiles.active 와 spring.cloud.config.uri 입니다. uri 을 이용해 Server 에 접속한 뒤 application name 와 profile name 을 이용해 설정 정보를 가져올 수 있습니다. Spring Boot 에서는 보통 내장 WAS 을 이용해 자체 실행하기 때문에 spring.profiles.active 은 실행 시 -D 옵션으로 제공되는 경우가 많아 bootstrap properties 파일에서는 생략될 수 있습니다.

 

아래 이미지에서는 기본적인 bootstrap properties 을 설정한 모습을 보여줍니다. 위의 Server 설정에서 prefix 을 /config 으로 설정하였기 때문에 uri 에 /config 이 추가되어 있습니다.

Refresh Config

위에서 @RefreshScope 을 이용해 설정을 프로그램 재기동 없이 반영할 수 있다고 하였습니다. @RefreshScope 을 Class 에 지정하고 @Value 을 이용해 설정을 읽어오도록 하면 git 등에 저장해둔 값이 변경되었을 때 자동으로 반영할 수 있습니다. 하지만, 저장소에서 변경하는 즉시, 혹은 일정 시간이 지난 뒤 자동으로 반영되는 것은 아니고, Client 에 설정이 변경되었으니 다시 읽어오라고 요청해야 반영이 됩니다. 최신버젼의 Spring Boot 에서는 이러한 기능이 spring actuator 에 포함되었으며 Spring Boot 에서는 spring-boot-starter-actuator 라이브러리를 추가하면 쉽게 등록할 수 있습니다. application properties 에 다음과 같이 management.endpoints.web.exposure.include 값에 refresh 을 추가한 뒤 웹브라우져에서 /actuator/refresh 경로를 호출하면 됩니다. (구버젼에서는 actuator 없이 /refresh 을 직접 호출하도록 되어 있었습니다)

Spring Cloud Bus

Spring Cloud Bus (이하 Bus) 은 Client 의 정보 갱신 시 모든 client 에 URL 을 호출하여 갱신시켜주는 불편함을 줄이기 위해 AMPQ 을 이용해 Server 에서 Client 에 갱신하라는 지시를 보내주는 라이브러리입니다. RabbitMQ 와 Kafka 을 기본적으로 지원합니다.

하지만, RabbitMQ 와 Kafka 는 규모가 큰 시스템이기 때문에 Spring Cloud Config 만을 위해 도입하기에는 좋은 판단이 아닙니다. 최소한 Client 의 수가 매우 많아져 일일이 URL 을 호출하거나 Jenkins 와 같은 Tool 로 호출할 때 일부 장비의 장애를 감지하기 어려운 정도의 수가 운영될 때 도입을 검토하는 것이 좋습니다.

Spring Cloud Ribbon

Spring Cloud Ribbon (이하 Ribbon) 은 서버의 경로를 별도로 관리하고 Alias 로 처리하여 서버의 IP/URL 정보의 변경에 자유롭고 Ribbon 자체적으로 하나의 Alias 에 여러 서버 정보를 등록하여 부하를 분산할 수 있으며, 장애가 발생한 장비를 감지하여 이를 자동으로 제외시킬 수도 있는 기능을 제공합니다.

@RibbonClient

Spring 에서 cURL 호출을 위해서 RestTemplate 을 많이 이용합니다. Ribbon 을 이용해서 서버 목록을 프로그램이 관리하려면 @RibbonClient Annotatin 을 이용해서 RestTemplate 을 다음 이미지와 같이 확장할 수 있습니다.

이렇게 설정한 RestTemplate 을 다음 이미지와 같이 사용할 수 있습니다.

여기서 service-test 라는 경로는 DNS 에 등록된 정보가 아니라 @RibbonClient 에 name 으로 선언된 이름입니다.

그렇다면, 이 service-test 은 어떤 주소를 가리키는 걸까요? 이 정보는 Spring Boot 에서 application properties 에서 쉽게 선언할 수 있도록 해두었습니다.

(RibbonClient name).ribbon.listOfServers 에 접속할 서버 URL 을 선언해두면 Ribbon 에서 자동으로 목록 중 하나를 선택하여(이것도 순차적으로 가져올 것인지 랜덤하게 가져올 것인지 설정 가능) name 에 치환하여 요청을 보냅니다.

Spring Cloud Config 와 연동

사실 Spring Cloud Config Server 을 설명할 때 이미 Ribbon 설정이 되어 있는 환경을 보았습니다. 다시 올라가서 확인하면 위에 있는 service-test 설정이 이미 git 에 올라가 있는 것을 확인할 수 있습니다.

즉, 여러 WAS 가 같은 소스로 배포되어 있을 경우 cURL 로 호출하는 URL 이 변경되어야 할 경우 혹은 서버가 줄어들거나 늘어나야 할 경우 기존에는 소스를 수정하고 새로 배포하거나 L4/L7 을 이용해 이를 관리해야 했습니다. 하지만, Ribbon 와 Spring Cloud Config 을 이용하면 git 와 같은 저장소에서 설정을 바꾼 뒤 설정을 다시 읽게만 하면 서비스 중지나 재배포, L4/L7 재시작 없이도 간단하게 적용이 가능합니다.

@RibbonClients

@RibbonClient 을 이용해 접속할 Server 정보를 Ribbon 에서 관리할 수 있지만, 복수의 Server 가 존재할 경우 RestTemplate 을 주입(injection)받는 Class 을 서버 갯수만큼 생성해야 하는 문제가 발생할 수 있습니다. 그렇기 때문에 하나의 Class 에서 여러 서버 설정을 하기 위해 @RibbonClient 을 복수를 선언하여 사용할 수 있는 @RibbonClients 을 사용하는 것이 편리합니다.

 

아래 이미지와 같이 하나의 RestTemplate 객체에 복수의 @RibbonClient 을 등록하면 restTemplate 으로 주입받아서 사용할 때 service-test 와 service-was-test 모두 사용할 수 있습니다.

Spring Cloud Eureka

Spring Cloud Eureka (이하 Eureka) 은 Service Discovery 의 일종입니다. Ribbon 와 함께 소개되는 경우가 많은데, Ribbon 은 요청을 받는 서버의 정보를 요청할 곳에서 목록화해서 관리하고 있는 형태라서 요청할 서버에만 설정을 해두면 되는 간단한 형식이라면, Eureka 은 Eureka Server 가 요청을 받는 서버의 Eureka Client 가 보내주는 정보를 취합하여 서버로 등록해두고 요청할 서버가 요청을 받는 서버의 정보를 요구하면 이를 제공하는 형태로 구성되어 있습니다.

Eureka Server

Eureka Server 은 @EnableEurekaServer 애노테이션을 이용해 간단하게 설정할 수 있습니다. Spring Boot 에 Eureka Server 을 활성화하면 다음과 같이 상태를 조회할 수 있습니다.

기본적으로 Eureka Server 은 ROOT(/) 경로에 위와 같이 모니터링을 할 수 있는 UI 을 제공합니다. 그리고 /eureka/** 경로에 필요한 Endpoint 을 제공합니다.

Eureka Client

Eureka Client 을 사용하기 위해서는 @EnableEurekaServer 을 선언하면 간단하게 사용할 수 있습니다. 다음 이미지와 같이 application properties 에 Eureka Server 의 service url 을 등록하면 자동으로 Server 에 등록됩니다.

프로그램을 실행하면 다음과 같이 모니터링 페이지에 Client 가 등록되어 있는 것을 알 수 있습니다.

with Ribbon

Eureka Client 가 되어 Eureka Server 에 등록된 프로그램들은 자신의 정보가 Eureka Client 에 제공되어 상호 호출이 가능합니다. 이 때 Ribbon 을 이용해서 호출을 할 수 있습니다.

Ribbon 단독으로 사용할 경우 listOfServers 을 이용해 RestTemplate 으로 접속할 서버의 정보를 나열하였다면, Eureka 와 연동을 하게 되면 (server name).ribbon.eureka.enabled 을 true 으로 설정하는 것만으로 Eureka Server 에서 해당 server name 의 접속 정보를 획득하여 이를 이용할 수 있습니다. 이렇게 Eureka 을 연동하게 되면 잦은 서버의 추가/제거 상태에서 설정 파일을 계속 갱신할 필요가 없기 때문에 효율적인 서버 관리가 가능합니다.

반응형
댓글
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함