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 시작 을 표시 하 는 요청 을 합 니 다
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 비동기 전송 데 이 터 는 더욱 유리 하 다
예시 소개
예 를 들 어 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 보다 훨씬 낮 을 것 입 니 다.이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
[MeU] Hashtag 기능 개발➡️ 기존 Tag 테이블에 존재하지 않는 해시태그라면 Tag , tagPostMapping 테이블에 모두 추가 ➡️ 기존에 존재하는 해시태그라면, tagPostMapping 테이블에만 추가 이후에 개발할 태그 기반 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.