일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- rust 강좌
- RSA
- 주말농장
- 쌈채소
- Tendermint
- for
- 물생활
- golang 강좌
- Config server
- 카디날
- 반복문
- 텐더민트
- rust
- Python 강좌
- MSSQL
- 가재
- did
- 무화과
- 분산 식별자
- rust 소개
- 분산 신원
- PKI
- 애플 달팽이
- 기본문법
- 조건문
- 치비
- Feign
- 체리새우
- 구피
- MSA
- Today
- Total
comnic's Dev&Life
[MSA]4. 마이크로 서비스 간 호출 #2 - Ribbon 본문
Java Version: 11, Spring Boot 2.1.4
[MSA]1. Config Server를 통한 설정 관리
[MSA]2. 메시지 브로커를 통한 설정값 관리
[MSA]3. 마이크로 서비스 간 호출 #1 - Feign
[MSA]4. 마이크로 서비스 간 호출 #2 - Ribbon
[MSA]5. Eureka를 통한 서비스 관리
지난 시간에는 Feign을 이용해 Interface를 만들어 타 서비스를 간단하게 호출 할 수 있었습니다. 그렇지만 여기에는 문제가 하나 있었습니다. 즉, 해당 타 서비스의 주소를 하드코딩으로 적어 주었다는 것입니다. 이는 서버의 주소가 변경되었을 때 코드를 다시 배포해야 한다는 것입니다. 그리고, 서비스의 부하를 분산하기 위해 여러 서버(컨테이너, 서비스)를 활용하기 어렵다는 것을 의미하기도 합니다.
이에, 이번 시간에는 간단한 세팅으로 도메인 네임과 클라이언트-로드밸런싱을 사용할 수 있는 Ribbon에 대한 세팅을 해 보도록 하겠습니다.
Step 1. Dependencies 설정 및 추가
- Cloud Routing / Ribbon
implementation 'org.springframework.cloud:spring-cloud-starter-netflix-ribbon'
이는 지난시간에 이미 했을 것이므로 지난 강좌를 참고 하셔도 됩니다.
Step 2. 설정(application.properties)
application.properties(yml)에 아래 설정을 추가 합니다. 물론 실제 주소는 상황에 맞게 변경 하셔야 합니다.
[서비스이름].ribbon.listOfServers 로 설정합니다. 여기서 [서비스이름]은 개인적으로 설정하고 기억하시기 바랍니다. Ribbon과 Feign 설정할 때 사용할 이름입니다. 그리고 값으로 사용할 서버의 목록을 적어 줍니다.
userinfo-server.ribbon.listOfServers=127.0.0.1:8080,127.0.0.1:8081
userinfo-server.ribbon.ServerListRefreshInterval=5000
Step 3. @RibbonClient 어노테이션 추가
Application 클래스에 @RibbonClient 어노테이션을 아래와 같이 위에서 설정한 [서비스이름]과 함께 설정합니다.
@EnableFeignClients("com.comnic.msa.serviceb")
@RibbonClient(name = "userinfo-server")
@SpringBootApplication
public class ServiceBApplication {
public static void main(String[] args) {
SpringApplication.run(ServiceBApplication.class, args);
}
}
Step 4. @FignClient 어노테이션 변경
interface의 설정값을 변경 합니다.
기존에 아래와 같이 url을 함께 적었던 것을,
@FeignClient(name="service-a", url="localhost:8080")
public interface UserServiceProxy {
@RequestMapping(value = "/getUserName", method = RequestMethod.GET)
public Map<String, String> getUserName();
}
다음처럼 설정한 [서비스이름]으로 변경합니다. url을 지우고 좀 더 의미 있는 이름으로 변경하였습니다.
@FeignClient(name="userinfo-server")
public interface UserServiceProxy {
@RequestMapping(value = "/getUserName", method = RequestMethod.GET)
public Map<String, String> getUserName();
}
이렇게 설정을 하시면, 기본적으로 Ribbon은 설정시 사용한 서버들의 목록을 round-robin방식으로 로드밸런싱 하게 됩니다. 즉 호출시마다 한번씩 번갈아가면서 서버를 선택한다는 의미 입니다. 다른 방식으로 변경도 가능하며, Ribbon의 문서를 참고하시기 바랍니다.
자, 이렇게 간단하게 설정을 마무리 했습니다.
이제 테스트를 해 보도록 하겠습니다.
Step 5. Test
로드밸런싱이 잘 되는지 테스트를 하기 위해 logger를 추가해 서비스가 호출 될때 로그를 찍도록 해 보겠습니다.
호출될 service-a의 코드를 다음과 같이 추가 합니다.
@RestController
public class UserController {
private Logger logger = LoggerFactory.getLogger(this.getClass());
@RequestMapping("/getUserName")
public Map<String, String> getUserName(@RequestParam Map<String, String> params){
logger.info("/getUserName Called.");
Map<String, String> response = new HashMap<String, String>();
response.put("result", "200");
response.put("msg", "ok");
response.put("username", "comnic");
return response;
}
}
간단하게 private Logger를 추가하고, 출력은 info를 사용했습니다.
자 이제 모든 서비스를 띄우고, 테스트 해 보겠습니다.
- rabbitMQ
- config server
- service-a:8080
- service-a:8081
- service-b
서비스가 모두 정상적으로 구동되었다면, postman을 이용해 아래와 같이 service-b의 getUserInfo를 해출해 보겠습니다.
이렇게 하면 service-b.getUserInfo() -> service-a.getUserName()을 호출해야 하는데, 서버를 2개 등록해 두었기 때문에 round-robin으로 호출을 하게됩니다. 하여, 아래와 같이 1번째 서버(8080)에 로그가 찍혔습니다.
9시 15분 55초에 호출 됐습니다.
똑같이 한번 더 호출해 보겠습니다. 왼쪽의 파란색을 보시면 아시겠지만, 8081번의 2번째 서버 입니다. 9시 16분 39초에 호출되었습니다.
순차적으로 호출되고 있는 것을 알 수 있습니다.
여기에서 마지막으로 한번만 더 호출해 보면 1번째 서버(8080)을 호출한 것을 알 수 있습니다.
9시 16분 59초에 한번 더 호출이 되었습니다.
이렇게 Feign과 Ribbon을 사용하면 타 서비스간 호출을 쉽고 편하게 할 수 있습니다.
그러나, 여기서도 아쉬운 점이 있습니다. 여전히 서버의 목록을 적는 것과 그 서버의 추가 제거 상태 등을 알 수 없다는 것입니다.
우리는 이를 해결하기 위해 다음시간에는 Eureka를 설정해 보도록 하겠습니다.
[MSA]1. Config Server를 통한 설정 관리
[MSA]2. 메시지 브로커를 통한 설정값 관리
[MSA]3. 마이크로 서비스 간 호출 #1 - Feign
[MSA]4. 마이크로 서비스 간 호출 #2 - Ribbon
[MSA]5. Eureka를 통한 서비스 관리
'MSA(MicrosofService Architecture)' 카테고리의 다른 글
[MSA]5. Eureka를 통한 서비스 관리 (0) | 2019.05.19 |
---|---|
[MSA]3. 마이크로 서비스 간 호출 #1 - Feign (0) | 2019.05.10 |
[MSA]2. 메시지 브로커를 통한 설정값 관리 (0) | 2019.04.20 |
[MSA]1. Config Server를 통한 설정 관리 (0) | 2019.04.19 |