spring-cloud-sleuth源码学习一

2021-10-11 18:06:59 浏览数 (1)

文章分三部分:

- 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
代码语言:txt复制
$ 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-sleuthjar包; 如果需要将数据提交至zipkin进行收集,直接引入spring-cloud-starter-zipkinjar包,里面包含了前面的jar包

代码语言:txt复制
<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
代码语言:txt复制
    @Autowired
    DataFeign dataFeign;

    @GetMapping("/echo")
    public ResponseEntity<String> echo(@RequestParam String message) {
        logger.info("echo: "   message);
        return dataFeign.echo(message);
    }
  • 服务2
代码语言:txt复制
    @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
代码语言:txt复制
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

zipkin效果

0 人点赞