이 글은 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 |