文章分三部分:
- spring-cloud-sleuth快速上手
- zipkin-brave的demo及源码(https://cloud.tencent.com/developer/article/1884429)
- spring-cloud-sleuth源码(https://cloud.tencent.com/developer/article/1886833)
spring-cloud-sleuth整合zipkin的quickstart
在之前工作中,接手到一个项目日志没有规范,问题还贼多的项目, 为了更方便的查询日志 ,当时花费了一点时间通过MDC来将日志进行了链路跟踪 ; 同步请求/异步请求都可以做到一个traceId查询到整条链路, 做完之后对于查询问题提供了不小的帮助 ;
代码语言:txt复制现在回头看一下,如果当时使用spring-cloud-sleuth的话,当时的痛点可以轻松的搞定.并且还做的更好. 所以对sleuth的源码进行了简单的阅读,同时为了看sleuth的源码,先看了下zipkin的源码
zipkin
官方网站
- https://zipkin.io/
github地址
- https://github.com/openzipkin/zipkin/
本地启动
- 网上贴出的地址都提示forbidden,因此手动动手
- 在github中clone项目
- 在zipkin父目录中打包: maven clean install -Dmaven.skip.test=true
- java -jar zipkin-server/target/zipkin-server-2.23.5-SNAPSHOT-exec.jar
$ java -jar zipkin-server-2.23.5-SNAPSHOT-exec.jar
oo
oooo
oooooo
oooooooo
oooooooooo
oooooooooooo
ooooooo ooooooo
oooooo ooooooo
oooooo ooooooo
oooooo o o oooooo
oooooo oo oo oooooo
ooooooo oooo oooo ooooooo
oooooo ooooo ooooo ooooooo
oooooo oooooo oooooo ooooooo
oooooooo oo oo oooooooo
ooooooooooooo oo oo ooooooooooooo
oooooooooooo oooooooooooo
oooooooo oooooooo
oooo oooo
________ ____ _ _____ _ _
|__ /_ _| _ | |/ /_ _| | |
/ / | || |_) | ' / | || | |
/ /_ | || __/| . | || | |
|____|___|_| |_|____|_| _|
:: version 2.23.5-SNAPSHOT :: commit a90d287 ::
2021-09-27 10:05:31.331 INFO [/] 5712 --- [oss-http-*:9411] c.l.a.s.Server : Serving HTTP at /0:0:0:0:0:0:0:0:9411 - http://127.0.0.1 :9411/
sleuth整合zipkin
- 官方文档
同步链路追踪
jar包依赖
如果使用链路最终,数据不需要提交到zipkin中,引入spring-cloud-starter-sleuth
jar包; 如果需要将数据提交至zipkin进行收集,直接引入spring-cloud-starter-zipkin
jar包,里面包含了前面的jar包
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zipkin</artifactId>
<version>2.2.8.RELEASE</version>
</dependency>
配置
代码语言:txt复制spring:
application:
name: data
logging:
level:
org:
springframework:
web:
servlet:
DispatcherServlet: DEBUG
server:
port: 9000
如果需要调整zipkin地址,在配置文件中调整spring.zipkin.base-url
对应上zipkin地址即可
测试代码
贴两个服务之间进行分布式调用来进行测试
- 服务1
@Autowired
DataFeign dataFeign;
@GetMapping("/echo")
public ResponseEntity<String> echo(@RequestParam String message) {
logger.info("echo: " message);
return dataFeign.echo(message);
}
- 服务2
@GetMapping("/echo")
public ResponseEntity<String> echo(@RequestParam("message") String message) {
logger.info("echo: " message);
return ResponseEntity.ok("[ECHO] : " message);
}
zipkin检测效果
异步链路追踪
- 官方文档
jar依赖
额外增加mq的依赖
代码语言:txt复制<dependency>
<groupId>org.springframework.amqp</groupId>
<artifactId>spring-rabbit</artifactId>
</dependency>
配置
代码语言:txt复制server:
port: 9002
spring:
application:
name: rabbit
测试代码
发送端
代码语言:txt复制@RestController
public class TestController {
@Autowired
RabbitTemplate rabbitTemplate;
private static Logger logger = LoggerFactory.getLogger(TestController.class);
@GetMapping("/echo")
public void echo(@RequestParam String message) {
logger.info("[echo] : " message);
rabbitTemplate.convertAndSend(Constant.TEST_EXCHANGE_NAME, Constant.TEST_ROUTING_NAME, message);
}
}
接受端
代码语言:txt复制public class TestConsumer {
private static Logger logger = LoggerFactory.getLogger(TestConsumer.class);
@RabbitListener(queues = Constant.TEST_QUEUE_NAME)
public void handle(String message) {
logger.info("[consumer] : " message);
}
@Autowired
RabbitAdmin rabbitAdmin;
@PostConstruct
public void postConstruct() {
Queue queue = new Queue(Constant.TEST_QUEUE_NAME);
Exchange exchange = new DirectExchange(Constant.TEST_EXCHANGE_NAME);
rabbitAdmin.declareQueue(queue);
rabbitAdmin.declareExchange(exchange);
rabbitAdmin.declareBinding(BindingBuilder.bind(queue)
.to(exchange)
.with(Constant.TEST_ROUTING_NAME)
.noargs());
}
}
测试结果
- http://localhost:9002/echo?message=abc
2021-09-28 10:46:42.125 INFO [rabbit,67a199e903810c9a,67a199e903810c9a] 3124 --- [nio-9002-exec-1] c.c.study.controller.TestController : [echo] : abc
2021-09-28 10:46:42.203 INFO [rabbit,67a199e903810c9a,aeea7a2be1111551] 3124 --- [ntContainer#0-1] com.caicai.study.consumer.TestConsumer : [consumer] : abc