【微服务04】使用Zipkin+Slueth实现链路追踪

90 阅读3分钟

本文主要有以下内容:

  • 使用sleuth + zipkin + rabbitmq实现链路追踪

为什么需要链路追踪:在微服务开发过程中、往往会出现服务间互相调用的情况、当程序运行不符合预期时、我们往往需要查看日志进行问题定位、因此为了搞清楚服务之间的调用流程、就需要搭建链路追踪服务。

环境搭建

创建自定义网络:(定义网络主要是为了方便使用、如果能保证ip不发生变化、则不需要指定、笔者是笔记本在公司和家里来回切换、因此为了保证ip固定、所以指定ip)

docker network create --driver bridge --subnet=172.18.30.0/24 --gateway=172.18.30.1 dev-network

编写docker-compose.yml内容如下:

version: '3.8'
services:
  rabbitmq:
    image: rabbitmq:3.9.7-management
    container_name: rabbitmq
    networks:
      dev-network:
        ipv4_address: 172.18.30.16
    ports:
      - "5672:5672"
      - "15672:15672"
    volumes:
      - ./data:/var/lib/rabbitmq
      - ./myplugins:/myplugins
  zipkin:
    image: openzipkin/zipkin
    container_name: zipkin2
    networks:
      dev-network:
        ipv4_address: 172.18.30.17
    depends_on:
      - rabbitmq
    ports:
      - "9411:9411"
    environment:
      RABBIT_ADDRESSES: 172.18.30.16:5672
networks:
  dev-network:
    external: true
  

执行docker-compose up运行成功后在浏览器输入如下地址:

  • zipkin:http://localhost:9411/zipkin/可以看到页面则表明运行成功!
  • rabbitmq: localhost:15762: 用户名/密码均为guest. 可以看到正常页面即可。

rabbitmqui可以看到如下信息:

在启动zipkin服务时、可以通过rabbitmq.queue修改队列、默认为zipkin

微服务改造

在服务里面添加如下依赖,可以将mq换成kafka、rocketmq等、换成后者需要改变对应的yml中的配置。

  <!-- Sleuth + Zipkin链路追踪 -->
  <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-sleuth</artifactId>
  </dependency>
  <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-sleuth-zipkin</artifactId>
  </dependency>
  <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-stream-binder-rabbit</artifactId>
  </dependency>

在应用里面添加如下配置:

spring:
  sleuth:
    sampler:
      # 采样率的概率,100%采样
      probability: 1.0
      # 每秒采样数字最高为100
      rate: 1000
  zipkin:
    sender:
      type: rabbit
    #    base-url: http://localhost:9411/
    rabbitmq:
      addresses: 127.0.0.1:5672
      # 和zipkin服务器上的队列保持一致、否则无法消费消息
      queue: zipkin

启动服务后、首先在nacos查看对应服务的启动状况:

我这里只有两个服务调用关系为custormer-->produce

@RequestMapping("customer/")
@RestController
@Slf4j
public class CustomerController {
​
    @Resource
    private ProduceService produceService;
​
    @RequestMapping("hello")
    public Map hello() {
        log.info("CustomerController => hello");
        HashMap<String, Object> resultMap = new HashMap<>();
        resultMap.putAll(produceService.produceHello());
        return resultMap;
    }
}
​
/**
 * 创建时间: 2024年09月19日 13:34
 * 文件描述:
 */
@RequestMapping("produce/")
@Slf4j
@RestController
public class ProduceController {
​
    @GetMapping("hello")
    public Map produceHello() {
        log.info("ProduceController => hello");
        HashMap<String, String> hashMap = new HashMap<>();
        hashMap.put("hello", "customer");
        hashMap.put("msg", "i am produce");
        return hashMap;
    }
}

访问customer/hello在控制台可以看到如下答应信息:

生产者的服务信息如下:

上图中用红框框出来的部分就表明了请求顺序。这是因为:

  • Zipkin对OpenFeign请求进行了修改、在请求头中添加了一个TranceID可以通过这个TranceID将整个信息串联起来。
  • 生产服务中的第一个9da214f3fb528ae7就是消费者服务中传递过来的。
  • 消费者服务中的两个都一样是因为当前调用没有父级调用。

通过 zipkin 控制台也可以看到如下信息:

点击 show 可以看到如下详情信息:

更多信息请自己把玩zipkin吧。

关于zipkin的更多介绍请点击这里,此链接详细说了TranceIDParentID等信息。

关于slueth的介绍请点击额这里