이번 블로그에서는 클라이언드 사이드 로드 밸런싱 패턴에 대해 알아보고 해당 패턴을 구현해보겠습니다. 자세한 내용은 GIT-client-loadbalancing 브랜치에서 알아보실 수 있습니다.
네트워크 트래픽을 여러 서버로 분산시켜 서버의 부하를 줄이고, 시스템의 성능과 가용성을 높이는 기술입니다.
두가지 종류가 있지만 이번 블로그에서는 클라이언트 사이드 로드 밸런싱에 관해서 정리하고 알아보겠습니다.
클라이언트가 직접 여러 서버 중 하나를 선택하여 요청을 보내는 방식으로 서버의 목록을 가지고 있으며 이를 바탕으로 로드 밸런싱을 수행하는것입니다.
Spring Cloud에서 제공하는 HTTP 클라이언트로, 선언적으로 RESTful 웹 서비스를 호출할 수 있고 Eureka와 같은 디스커버리와 연동하여 동적으로 서비스 인스턴스를 조회하고 로드 밸런싱을 수행합니다.
넷플릭스가 개발한 클라이언트 사이드 로드 밸런서로, 마이크로서비스 아키텍처에서 서비스 인스턴스 간의 부하를 분산시키고 또한, 다양한 로드 밸런싱 알고리즘을 지원하며, Eureka와 같은 서비스 디스커버리와 연동하여 사용할 수 있습니다.
구현할 구성도는 아래와 같습니다.
dependencies {
implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client'
implementation 'org.springframework.cloud:spring-cloud-starter-openfeign'
}
위와 같이 client에 해당하는 곳에 의존성을 추가해줍니다.
@SpringBootApplication
@EnableFeignClients
public class ProductApplication {
public static void main(String[] args) {
SpringApplication.run(ProductApplication.class, args);
}
}
@EnableFeignClients 어노테이션을 사용하여 FeignClients를 활성화 해줍니다.
@RestController
public class ProductController {
@Value("${server.port}")
private String port;
@GetMapping("/product/{id}")
public String getProduct(@PathVariable String id) {
return "Product " + id + " info!!!!! From port : " + port;
}
}
application.yml 설정입니다.
spring:
application:
name: product-service
server:
port: 19092
eureka:
client:
service-url:
defaultZone: http://localhost:19090/eureka/
인텔리제이의 구성편집에서 복사를 한 후 vm옵션을 사용하여 19093,19094를 추가해줍니다.
위와 같이 하면 product 설정은 끝이납니다.
위 product설정과 같이 진행하면 됩니다.
서비스 호출을 수행하는 인터페이스를 구현합니다.
@FeignClient(name = "product-service")
public interface ProductClient {
@GetMapping("/product/{id}")
String getResponse(@PathVariable("id") String id);
}
@RestController
@RequiredArgsConstructor
public class OrderController {
private final OrderService orderService;
@GetMapping("/order/{orderId}")
public String getOrder(@PathVariable String orderId) {
return orderService.getOrder(orderId);
}
}
order쪽 application.yml 설정입니다.
@Service
@RequiredArgsConstructor
public class OrderService {
private final ProductClient productClient;
public String getProductInfo(String productId) {
return productClient.getProduct(productId);
}
public String getOrder(String orderId) {
if(orderId.equals("1") ){
String productId = "2";
String productInfo = getProductInfo(productId);
return "Your order is " + orderId + " and " + productInfo;
}
return "Not exist order...";
}
}
spring:
application:
name: order-service
server:
port: 19091
eureka:
client:
service-url:
defaultZone: http://localhost:19090/eureka/
위와 같이 모든 파일의 설정이 끝났다면 Eureka 서버 -> order -> product 3개 순으로 실행을 하면 됩니다.
실행 후 유레카 서버에 접속을 하면
와 같이 product 3개 order 1개가 떠있는 것을 확인할 수 있습니다.
위와 같이 라운드 로빈이 일어나는 것을 확인 할 수 있고 구현을 마무리 해보도록 하겠습니다.