Spring Cloud Sleuth 통합 zipkin 프로 세 스 분석

이 글 은 주로 Spring Cloud Sleuth 통합 zipkin 과정 분석 을 소개 하 였 으 며,예시 코드 를 통 해 매우 상세 하 게 소개 되 어 있 으 며,여러분 의 학습 이나 업무 에 대해 어느 정도 참고 학습 가치 가 있 으 므 로 필요 한 분 들 은 참고 하 시기 바 랍 니 다.
SpringCloud Sleuth 안내
Spring Cloud Sleuth 는 Spring Cloud 를 위해 분포 식 추적 솔 루 션 을 실현 했다.
Spring Cloud Sleuth 는 Dapper 의 용 어 를 참고 했다.
Span:기본 적 인 작업 단원.Span 은 64 비트 의 유일한 ID,64 비트 trace 코드,설명 정보,타임 스탬프 이벤트,key-value 주석(tags),span 프로세서 의 ID(보통 IP)를 포함 합 니 다.
Trace:Span 으로 이 루어 진 나무 구조 입 니 다.
Annotation:존재 하 는 사건 을 제때에 기록 하 는 데 사 용 됩 니 다.자주 사용 하 는 Annotation 은 다음 과 같 습 니 다.
cs:클 라 이언 트 발송(client send)클 라 이언 트 가 span 시작 을 표시 하 는 요청 을 합 니 다
  • sr:서버 수신(server received)서버 가 클 라 이언 트 의 요청 을 받 고 처 리 를 시작 합 니 다.sr-cs 의 시간 은 네트워크 지연 입 니 다
  • ss:서버 전송(server send)서버 가 요청 을 처리 하고 클 라 이언 트 에 게 데 이 터 를 되 돌려 줄 준 비 를 합 니 다.ss-sr 의 시간 은 서버 측 처리 요청 에 걸 린 시간 을 나타 낸다
  • cr:클 라 이언 트 수신(client received)클 라 이언 트 가 처리 결 과 를 받 은 것 은 span 이 끝 났 음 을 나타 낸다.cr-cs 의 시간 은 클 라 이언 트 가 서버 데 이 터 를 받 는 시간 을 나타 낸다
  • 다음 그림 은 Span 과 Trace 가 시스템 에서 의 관 계 를 보 여 준다.

    Sleuth 는 기본적으로 Http 방식 으로 span 을 Zipkin 에 전송 합 니 다.
    application.properties 파일 에 지정
    
    spring.zipkin.sender.type=web
    RabbitMQ 비동기 로 span 메시지 보 내기
    왜 RabbitMQ 메시지 미들웨어 를 선택 하여 span 메 시 지 를 보 냅 니까?
    4.567917.sleuth 는 기본적으로 http 통신 방식 을 사용 하여 데 이 터 를 zipkin 에 게 페이지 렌 더 링 을 하지만 http 전송 과정 에서 저항 할 수 없 는 요소 로 http 통신 이 중단 되면 이번 통신 의 데 이 터 를 잃 어 버 릴 것 입 니 다.중간 부품 을 사용 하면 RabbitMQ 메시지 대기 열 에 천만 단계 의 메시지 가 쌓 일 수 있 으 며,다음 에 다시 연 결 된 후에 도 계속 소비 할 수 있 습 니 다4.567917.스 레 드 가 증가 함 에 따라 병발 량 이 증가 한 후에 RabbitMQ 비동기 전송 데 이 터 는 더욱 유리 하 다
  • RabbitMQ 는 메시지,대기 열 이 지속 되 는 것 을 지원 하고 메시지 상태 가 라 이브 러 리 에 떨 어 지 거나 대기 열,미 러 대기 열 등 기술 수단 을 통 해 높 은 사용 을 보장 할 수 있 습 니 다
  • 예시
    예시 소개
    예 를 들 어 sleuth-search,sleuth-cart,sleuth-order 세 가지 시스템 을 포함 하여 전자상거래 시스템 에서 주문 하 는 절 차 를 모 의 할 수 있 습 니 다.사용 자 는 상품 을 검색 한 후에 바로 주문 할 수도 있 고 여러 상품 을 검색 한 후에 카 트 에 가입 할 수도 있 습 니 다.그 다음 에 주문 할 수도 있 습 니 다.호출 상황 은 search->cart->order 또는 search->order 입 니 다.
    예 를 들 어 RestTemplate 를 사용 하여 세 시스템 간 http 요청 응답 을 완성 하고 요청 방식 도 Restful 스타일 을 따 릅 니 다.
    버 전 설명
    버 전 은 반드시 잘 대응 해 야 합 니 다.일부 저 버 전의 SpringBoot 는 새로운 버 전의 SpringCloud 와 zipkin 을 호 환 할 수 없습니다.
    공구.
    판본
    SpringBoot
    2.1.6.RELEASE
    SpringCloud
    Greenwich.SR3
    zipkin
    2.16.2
    프로젝트 구조
    
    demo-cloudsleuth
      |- sleuth-search
      |- sleuth-cart
      |- sleuth-order
      pom.xml
    가 져 오기 의존
    
      <!--    springboot   springcloud     -->
      <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.6.RELEASE</version>
        <relativePath/>
      </parent>
      <dependencyManagement>
        <dependencies>
          <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>Greenwich.SR3</version>
            <type>pom</type>
            <scope>import</scope>
          </dependency>
        </dependencies>
      </dependencyManagement>
    
      <dependencies>
        <dependency>
          <groupId>org.springframework.cloud</groupId>
          <artifactId>spring-cloud-starter-zipkin</artifactId>
        </dependency>
        <dependency>
          <groupId>org.springframework.amqp</groupId>
          <artifactId>spring-rabbit</artifactId>
        </dependency>
        <!-- Springboot    -->
        <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-test</artifactId>
          <scope>test</scope>
        </dependency>
      </dependencies>
    RestTemplate 를 설정 합 니 다.RestTemplate 는 SpringBoot 가 제공 하 는 봉 인 된 http 도구 클래스 로 http 의 사용 을 간소화 하 는 데 도움 을 줄 수 있 습 니 다.
    
    package com.anqi.cart.resttmplate;
    
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.http.client.ClientHttpRequestFactory;
    import org.springframework.http.client.SimpleClientHttpRequestFactory;
    import org.springframework.web.client.RestTemplate;
    
    @Configuration
    public class RestTemplateConfig {
      @Bean
      public RestTemplate restTemplate(ClientHttpRequestFactory factory) {
        return new RestTemplate(factory);
      }
    
      @Bean
      public ClientHttpRequestFactory clientHttpRequestFactory() {
        SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();
        factory.setConnectTimeout(5000);
        factory.setReadTimeout(5000);
        return factory;
      }
    }
    세 시스템 의 application.properties,포트 는 각각 8081 8082 8083 입 니 다.
    
    #server.port=8081 server.port=8082
    server.port=8083 
    server.servlet.context-path=/
    
    spring.zipkin.base-url=http://localhost:9411/
    spring.zipkin.service.name=sleuth-cart
    
    #     http      span       
    #spring.zipkin.sender.type=web
    
    #sleuth    rabbitmq    zipkin     
    spring.zipkin.sender.type=rabbit
    spring.rabbitmq.host=localhost
    spring.rabbitmq.port=5672
    spring.rabbitmq.username=guest
    spring.rabbitmq.password=guest
    
    #         0.1         percentage         probability
    spring.sleuth.sampler.probability=1
    http 요청 을 간소화 하기 위해 세 시스템 의 RestTemplate 설정
    
    package com.anqi.cart.resttmplate;
    
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.http.client.ClientHttpRequestFactory;
    import org.springframework.http.client.SimpleClientHttpRequestFactory;
    import org.springframework.web.client.RestTemplate;
    
    @Configuration
    public class RestTemplateConfig {
      @Bean
      public RestTemplate restTemplate(ClientHttpRequestFactory factory) {
        return new RestTemplate(factory);
      }
    
      @Bean
      public ClientHttpRequestFactory clientHttpRequestFactory() {
        SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();
        factory.setConnectTimeout(5000);
        factory.setReadTimeout(5000);
        return factory;
      }
    }
    
    @RequestMapping("cart")
    @RestController
    public class CartController {
      @Autowired
      RestTemplate restTemplate;
      @Autowired
      CartService cartService;
      private static final String orderUrl = "http://localhost:8084/order/create";
    
      @GetMapping("/add/{cartId}")
      public String addToCart(@PathVariable("cartId") String cartId) {
        cartService.addProductToCart(cartId, "  8");
        ResponseEntity<String> res = restTemplate.getForEntity(orderUrl, String.class);
        return res.getBody();
      }
    }
    
    @RequestMapping("order")
    @RestController
    public class OrderController {
      @GetMapping("/create")
      public String creatOrder() {
        System.out.println("create order");
        return "create_order";
      }
    }
    
    @RestController
    public class SearchController {
      @Autowired
      RestTemplate restTemplate;
    
      private static final String cartUrl = "http://localhost:8083/cart/add/1";
      private static final String orderUrl = "http://localhost:8084/order/create";
    
      @GetMapping("/search")
      public String search() {
        ResponseEntity<String> cartRes = restTemplate.getForEntity(cartUrl, String.class);
        ResponseEntity<String> orderRes = restTemplate.getForEntity(orderUrl, String.class);
        return "cart:" + cartRes.getBody() + "- order:" + orderRes.getBody();
    
      }
    }
    실행 결과 분석
    기본 http 전송 span 정보
    Zipkin 시작
    
    java -jar zipkin-server-2.16.2-exec.jar
    웹 페이지 수 동 접근
    
    http://localhost:8082/search
    우 리 는 zipkin 사이트 에 방문 하여 호출 상황 을 조회 합 니 다.
    
    http://localhost:9411/zipkin/traces/94b954d843012ca9
    아래 그림 에서 세 시스템 의 호출 관 계 를 완전 하고 뚜렷하게 볼 수 있다.

    다음 그림 은 zipkin 호출 미리 보기 입 니 다.네 번 요청 합 니 다.http://localhost:8082/search보다 직관 적 으로 데 이 터 를 관찰 하 다.다음 인터페이스 에서 Span 의 개수 와 호출 지연 을 간결 하 게 표시 합 니 다.

    우 리 는 완전한 호출 체인 에 들 어간 후에 그 중의 한 노드 를 방문 하여 다음 과 같은 데 이 터 를 얻 을 수 있다.

    다음은 전체 링크 추적 에 대한 상세 한 정보 로 7 개의 span 의 모든 정 보 를 포함 하고 상기 에서 본 페이지 는 모두 다음 과 같은 데 이 터 를 보 여 줍 니 다.
    
    [
     {
      "traceId": "94b954d843012ca9",
      "parentId": "bab70b1e69a5f3e3",
      "id": "96387b33a823ca8f",
      "kind": "SERVER",
      "name": "get /order/create",
      "timestamp": 1569060494069123,
      "duration": 1161,
      "localEndpoint": {
       "serviceName": "sletuth-order",
       "ipv4": "192.168.0.107"
      },
      "remoteEndpoint": {
       "ipv4": "127.0.0.1",
       "port": 49863
      },
      "tags": {
       "http.method": "GET",
       "http.path": "/order/create",
       "mvc.controller.class": "OrderController",
       "mvc.controller.method": "creatOrder"
      },
      "shared": true
     },
     {
      "traceId": "94b954d843012ca9",
      "parentId": "94b954d843012ca9",
      "id": "90f7e5cfa89e0d80",
      "kind": "SERVER",
      "name": "get /order/create",
      "timestamp": 1569060494076287,
      "duration": 1296,
      "localEndpoint": {
       "serviceName": "sletuth-order",
       "ipv4": "192.168.0.107"
      },
      "remoteEndpoint": {
       "ipv4": "127.0.0.1",
       "port": 49864
      },
      "tags": {
       "http.method": "GET",
       "http.path": "/order/create",
       "mvc.controller.class": "OrderController",
       "mvc.controller.method": "creatOrder"
      },
      "shared": true
     },
     {
      "traceId": "94b954d843012ca9",
      "parentId": "94b954d843012ca9",
      "id": "bab70b1e69a5f3e3",
      "kind": "CLIENT",
      "name": "get",
      "timestamp": 1569060494063693,
      "duration": 10374,
      "localEndpoint": {
       "serviceName": "sleuth-search",
       "ipv4": "192.168.0.107"
      },
      "tags": {
       "http.method": "GET",
       "http.path": "/cart/add/1"
      }
     },
     {
      "traceId": "94b954d843012ca9",
      "parentId": "94b954d843012ca9",
      "id": "90f7e5cfa89e0d80",
      "kind": "CLIENT",
      "name": "get",
      "timestamp": 1569060494074966,
      "duration": 2848,
      "localEndpoint": {
       "serviceName": "sleuth-search",
       "ipv4": "192.168.0.107"
      },
      "tags": {
       "http.method": "GET",
       "http.path": "/order/create"
      }
     },
     {
      "traceId": "94b954d843012ca9",
      "id": "94b954d843012ca9",
      "kind": "SERVER",
      "name": "get /search",
      "timestamp": 1569060494062631,
      "duration": 16332,
      "localEndpoint": {
       "serviceName": "sleuth-search",
       "ipv4": "192.168.0.107"
      },
      "remoteEndpoint": {
       "ipv6": "::1",
       "port": 49859
      },
      "tags": {
       "http.method": "GET",
       "http.path": "/search",
       "mvc.controller.class": "SearchController",
       "mvc.controller.method": "search"
      }
     },
     {
      "traceId": "94b954d843012ca9",
      "parentId": "bab70b1e69a5f3e3",
      "id": "96387b33a823ca8f",
      "kind": "CLIENT",
      "name": "get",
      "timestamp": 1569060494067090,
      "duration": 3197,
      "localEndpoint": {
       "serviceName": "sleuth-cart",
       "ipv4": "192.168.0.107"
      },
      "tags": {
       "http.method": "GET",
       "http.path": "/order/create"
      }
     },
     {
      "traceId": "94b954d843012ca9",
      "parentId": "94b954d843012ca9",
      "id": "bab70b1e69a5f3e3",
      "kind": "SERVER",
      "name": "get /cart/add/{cartid}",
      "timestamp": 1569060494066140,
      "duration": 8150,
      "localEndpoint": {
       "serviceName": "sleuth-cart",
       "ipv4": "192.168.0.107"
      },
      "remoteEndpoint": {
       "ipv4": "127.0.0.1",
       "port": 49862
      },
      "tags": {
       "http.method": "GET",
       "http.path": "/cart/add/1",
       "mvc.controller.class": "CartController",
       "mvc.controller.method": "addToCart"
      },
      "shared": true
     }
    ]
    RabbitMQ 사용 현황
    zipkin 시작,인자 주의
    
    java -jar zipkin-server-2.16.2-exec.jar --RABBIT_ADDRESSES=localhost:5672 --RABBIT_USER=guest --RABBIT_PASSWORD=guest --RABBIT_VIRTUAL_HOST=/
    rabbitmq 시작
    
    rabbitmq-server
    테스트 를 할 때 mq 와 이상 방식 의 지연 은 차이 가 별로 없 지만 스 레 드 수가 증가 함 에 따라 병발 량 이 증가 함 에 따라 mq 전송 지연 은 http 보다 훨씬 낮 을 것 입 니 다.
    이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

    좋은 웹페이지 즐겨찾기