Load Balancer
MSA는 요즘과 같이 클라우드 환경에서 동작하기에 매우 적합한 아키텍처라고 생각합니다. AWS와 같은 클라우드 서버를 제공하는 서비스에서도 트래픽이 늘어날 경우 오토 스케일링이라는 작업을 해줍니다. 이처럼 MSA는 서비스의 고가용성을 위해 동일한 서비스를 여러대를 두는 Scale-out을 쉽게 할 수 있습니다.
그렇다면 여러개의 서비스 중 과연 어떤 서비스에 Request를 해야 할까요? API Gateway에서는 특정 url 경로에 맞는 서비스로 라우팅되었습니다. 그러면 동일한 서비스에서는 어떻게 각각 라우팅을 할 수 있을까요?
Netflix에서 제공하는 Ribbon을 사용하면 서버 목록을 번갈아가면서 호출 할 수 있습니다.
Ribbon
Ribbon is a Inter Process Communication (remote procedure calls) library with built in software load balancers. The primary usage model involves REST calls with various serialization scheme support.
Ribbon을 사용하면서 직접적으로 Ribbon Client를 호출하는것보단, 이미 Spring Cloud에서 Zuul, Feign, RestTemplate 등에 Ribbon이 내장시켜두었으며 개발자는 프로퍼티 설정으로 Ribbon Client를 커스터마이징 한 후, 어노테이션만 추가하면 Ribbon을 사용할 수 있습니다.
이제 본격적으로 Ribbon을 사용해보겠습니다.
기존의 Product Service는 -Dserver.port=8081와 -Dserver.port=8082로 2개 실행해줍니다.
Ribbon을 사용하기 위해 아래의 의존성을 추가해줍니다.
ext {
set('springCloudVersion', "Hoxton.SR9")
}
dependencies {
implementation 'org.springframework.cloud:spring-cloud-starter-netflix-ribbon'
}
dependencyManagement {
imports {
mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}"
}
}
그 후 application.yml에 product 서비스에 대한 서버 목록을 작성해줍니다. 아래는 가장 기본적인 설정입니다.
product:
ribbon:
listOfServers: localhost:8081, localhost:8082
이제 서비스를 로드밸런싱을 사용하여 호출해보겠습니다. 간단합니다. 기존의 URL로 작성해둔 것을 ribbon설정의 서비스 이름으로 바꿔주면 됩니다.
RestTemplate을 사용하는 방법
간단하게 RestTemplate에 @LoadBalanced 어노테이션을 추가 한 후, url을 서비스명으로 하면 ribbon 사용이 가능해집니다.
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
...
@HystrixCommand(fallbackMethod = "getProductsFallback")
public List<Product> getProducts() {
var products = restTemplate.getForObject("http://product/products", Product[].class);
return Arrays.asList(products);
}
FeignClient를 사용하는 방법
별도의 변경 없이 기존의 FeignClient가 ribbon의 서비스명과 같게 하고 url 속성을 제거해주면 됩니다.
@FeignClient(name = "product",
fallback = FeignProductServiceFallbackImpl.class)
public interface FeignProductService {
@RequestMapping(path = "/products")
List<Product> getProducts();
}
어려운 Ribbon 설정
Ribbon은 Ribbon Client 옵션을 커스터마이징 할 수 있는 기능을 제공해줍니다. 프로그램 방식과 프로퍼티를 사용하는 방법이 있는데, 프로퍼티 방식이 좀 더 간단한거 같습니다.
차근차근 학습해야겠다.
Ribbon의 프로퍼티는 <client name>.<namespace>.<property name>=<value> 형태로 되어있고, 기본 namespace값은 ribbon입니다. client name이 없을 경우 모든 ribbon client에 설정값이 적용됩니다.
product:
ribbon:
MaxAutoRetries: 1 # 실패 후 서버 재시도 수
MaxAutoRetriesNextServer: 1 # 실패 후 다음 서버로 재시도 수
ConnectTimeout: 3000 # HttpClient의 Connection Timeout
ReadTimeout: 3000 # HttpClient의 Read Timeout
listOfServers: localhost:8081, localhost:8082 # 서버 리스트
'Spring' 카테고리의 다른 글
뭐? MSA? 그렇다면 서버를 찾아보자! Service Discovery. - 05 (0) | 2021.04.21 |
---|---|
내 코인이 떡락이라고??! Slack으로 알림 경보를 받아보자! (0) | 2021.04.20 |
뭐? MSA? 그렇다면 장애 전파를 막아보자! Circuit Breaker. - 03 (0) | 2021.04.16 |
뭐? MSA? 그렇다면 다른 서비스를 호출해보자 Service Mesh. - 02 (0) | 2021.04.14 |
OAuth2.0 + JWT를 사용한 토큰 기반 서버 인증 구현하기 (0) | 2021.04.12 |