순서상 리본을 먼저하고 유레카를 했어야하는 것 같은데 어쩌다보니까 유레카를 먼저하고 유레카 없이 리본을 해보게됐다. 실습도 실습인데 블로그에 정리하는게 정말 어렵다 ㅎㅎ 제대로 이해해야 쓸 수 있는데 어렴풋하게만 이해하고 음~되네~ 하니까 정리가 잘 안된다.
Ribbon이란? 👩🔧
클라이언트 사이드에서 로드밸런싱을 할 수 있도록 해주는 넷플릭스 OSS 중 하나다.
리본과 관련된 컨셉들 👇🏻👇🏻👇🏻👇🏻
- List of servers: 특정 서비스를 수행하는 서버의 리스트들이다. 예를 들어서 서비스1을 호출하는 클라이언트가 있다면 서비스1을 수행하는 서버들의 리스트를 말한다.
- Filtered list of servers : 위에서처럼 같은 서비스를 수행하는 여러 서버들이 있지만, 서버의 상태나 물리적으로 너무 멀어서 지연시간이 생기는 경우 이 서버들을 리스트에서 제거한다.
- Ping : 서버가 active 상태인지 아닌지 체크하는 것이다. 기본은 유레카가 체크하도록 하지만 커스텀 할 수 있다.
간단하게 Ribbon 적용해보기 🤗
서비스 호출 부분
1) Ribbon 디펜던시 가져오기
1
2
3
4
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>
pom.xml 에 ribbon 디펜던시를 가져오도록 작성한다. 나는 메이븐 사용해서 위와 같은 형태로 작성하였다.
2) 서버리스트 추가하기
위에서 말했듯이 특정 서비스를 수행하는데에는 여러 서버들이 있을 수 있고 얘네들한테 부하가 몰리지 않고 골고루 퍼지도록 하는게 부하분산(loadbalancing) 이다.
그러니까 리본이 잘 알 수 있도록 이런 서비스는 이런 서버들이 할거야 하고 알려줘야한다.
로드밸런싱을 하고자 하는 서비스를 호출하는 쪽에 서버리스트를 정의한다.
1
2
ribbon:
listOfServers: 127.0.0.1:8093, 127.0.0.1:8094
나는 서비스 하는 어플맄이션 두 개 놓을거라 리스트에 두개 추가해줬다.
앞에 해당 서비스 이름을 붙이면 서비스 별로 세팅이 가능하다는데, 일단 서비스가 하나밖에 없으니까 전체 적용되도록 서비스 이름을 안 붙였다.
3)로드밸런싱 적용하기
아주 간단하게 RestTemplate 사용해서 로드밸런싱 적용할 수 있다.
스프링에서 제공하는 로드밸런싱기능을 사용하기 위해 @LoadBalanced 어노테이션을 붙인다.
1
2
3
4
5
@LoadBalanced
@Bean
RestTemplate getRestTemplate() {
return new RestTemplate();
}
이렇게 하면 간단히 서비스에 적용할 이름으로 로드밸런싱 가능하다.
1
2
3
4
5
6
public String callService() {
String url = UriComponentsBuilder.fromHttpUrl("http://simpleRibbon/simpleRibbonEX")
.build()
.toUriString();
String response = restTemplate.getForObject(url, String.class);
여기서 simpleRibbon 이 리본이 인식할 서비스 이름이다.
원래대로라면 127.0.0.1:8094 이런식으로 지정해주어야하지만, 리본의 로드밸런싱 룰에 따라서 서버리스트들에 있는 서버들에 알아서 로드밸런싱 해준다.
서비스
1) 서비스 이름 정하기 리본이 인식할 서비스의 이름을 정해주어야한다. 위에서 simpleRibbon으로 부르기로 했으니 이 이름을 서비스를 올릴 어플리케이션에 지정해주어야한다.
1
@RibbonClient(name = "simpleRibbon")
이렇게 리본이 클라이언트로 인식할 이름을 지정해준다. 같은 서비스를 하는 서버리스트들에 모두 이렇게 지정해준다.
이렇게 아주 간단히 리본을 적용해보았다. 이건 그냥 아무런 설정도 안 건들이고 정말 리본이 되는지 확인만 해보는 것이다.
이렇게 적용하면 기본으로는 Roundrobin으로 돌아간다.
다음은 리본의 세부 설정 조정을 해보겠다.