Application Modernization/Service Mesh

Ribbon : Load Balancer

Cloud Applicaiton Architect 2021. 8. 31. 23:00
반응형

이 글은 2019년에 작성된 필자 소유의 네이버 블로그에서 가져왔습니다.

 

MSA 환경에서 서비스와 서비스는 서로 종속적인 관계를 가질 수 밖에 없습니다. 대부분의 서비스들은 그 중요성에 따라 이중화 시스템으로 구축될 가능성이 높습니다. 이런 점을 고려해 볼 때 이중화 되는 서비스 별로 L4스위치와 같은 장비를 구매한다는 것은 비용적으로 부담스러울 수 밖에 없습니다.

Netflex는 이런 점에 착안 Ribbon이라고 하는 SW적인 로드 발란서를 만들었으며 이를 통해 호출하는 서비스에서 호출되는 서비스들에 대한 소프트웨어 적인 Road Balancing이 가능하도록 했습니다.

 

 

Ribbon은

- REST API를 호출하는 서비스에 탑제되는 SW 모듈

- 주어진 서버 목록에 대해 Load Balancing 수행

- 매우 다양한 설정이 가능(서버선택, 실패시 Skip시간, Ping체크 등등)

- Ribbon에는 Retry 기능이 내장되어 있음

- Eureka와 함께 사용되어 매우 강력한 기능 발휘

 

Ribbon 장점

- H/W가 필요 없이 SW 적으로 구현

- 서버 목록의 동적 변경이 자유로움

 

사용법

1. org.springframework.cloud의 spring-cloud-starter-netflex-ribbon 라이브러리 추가

ex) gradle: compile(‘org.springframework.cloud:spring-cloud-starter-netflex-ribbon’)

2. 연결할 서비스 URL을 호출하는 메소드에 @LoadBalanced annotation 추가

EX)

  • 0열 선택0열 다음에 열 추가
  • 0행 선택0행 다음에 행 추가
  • 1행 선택1행 다음에 행 추가

셀 전체 선택

열 너비 조절

행 높이 조절

ServiceAApplication.java
public class ServiceAApplication {


   /*
      이 예에서는 URL 호출을 위해 Spring의 RestTemplate 클래스를 사용
   */
   @Bean
   @LoadBalanced
   public RestTemplate restTemplate() {
      return new RestTemplate();
   }


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


}
  • 셀 병합
  • 행 분할
  • 열 분할
  • 너비 맞춤
  • 삭제

 

3. 호출 URL의 IP주소를 이름등으로 변경

Ex:

  • 0열 선택0열 다음에 열 추가
  • 0행 선택0행 다음에 행 추가

셀 전체 선택

열 너비 조절

행 높이 조절

// private final String url = “http://localhsot:8082/serviceBApi”;
private final String url = “http://servieB/serviceBApi”;
  • 셀 병합
  • 행 분할
  • 열 분할
  • 너비 맞춤
  • 삭제

 

4. 호출하는 서비스의 application.yml 파일을 이용해 3에서 지정한 Ribbon의 이름을 실제 서버로 맵핑

  • 0열 선택0열 다음에 열 추가
  • 0행 선택0행 다음에 행 추가

셀 전체 선택

열 너비 조절

행 높이 조절


serviceB:
ribbon:
listOfServers: localhost:8082
  • 셀 병합
  • 행 분할
  • 열 분할
  • 너비 맞춤
  • 삭제

 

5. 기타 retry 기능 추가

  • 0열 선택0열 다음에 열 추가
  • 0행 선택0행 다음에 행 추가

셀 전체 선택

열 너비 조절

행 높이 조절


serviceB:
ribbon:
listOfServers: localhost:8082, localhost:8083
MaxAutoRetries: 0
MaxAutoRetriesNextServer: 1 #실패시 다른 서버로 재시도 하는 횟수
  • 셀 병합
  • 행 분할
  • 열 분할
  • 너비 맞춤
  • 삭제

서버 두대 중 한대라도 살아있으면 Load Balancing & Retry로 항상 통신 성공

※ Ribbon의 Load Balance는 기본적으로 Round Robin 방식을 사용합니다.

단, Retry를 시도하더라도 HystrixTimeout이 발생하면, 즉시 에러가 리턴 될 수 있습니다.(Hystrix로 Ribbon을 감쌌기 때문에)

 

이번 포스팅은 여기까지 입니다.

 

실습은 Hystrix, Ribbon, Eureka, Zuul을 포함해 하나의 예제로 별도 포스팅 하겠습니다

 

감사합니다.

 

반응형

'Application Modernization > Service Mesh' 카테고리의 다른 글

istio와 envoy 란  (0) 2021.09.05
OpenFeign 간단 예제  (0) 2021.09.01
OpenFeign 이란?  (0) 2021.09.01
Eureka : Service Discovery  (0) 2021.08.31
Hystrix : Circuit Breaker  (0) 2021.08.31