Spring-Cloud(六)服务追踪

2019-02-16  本文已影响0人  Lord_East

Spring Cloud Sleuth

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

Spring Cloud Sleuth的专业术语:

将Span和Trace在一个系统中使用Zipkin注解的过程图形化:

Span和Trace图形化

Spring Cloud Zipkin

Spring cloud提供了spring-cloud-sleuth-zipkin来方便集成zipkin实现,Zipkin是Twitter的一个开源项目,它基于Google Dapper实现。
我们可以使用它来收集各个服务器上请求链路的跟踪数据,并通过它提供的REST API接口来辅助我们查询跟踪数据以实现对分布式系统的监控程序,从而及时地发现系统中出现的延迟升高问题并找出系统性能瓶颈的根源。
除了面向开发的API接口之外,它也提供了方便的UI组件来帮助我们直观的搜索跟踪信息和分析请求链路明细。

zipkin-architecture

上图展示了Zipkin的基础架构,它主要有4个核心组件构成:


新建一个基础Spring的Maven Moudle工程命名为zipkin,引用所需的依赖:

    <parent>
        <groupId>com.wkedong.springcloud</groupId>
        <artifactId>parent</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>

    <dependencies>
        <dependency>
            <groupId>io.zipkin.java</groupId>
            <artifactId>zipkin-server</artifactId>
        </dependency>
        <dependency>
            <groupId>io.zipkin.java</groupId>
            <artifactId>zipkin-autoconfigure-ui</artifactId>
        </dependency>
        <dependency>
            <groupId>io.zipkin.java</groupId>
            <artifactId>zipkin-autoconfigure-storage-mysql</artifactId>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
    </dependencies>

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

这里依赖了zipkin相关的服务和Mysql数据库(zipkin数据存入数据库进行持久化保存)

注:需要支持zipkin追踪的应用需要在pom文件里依赖以下内容,这里不一一赘述

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

application.yml配置文件如下:

server:
  port: 6040
spring:
  application:
    name: zipkin
  datasource:
    url: jdbc:mysql://127.0.0.1:3306/spring_cloud_zipkin?autoReconnect=true&useUnicode=true&characterEncoding=UTF-8
    username: root
    password: 123456
    driver-class-name: com.mysql.jdbc.Driver

接下来我们修改应用主类:


/**
 * @author wkedong
 */
@EnableZipkinServer
@SpringBootApplication
public class ZipkinApplication {

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

}

@EnableZipkinServer注解表示该应用为zipkin服务

启动该应用并访问http://localhost:6040 ,出现zipkin查看的UI图形页面:

Zipkin

启动Eureka,Config,ServiceProducer,ServiceConsumer并访问Consumer接口/testGet接口,观察控制台输出

2019-02-16 09:45:35.717  INFO [service-consumer,b97e2da610e3a31a,b97e2da610e3a31a,true] 16052 --- [nio-7010-exec-1] c.w.s.s.controller.ConsumerController    : ===<call testGet>===
2019-02-16 09:45:36.177  INFO [service-producer,b97e2da610e3a31a,0f79122e2926c368,true] 14500 --- [nio-6070-exec-1] c.w.s.s.controller.ProducerController    : ===<call testGet>===
2019-02-16 09:45:36.177  INFO [service-producer,b97e2da610e3a31a,0f79122e2926c368,true] 14500 --- [nio-6070-exec-1] c.w.s.s.s.impl.ProducerServiceImpl       : /testGet, instanceId:HANWEB-PC:service-producer:6070, host:HANWEB-PC

从上面的控制台输出内容中,我们可以看到多了一些形如[service-consumer,b97e2da610e3a31a,b97e2da610e3a31a,true]的日志信息,而这些元素正是实现分布式服务跟踪的重要组成部分,它们每个值的含义如下:

上面四个值中的Trace ID和Span ID是Spring Cloud Sleuth实现分布式服务跟踪的核心。
在一次服务请求链路的调用过程中,会保持并传递同一个Trace ID,从而将整个分布于不同微服务进程中的请求跟踪信息串联起来,以上面输出内容为例,service-consumer和service-producer同属于一个前端服务请求来源,所以他们的Trace ID是相同的,处于同一条请求链路中。


得到Sleuth收集到的跟踪到详细信息,其中包括了请求服务名,请求接口,请求时间消耗等。

查看Zipkin Server根据跟踪信息分析生成的系统请求链路依赖关系图


文章目录:

整体demo的GitHub地址:Spring-Cloud

上一篇 下一篇

猜你喜欢

热点阅读