SpringCloud(九):springcloud——链路追踪springcloud-sleuth

Spring-Cloud-Sleuth是Spring Cloud的组成部分之一,为SpringCloud应用实现了一种分布式追踪解决方案,其兼容了Zipkin, HTrace和log-based追踪,追踪微服务rest服务调用链路的问题,接触到zipkin,而spring cloud也提供了spring-cloud-sleuth来方便集成zipkin实现。java

 为何须要进行分布式链路追踪springcloud-sleuth呢?web

  随着分布式系统愈来愈复杂,你的一个请求发过发过去,各个微服务之间的跳转,有可能某个请求某一天压力太大了,一个请求过去没响应,一个请求下去依赖了三四个服务,可是你去不知道哪个服务出来问题,这时候我是否是须要对微服务进行追踪呀?监控一个请求的发起,从服务之间传递之间的过程,我最好记录一下,记录每个的耗时多久,一旦出了问题,咱们就能够针对性的进行优化,是要增长节点,减轻压力,仍是服务继续拆分,让逻辑更加简单点呢?这时候springcloud-sleuth集成zipkin能帮咱们解决这些服务追踪问题。spring

如下是来自springcloud官方文档对springcloud-sleuth部分名字的解释:

Span:基本工做单元,例如,在一个新建的span中发送一个RPC等同于发送一个回应请求给RPC,span经过一个64位ID惟一标识,trace以另外一个64位ID表示,span还有其余数据信息,好比摘要、时间戳事件、关键值注释(tags)、span的ID、以及进度ID(一般是IP地址)
span在不断的启动和中止,同时记录了时间信息,当你建立了一个span,你必须在将来的某个时刻中止它。
Trace:一系列spans组成的一个树状结构,例如,若是你正在跑一个分布式大数据工程,你可能须要建立一个trace。
Annotation:用来及时记录一个事件的存在,用于定义请求的开始和中止的一些核心注释是:网络

  1.cs- Client Sent -客户端发起一个请求,这个annotion描述了这个span的开始app

  2.sr- Server Received -服务端得到请求并准备开始处理它,若是将其sr减去cs时间戳即可获得网络延迟maven

  3.ss- Server Sent -注解代表请求处理的完成(当请求返回客户端),若是ss减去sr时间戳即可获得服务端须要的处理请求时间分布式

  4.cr- Client Received -代表span的结束,客户端成功接收到服务端的回复,若是cr减去cs时间戳即可获得客户端从服务端获取回复的全部所需时间ide

接下来,进行spring-cloud-sleuth来方便集成zipkin实现的演示以下:spring-boot

首先咱们在先前文章的两个服务提供者provider1,provider2,Feign模块,都须要引入以下依赖:微服务

    <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-sleuth-zipkin</artifactId>
            <version>1.3.0.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-sleuth</artifactId>
            <version>1.3.0.RELEASE</version>
        </dependency>

这里还要说明一下,这里要provider1和provider2模块和Feign模块注意springcloud的版本号的匹配,若是不跟换的话,会启动不起来的,更换后的版本以下:

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

接着进行进行provider1的配置进行修改,以下:

(接着进行provider2模块的配置文件进行修改,只须要把server.port:8081改为8082:)

#端口号
server:
  port: 8011
#Eureka实例名,集群中根据这里相互识别
spring:
  application:
    name: user-service
  zipkin:
    base-url: http://localhost:9400
    enabled: true
#服务跟踪消息收集率,1表明每一条都收集,0.1表明收集百分之10,若是不配置,有个默认的百分比的
#  sleuth:
#    sampler:
#      percentage: 0.3

eureka:
#客户端
  client:
#注册中心地址
    service-url:
      defaultZone: http://localhost:8001/eureka/

Feign模块的配置修改以下:

server:
  port: 8083
spring:
  application:
    name: feign-consumer
  zipkin:
    base-url: http://localhost:9400
    enabled: true
eureka:
  client:
    service-url:
      defaultZone: http://localhost:8001/eureka/
hystrix:
  command:
    default:
      execution:
        isolation:
          thread:
            timeoutinMilliseconds: 5000
ribbon:
  connectTimeout: 500

新建一个子模块叫作springcloud-sleuth模块,以下图:

 

pom要引入的依赖以下:

<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.12.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.SR5</spring-cloud.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>io.zipkin.java</groupId>
            <artifactId>zipkin-server</artifactId>
            <version>2.4.0</version>
        </dependency>
        <dependency>
            <groupId>io.zipkin.java</groupId>
            <artifactId>zipkin-autoconfigure-ui</artifactId>
            <version>2.4.0</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-eureka-server</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-eureka</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>

</project>

Sleuth模块的配置文件以下:

server:
  port: 9400
spring:
  application:
    name: zipkin-server

Sleuth模块启动类以下:

@SpringBootApplication
@EnableZipkinServer
public class SleuthApplication {

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

接着分别启动两个Eureka注册中心,两个provider1,provider2模块,1个Feign模块,1个Sleuth模块,以下图:

首先进入Sleuth和zipkin整合后的链路跟踪图形化界面以下图所视:

 

接着在经过Feign去显示调用两个provider1和provider2模块的服务,http://localhost:8083/hello?name=8889999999   多按几回F5,进行屡次请求,由于服务跟踪消息是有收集率,1表明每一条都收集,0.1表明收集百分之10,若是不配置,有个默认的百分比的,所以须要屡次请求,确保被跟踪消息能被收集到。以下:

 接着去ZipKin控制台进行查看链路调用,以下:

 

 

 

                    好比feign-consumer 100%并且有蓝色的横条包裹表示调用成功率,红色横条包裹表示失败,出现异常错误。

再点击其中一个调用服务,进入能够看到详细信息,以下:

Zipkin容许您可视化跟踪中的错误。当异常被抛出而且没有被捕获时,咱们在Zipkin能够正确着色的跨度上设置适当的标签。您能够在痕迹列表中看到一条是红色的痕迹。这是由于抛出了一个异常。

若是您点击该轨迹,您将看到相似的图片:

相关文章
相关标签/搜索