Zipkin 활용
마이크로서비스들간의 통신에 있어서 속도 저하나 장애가 발생할 경우 해당 문제를 추적할 수 있어야한다.
이를 위해 Sleuth와 Zipkin을 활용하게된다.
먼저Sleuth는 분산된 마이크로서비스간에 트래픽의 흐름을 추적(Tracing)할 수 있도록 Trace기록을 로그에 자동 삽입해준다. Sleuth를 적용한 후 Log4j, Logback, SLF4J(Simple Logging Facade for Java)등을 사용하여 로깅하면 자동으로 로그에 서비스명, Trace id , span id 가 삽입된다.
동일한 트랙잰션에 해당하는 트래픽들에 동일한 TraceID를 부여되며 각 트래픽의 고유 id가 span id 이다.
이러한 Trace정보를 Zipkin과 같은 분산 트랜잭션 추적 시스템으로 발신하게되면 비쥬얼하게 추적과 분석이 가능해진다.
Trace정보를 Zipkin에 송부하기 위해서는 Zipkin client를 적용해야한다.
먼저 마이크로서비스들에 디펜던시를 추가해야한다.
<!-- Zipkin -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-sleuth</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zipkin</artifactId>
<version>2.2.3.RELEASE</version>
</dependency>
그 후 zipkin서버를 명시하고 어느정도의 퍼센티지로 발신할것인지를 yml에 명시한다.
spring:
application:
name : user-service
zipkin:
base-url: http://127.0.0.1:9411
enabled: true
sleuth:
sampler:
probability: 1.0
그리고 마이크로서비스에서 또 다른 마이크로서비스를 호출하는 로직에 로그를 기록해본다.
user-service에서 order-service를 호출하는 부분에 로그를 명시하였다.
log.info("Before call orders micro service");
CircuitBreaker circuitbreak = circuitBreakerFactory.create("circuitbreak");
List<ResponseOrder> orders = circuitbreak.run(()-> orderServiceClient.getOrders(userId), throwable -> new ArrayList<>());
log.info("After call orders micro service");
userDto.setOrders(orders);
해당 로직을 호출하게되면
서비스명과 traceid,spanid가 명시된것을 확인할 수 있다.
호출당한 order-service에도 똑같이 sleuth와 zipkin을 설정하면
똑같이 아이디가 찍히게되는데 user-service에서 order-service를 호출한후 리턴하는것이 하나의 트랜잭션이기 때문에 언급한대로 같은트랜잭션에선 하나의 traceid가 보여지게된다.
이제 zipkin서버를 webui로 접속하면
응답시간, 요청url 요청 메소드 등 다양한 정보를 시각적으로 제공하여 보다 편리하게 분석할 수 있게 된다.