第十章 Spring Cloud 服务链路追踪(Spring Cloud Sleuth)

Spring Cloud Sleuth 主要功能就是在分布式系统中提供追踪解决方案,并且兼容支持了 zipkin,你只需要在pom文件中引入相应的依赖即可。
微服务架构上通过业务来划分服务的,通过REST调用,对外暴露的一个接口,可能需要很多个服务协同才能完成这个接口功能,如果链路上任何一个服务出现问题或者网络超时,都会形成导致接口调用失败。随着业务的不断扩张,服务之间互相调用会越来越复杂。
在这里插入图片描述

  • Span:基本工作单元,例如,在一个新建的span中发送一个RPC等同于发送一个回应请求给RPC,span通过一个64位ID唯一标识,trace以另一个64位ID表示,span还有其他数据信息,比如摘要、时间戳事件、关键值注释(tags)、span的ID、以及进度ID(通常是IP地址)。
    span在不断的启动和停止,同时记录了时间信息,当你创建了一个span,你必须在未来的某个时刻停止它。

  • Trace:一系列spans组成的一个树状结构,例如,如果你正在跑一个分布式大数据工程,你可能需要创建一个trace。

  • Annotation:用来及时记录一个事件的存在,一些核心annotations用来定义一个请求的开始和结束

    • cs - Client Sent -客户端发起一个请求,这个annotion描述了这个span的开始。
    • sr - Server Received -服务端获得请求并准备开始处理它,如果将其sr减去cs时间戳便可得到网络延迟。
    • ss - Server Sent -注解表明请求处理的完成(当请求返回客户端),如果ss减去sr时间戳便可得到服务端需要的处理请求时间。
    • cr - Client Received -表明span的结束,客户端成功接收到服务端的回复,如果cr减去cs时间戳便可得到客户端从服务端获取回复的所有所需时间。

基本内容讲解完毕,也许您有很多的疑问,但是没关系,您可以先按照接下来的内容进行操作,慢慢消化。本篇文章一共创建了四个工程:
zipkin服务(zipkin-server-2.10.1-exec.jar) 9411
服务注册中心(spring-cloud-eureka-server) 8080
对外提供接口“gethello”服务(spring-cloud-zipkin-app-1) 8081
调用接口服务(spring-cloud-zipkin-app-2) 8082

1、下载zipkin的jar工程

在Spring Cloud新版本当中,,已经不需要自己构建Zipkin Server了,只需要下载jar即可,下载地址:
https://dl.bintray.com/openzipkin/maven/io/zipkin/java/zipkin-server/
下载完成以后,使用命令进行启动jar:

java -jar zipkin-server-2.10.1-exec.jar

2、创建Eureka Server(spring-cloud-eureka-server)

创建Eureka Server服务注册中心,具体工程不再赘述,可以查看之前的文章 第二章 Spring Cloud 服务的注册与发现(Eureka Server)

3、创建spring-cloud-zipkin-app-1工程

第一步:创建一个Spring Boot的module工程

创建一个普通的Spring Boot项目,具体工程不再赘述,很简单。

第二步:添加依赖

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-zipkin</artifactId>
        </dependency>
    </dependencies>

第三步:在配置文件当中进行配置

配置文件当中特别要注意的是要添加Zipkin Server的注册地址

server:
  port: 8081

spring:
  application:
    name: spring-cloud-zipkin-app-1
  zipkin:
    base-url: http://localhost:9411 #1
eureka:
  client:
    service-url:
      defaultZone: http://localhost:8080/eureka/
      
#1、将当前服务添加到Zipkin Server当中

第四步:在入口类Application类注入Sampler

package com.brimen.springcloudzipkinapp1;

import brave.sampler.Sampler;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;

@SpringBootApplication
public class SpringCloudZipkinApp1Application {

    public static void main(String[] args) {
        SpringApplication.run(SpringCloudZipkinApp1Application.class, args);
    }
    @Bean
    public Sampler defaultSampler() {
        return Sampler.ALWAYS_SAMPLE;
    }
}

第五步:创建一个对外的接口

当前服务的角色主要是作为一个服务提供者,并不直接对外,是提供给spring-cloud-zipkin-app-2调用的接口
代码如下:

package com.brimen.springcloudzipkinapp1;

import brave.sampler.Sampler;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;

@SpringBootApplication
public class SpringCloudZipkinApp1Application {

    public static void main(String[] args) {
        SpringApplication.run(SpringCloudZipkinApp1Application.class, args);
    }
    @Bean
    public Sampler defaultSampler() {
        return Sampler.ALWAYS_SAMPLE;
    }
}

到此spring-cloud-zipkin-app-1工程创建完成

4、创建spring-cloud-zipkin-app-2工程

第一步:创建一个Spring Boot的module工程

过程不再赘述。

第二步:添加依赖

依赖和spring-cloud-zipkin-app-1一致。

第三步:在配置文件当中进行配置

除了端口不一样外,其它的配置同spring-cloud-zipkin-app-1

server:
  port: 8082

spring:
  application:
    name: spring-cloud-zipkin-app-2
  zipkin:
    base-url: http://localhost:9411 #1
eureka:
  client:
    service-url:
      defaultZone: http://localhost:8080/eureka/

#1、将当前服务添加到Zipkin Server当中

第四步:在入口类Application类注入Sampler

依赖和spring-cloud-zipkin-app-1一致。

第五步:创建一个Service接口,来调用spring-cloud-zipkin-app-1的接口

此处使用了“Feign”的调用方式,不理解的可以查看之前的文章。
代码如下:

package com.brimen.springcloudzipkinapp2.service;

import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;

@FeignClient(value = "spring-cloud-zipkin-app-1") 
public interface HelloService {

    @RequestMapping(value = "/hello/gethello",method = RequestMethod.GET)
    public String getHelloValue(@RequestParam(value = "name") String name);
}

第六步:创建一个对外的gethello方法,并且需要调用service方法

代码如下:

package com.brimen.springcloudzipkinapp2.controller;

import com.brimen.springcloudzipkinapp2.service.HelloService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/hello")
public class HelloController {

    @Autowired
    private HelloService helloService;
    /**
     * getHello方法
     * @return
     */
    @GetMapping("/gethello")
    public String getHello(){
        return helloService.getHelloValue("");
    }
}

5、依次启动项目

依次启动zipkin-server-2.10.1-exec.jar、spring-cloud-eureka-server、spring-cloud-zipkin-app-1
和spring-cloud-zipkin-app-2
访问: http://localhost:9411 ,点击Dependencies,可以发现服务的依赖关系
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_24630433/article/details/87869584