Spring Cloud(六):链路追踪Sleuth与Zipkin结合

一:概述

spring cloud sleuth可以结合zipkin,将信息发送到zipkin,利用zipkin的存储来存储信息,利用zipkin ui来展示数据。
1.提供链路追踪。通过sleuth可以很清楚的看出一个请求都经过了哪些服务。可以很方便的理清服务间的调用关系。
2.可视化错误。对于程序未捕捉的异常,可以在zipkin界面上看到。
3.分析耗时。通过sleuth可以很方便的看出每个采样请求的耗时,分析出哪些服务调用比较耗时。当服务调用的耗时随着请求量的增大而增大时,也可以对服务的扩容提供一定的提醒作用。
4.优化链路。对于频繁地调用一个服务,或者并行地调用等,可以针对业务做一些优化措施

二: 术语

span:最基本的工作单元。由spanId来标志。Span也可以带有其他数据,例如:描述,时间戳,键值对标签,起始Span的ID,以及处理ID(通常使用IP地址)等等。 Span有起始和结束,他们跟踪着时间信息。span应该都是成对出现的,所以一旦创建了一个span,那就必须在未来某个时间点结束它。起始的span通常被称为:root span。它的id通常也被作为一个跟踪记录的id。
traceId:一个树结构的span集合。把相同traceId的span串起来。
annotation:用于记录一个事件时间信息。
cs:client send。客户端发送,一个span的开始
cr:client receive。客户端接收。一个span的结束
ss:server send。服务器发送
sr:server receive。服务器接收,开始处理。
sr-cs和cr-ss:表示网络传输时长
ss-sr:表示服务端处理请求的时长
cr-cs:表示请求的响应时长

采样率
如果服务的流量很大,全部采集对存储压力比较大。这个时候可以设置采样率,sleuth 可以通过设置 spring.sleuth.sampler.percentage=0.1。不配置的话,默认采样率是0.1。也可以通过实现bean的方式来设置采样为全部采样(AlwaysSampler)或者不采样(NeverSampler)

三:项目构建

新建三个项目,Sleuth Server,Sleuth Provider,Sleuth Consume
3.1:Sleuth Server提供服务追踪的Zipkin界面,以便服务的的追踪
3.1.1:pom.xml

    <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.5.6.RELEASE</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    <java.version>1.8</java.version>
</properties>


<dependencies>

    <!-- eureka客户端 -->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-eureka</artifactId>
    </dependency>

    <!--slueth服务追踪-->
    <dependency>
        <groupId>io.zipkin.java</groupId>
        <artifactId>zipkin-server</artifactId>
    </dependency>

    <!--zipKin Ui-->
    <dependency>
        <groupId>io.zipkin.java</groupId>
        <artifactId>zipkin-autoconfigure-ui</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>

</dependencies>

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>Camden.SR6</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

3.1.2:application.yml

spring:
  application:
    name: sleuth-zipkin-server

server:
  port: 9411

#服务注册
eureka:
  client:
    serviceUrl:
      defaultZone: http://eureka:123456@localhost:8761/eureka/

3.1.3:程序入口

@SpringBootApplication
@EnableZipkinServer //收集spans,通过zipkin-UI查询
@EnableEurekaClient
public class SleuthServerApplication {

public static void main(String[] args) {
    SpringApplication.run(SleuthServerApplication.class, args);
    }
}

3.2:Sleuth Provider项目
3.2.1:pom.xml

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.5.6.RELEASE</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    <java.version>1.8</java.version>
    <spring-cloud.version>Dalston.SR2</spring-cloud.version>
</properties>

<dependencies>
    <!-- eureka客户端 -->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-eureka</artifactId>
    </dependency>

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

    <!--sleuth-->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-sleuth</artifactId>
    </dependency>

    <!--zipKin-->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-sleuth-zipkin</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>

</dependencies>

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>${spring-cloud.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

3.2.2:application.properties

#应用(服务)名称
spring.application.name=sleuth-zipkin-provider
#端口号
server.port=8768
#服务注册
eureka.client.serviceUrl.defaultZone=http://eureka:123456@localhost:8761/eureka/

#zipkin中心
spring.zipkin.base-url=http://localhost:9411
spring.zipkin.enabled=true
#收集信息需要一定的比列,默认0.1 修改为1  采样率
spring.sleuth.sampler.percentage=1

说明:采样率默认是0.1,十次中有一次计入Zipkin,所有有时候,感觉运行了很多次项目,就是在监控平台没有服务的相关追踪。

3.2.3:程序入口

@SpringBootApplication
@EnableEurekaClient
public class SleuthProviderApplication {

public static void main(String[] args) {
    SpringApplication.run(SleuthProviderApplication.class, args);
    }
}

3.2.4:提供一个服务

@RestController
public class SleuthProviderController {

private static final Logger LOGGER = LoggerFactory.getLogger(SleuthProviderController.class);

@GetMapping({"","/"})
public String index(){
    return "this is a spring-cloud sleuth provider!";
}

/**
 * 用来测试链路
 * @return
 */
@GetMapping("/index")
public String providerIndex(){
    return "Hello dy_bom ,this is a spring-cloud sleuth provider!";
        }
}

3.3:Sleuth 的消费者

pom.xml,application.properties(修改端口),入口程序与Sleuth提供者代码一致,写一个消费者的调用测试

@RestController
public class SleuthConsumerController {

private static final Logger LOGGER = LoggerFactory.getLogger(SleuthConsumerController.class);

@Bean
@LoadBalanced
public RestTemplate restTemplate(){
    return  new RestTemplate();
}

@Autowired
private RestTemplate restTemplate;

@Autowired
private Tracer tracer;


/**
 * 项目说明
 * @return
 */
@GetMapping({"/",""})
public String index(){
    return "this is spring-cloud-sleuth-consumer";
}

/**
 * 远程服务
 * @return
 */
@GetMapping( "/index")
public Object sleuthProviderIndex() {

    LOGGER.info("<<<<<<<<<<<<<<<<calling trace demo provider>>>>>>>>>>>>>>>");
    String str =  restTemplate.getForEntity("http://spring-cloud-sleuth-provider/index", String.class).getBody();
    return str;
    }
}

分别启动项目Eureka Server,Sleuth Server,Sleuth Provider,Sleuth Consumer。
在Eureka Server管理后台查看服务注册情况
这里写图片描述

打开Zipkin的监控
这里写图片描述

开始服务的调用,同时跟踪服务ZipKin变化
这里写图片描述

ZipKin提供了服务的追踪和项目的依赖。
这里写图片描述

说明:Sleuth与Zipkin的结合,数据默认存放的是内存,数据传输通过HTPP,一旦,Sleuth Server重启,数据将会丢失,,那我们如何保住数据的稳定性呢?下节我们结合Stream,Mysql,将对链路追踪的数据持久化操作。

代码地址:https://github.com/rubenYuan/Spring-Cloud-Samples
PPT:http://download.csdn.net/download/ruben95001/9974839

上一篇:服务消费者Feign
下一篇:链路追踪Sleuth-Zipkin与Mysql数据的持久化

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿呆编程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值