comnic's Dev&Life

[MSA]4. 마이크로 서비스 간 호출 #2 - Ribbon 본문

MSA(MicrosofService Architecture)

[MSA]4. 마이크로 서비스 간 호출 #2 - Ribbon

comnic 2019. 5. 17. 09:25
반응형

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를 통한 서비스 관리

 

 

 

반응형
Comments