본문 바로가기

Spring

(183)
[Spring Cloud] Zipkin & Sleuth 이전 장(링크) 에서는 장애 처리를 위한 CircuitBreaker와 Resilience4J에 대해서 알아보았다. 이번 장에서는 분산 환경에서의 추적을 위한 Zipkin과 Spring Cloud Sleuth에 대해서 알아본다. 모든 소스 코드는 깃 허브 (링크) 에 올려두었다. 개요 Zipkin은 오픈소스로써 Twitter에서 사용하는 분산 환경의 Timing 데이터 수집, 추적을 위한 시스템이다. Google Drapper에서 발전하였으며 분산 서비스 환경에서 시스템 병목 현상을 파악하기 위해 사용된다. 아래의 그림처럼 Collector, Query Service, Databasem WebUI로 구성되어 있다. Span은 하나의 요청에 사용되는 작업의 단위로 64bit의 고유한 ID다. Trace는 트..
[Spring Cloud] 장애 처리 - CircuitBreaker 이번 장에서는 장애 처리을 위해 CircuitBreaker와 Resilience4J에 대해서 학습한다. 모든 소스 코드는 깃 허브 (링크) 에 올려두었다. 개요 우리의 마이크로서비스들은 HTTP 요청 하나를 처리하기 위해 필요한 다른 서비스의 API를 호출하면서 필요한 데이터를 만든다. 만약 우리가 장애에 대한 처리를 따로 하지 않는다면 아래의 이미지와 같이 하나의 서비스에서 장애가 발생하면 다른 서비스까지 장애가 전파된다. 하지만 우리가 원하는 결과는 이러한 그림이 아닐 것이다. 하나의 서비스가 문제가 있더라도 아래의 이미지와 같이 다른 서비스에서 만든 데이터는 정상적으로 클라이언트에게 전달하고 싶을 것이다. 이렇게 작동하도록 유도해주는 것이 CircuitBreaker다. CircuitBreaker의 ..
[Reactive Programming] Rest Template - 복합 Spring WebFlux Series - 12 이전 장(링크) 에서는 AsyncRestTemplate과 DeferredResult를 통해서 비동기 컨트롤러를 구현하였다. 이번 장에서는 두 기술을 사용하여 여러 외부 통신을 통해서 복잡한 요청구조를 어떻게 처리하는지에 대해서 알아본다. 모든 코드는 깃 허브 (링크)의 테스트 코드에 있으므로 필요하다면 참고하도록 한다. 개요 복잡한 요청 구조라고 하면 조금 추상적으로 느껴질 수 있다. 이전에 살펴보았던 링크드인의 발표자료를 다시 한 번 살펴본다. Profile frontend를 보면 Profile backend, Search backend, Company backend를 직접 요청하여 조합된 결과를 클라이언트에게 반환하고 있다. 이렇게 한 번에 여러개의 외..
[Reactive Programming] Rest Template - Async Spring WebFlux Series - 11 우리는 이전 장(링크) 에서 링크드인의 발표자료를 보면서 서비스간의 통신으로 인한 블로킹 현상에 대해서 알아보았다. 이번 장 에서는 이러한 블록킹 문제를 해결하기 위한 방법에 대해서 알아본다. 모든 코드는 깃 허브 (링크)의 테스트 코드에 있으므로 필요하다면 참고하도록 한다. 원격지 서비스 추가 HTTP Client 코드 개선 MvcV2Client 코드는 MvcClient 코드에 CyclicBarrier를 추가하여 스레드 동기화를 구현해두었다. 이번에 추가되는 MyClient는 MvcV2Client의 요청 URL에 index값을 추가하도록 수정하고 리턴값을 출력하도록 수정하였다. MyClient @Slf4j @EnableAsync public class M..
[Spring Cloud] 다중 마이크로서비스 데이터 동기화 이전 장(링크) 에서는 마이크로서비스 간의 데이터 동기화 문제를 해결하기 위하여 Kafka Connect를 사용해보았다. 이번 장에서는 동일한 역할을 하는 여러 서비스와 하나의 DB가 있을 때 Kafka를 사용하여 데이터를 동기화하는 방법에 대해서 알아본다. 모든 소스 코드는 깃 허브 (링크) 에 올려두었다. Service Flow 전체적인 서비스 흐름을 살펴보면 아래의 이미지와 같다. 여러 클라이언트가 유저 서비스에게 유저 정보 API를 호출한다. 유저 서비스는 주문 정보를 만들기 위해서 주문 서비스의 API를 호출해야하고 FeignClient 또는 RestTemplate을 통해 분산되어있는 주문 서비스를 호출하게 된다. 주문 서비스는 DB에 데이터를 넣기 위해 직접 SQL을 실행하는 것이 아니라 Ka..
[Reactive Programming] Rest Template - Blocking Spring WebFlux Series - 10 우리는 지금까지 Future, @Async, Modern, Stress Test를 통해서 자바와 스프링의 원시적인 비동기 기술에 대해서 학습하였다. 이번 장에서는 링크드인의 발표자료를 보면서 서비스간에 통신으로 인해 발생하는 블록킹과 JMC 툴, CyclicBarrier를 통한 스레드 동기화에 대해서 알아보도록 한다. 모든 코드는 깃 허브 (링크)의 테스트 코드에 있으므로 필요하다면 참고하도록 한다. 개요 하나는 Callable을 사용하여 서블릿이 HTTP 요청을 받았을 때 뒤에 있는 워커 스레드에게 할당하고 서블릿 스레드는 빠르게 반납되어 처리되어 다음 요청을 처리하는 ???에 대해서 학습하였다. 다른 하나는 DeferredResult라는 결과를 쓸 수 ..
[Spring Cloud] Kafka를 사용한 서비스간 데이터 동기화 이번 장에서는 우리 서비스에서 발생하는 데이터 동기화 문제를 해결하기 위해 Kafka를 적용시켜본다. 모든 소스 코드는 깃 허브 (링크) 에 올려두었다. 개요 우리는 지금까지 주문 서비스를 분산하게 되면서 DB 또한 동시에 분산되어 데이터의 동기화에 문제가 발생하는 것을 확인하였다. 이러한 문제를 해결하기 위해 Kafka와 추가 기능인 Source Connect, Sink Connect에 대해서 알아보았다. 이번 장에서는 우리가 학습한 Kafka를 활용하여 마이크로서비스 간에 발생하는 문제를 하나씩 해결해본다. 사용자는 주문 서비스를 통해 상품을 주문한다. 사용자는 자신의 주문 목록을 확인하기 위해 유저 서비스에 사용자 조회와 주문 확인 기능을 요청한다. 개선되는 구조를 확인해보면 주문 서비스는 주문을 ..
[Reactive Programming] 자바 & 스프링 비동기 기술 - Stress Test Spring WebFlux Series - 9 지금까지 우리는 자바의 Future(링크) 와 스프링의 Async(링크) 를 학습하면서 자바와 스프링의 비동기 기술에 대해서 알아보았다. 이번 장에서는 동기 방식과 비동기 방식으로 작성되어 있는 컨트롤러 코드를 부하 테스트를 통하여 성능을 확인하는 시간을 가져본다. 모든 코드는 깃 허브 (링크)의 테스트 코드에 있으므로 필요하다면 참고하도록 한다. 부하 테스트 설정 지금까지 계속 비동기 서블릿 방식으로 웹 개발을 해야 한정된 자원을 활용하여 더 많은 요청을 처리할 수 있다고 학습하였다. 정말로 우리가 학습한 내용이 맞는지 부하 테스트를 진행하여 결과를 확인해본다. 결과를 확인하기에 앞서 이번 단계에서는 스레드 상태를 직접 눈으로 확인하기 위해 VisualVM..