Spring cloud sleuth

来源:互联网 发布:剪辑音乐软件手机 编辑:程序博客网 时间:2024/06/10 18:39
一、spring cloud sleuth
1.Spring-Cloud-Sleuth:是Spring Cloud的组成部分之一,为SpringCloud应用实现了一种分布式追踪解决方案,其兼容了Zipkin, HTrace和log-based追踪
2.Span:基本工作单元,例如,在一个新建的span中发送一个RPC等同于发送一个回应请求给RPC,span通过一个64位ID唯一标识,trace以另一个64位ID表示,span还有其他数据信息,比如摘要、时间戳事件、关键值注释(tags)、span的ID、以及进度ID(通常是IP地址)
span在不断的启动和停止,同时记录了时间信息,当你创建了一个span,你必须在未来的某个时刻停止它。
3.Trace:一系列spans组成的一个树状结构,例如,如果你正在跑一个分布式大数据工程,你可能需要创建一个trace。
4.Annotation:用来及时记录一个事件的存在,一些核心annotations用来定义一个请求的开始和结束
1)cs(Client Sent) :客户端发起一个请求,这个annotion描述了这个span的开始
2)sr(Server Received): 服务端获得请求并准备开始处理它,如果将其sr减去cs时间戳便可得到网络延迟
3)ss(Server Sent):注解表明请求处理的完成(当请求返回客户端),如果ss减去sr时间戳便可得到服务端需要的处理请求时间
4)cr(Client Received):表明span的结束,客户端成功接收到服务端的回复,如果cr减去cs时间戳便可得到客户端从服务端获取回复的所有所需时间

二、实例:http通信方式、Mq异步通信+Mysql方式、Mq异步通信+elasticsearch方式
建三个项目:server-monitor监控(负责数据收集以及信息展示功能)、consumer-beehive服务消费者、provider-user服务提供者
1.http方式:将数据保存到内存中,但是生产环境还是需要将数据持久化中
1)server-monitor:
a.pom.xml依赖:
<dependency>    <groupId>org.springframework.boot</groupId>    <artifactId>spring-boot-starter</artifactId></dependency><dependency>    <groupId>io.zipkin.java</groupId>    <artifactId>zipkin-server</artifactId></dependency><dependency>    <groupId>io.zipkin.java</groupId>    <artifactId>zipkin-autoconfigure-ui</artifactId>   <scope>runtime</scope></dependency><dependency>    <groupId>org.springframework.boot</groupId>    <artifactId>spring-boot-starter-test</artifactId>    <scope>test</scope></dependency>

b.**Application.java:
import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import zipkin.server.EnableZipkinServer;@SpringBootApplication@EnableZipkinServer  //将http改为mq时,用EnableZipkinStreamServer代替public class ServerMonitorApplication {    public static void main(String[] args){        SpringApplication.run(ServerMonitorApplication.class,args);    }}
c.application.yml:
server:    port: 8050spring:    application:        name: server-monitor    output:        ansi:            enabled: alwaysencrypt:    failOnError: false
d.bootstap.yml:
    spring:    zipkin:        base-url: http://10.83.3.12:8050eureka:    client:        serviceUrl:            defaultZone: http://10.83.3.1:8761/eureka/,http://10.83.3.2:8762/eureka/,http://10.83.3.3:8763/eureka/    instance:        prefer-ip-address: true     #指定自身服务的显示ip形式        ip-address: ${spring.cloud.client.ipAddress}        instance-id: ${spring.cloud.client.ipAddress}:${server.port}

2)provider-user 和 consumer-beehive配置
a.pom.xml:
<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>
b.application.yml:
server:    port: 8001spring:    application:        name: provider-user #consumer-beehive项目就填:consumer-beehive    output:        ansi:            enabled: always
c.bootstrap.yml:
    spring:      zipkin:        base-url: http://10.83.3.12:8050
    eureka:    client:        serviceUrl:            defaultZone: http://10.83.3.1:8761/eureka/,http://10.83.3.2:8762/eureka/,http://10.83.3.3:8763/eureka/    instance:        prefer-ip-address: true     #指定自身服务的显示ip形式        ip-address: ${spring.cloud.client.ipAddress}        instance-id: ${spring.cloud.client.ipAddress}:${server.port}
3)测式:
a.访问:http://localhost:8050
刚开始service name可能无法选择,说明目前没有数据,我们查看数据库也可以看到没有任何数据信息
b.访问consumer-beehive,调用provider-user方法:
b1.http://10.83.29.110:8020/consumerBeehive/1
b2.再刷新a中的请求,这时service name可选择consumer-beehive或proivder-user
b3.点Find Traces按钮,就可看到调用的链路和耗时情况
b4.点Dependencies,可看到调用关系
4)优缺:
a.spring-cloud-sleuth收集信息是有一定的比率的,默认的采样率是0.1,配置此值的方式在配置文件中增加spring.sleuth.sampler.percentage参数配置(如果不配置默认0.1),如果我们调大此值为1,可以看到信息收集就更及时.
但是对同一个请求两次耗时信息相差非常大,spring-cloud-sleuth这种追踪服务调用链路会给我们业务程序性能带来一定的影响
b.zipkin客户端向zipkin-server程序发送数据使用的是http的方式通信,每次发送的时候涉及到连接和发送过程。
c.当我们的zipkin-server程序关闭或者重启过程中,因为客户端收集信息的发送采用http的方式会被丢失。
5)改进的办法是
a.通信采用socket或者其他效率更高的通信方式。
b.客户端数据的发送尽量减少业务线程的时间消耗,采用异步等方式发送收集信息。
c.客户端与zipkin-server之间增加缓存类的中间件,例如redis、MQ等,在zipkin-server程序挂掉或重启过程中,客户端依旧可以正常的发送自己收集的信息。

2.Mq异步通信+Mysql方式:
1)server-monitor:
a.pom.xml
a1.去掉io.zipkin.java:zipkin-server
a2.添加spring-cloud-sleuth-zipkin-stream和spring-cloud-starter-stream-rabbit
<dependency>    <groupId>org.springframework.cloud</groupId>    <artifactId>spring-cloud-sleuth-zipkin-stream</artifactId></dependency><dependency>    <groupId>org.springframework.cloud</groupId>    <artifactId>spring-cloud-starter-stream-rabbit</artifactId></dependency>

b.**Application.java
b1.去掉@EnableZipkinServer注解
b2.添加@EnableZipkinStreamServer注解
c.bootstrap.yml
spring:    zipkin:        base-url: http://10.83.3.12:8050    sleuth:        enabled: false   #表示当前程序不使用sleuth    datasource: #数据库脚本创建地址,当有多个是可使用[x]表示集合第几个元素,spring boot数据源配置        schema: classpath:/zipkin.sql        driver-class-name: com.mysql.jdbc.Driver        url: jdbc:mysql://10.83.3.16:3306/test?autoReconnect=true&useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull&useSSL=false        username: root        password: root        initialize: true        continue-on-error: true    rabbitmq: #rabbitmq配置        host: 10.83.3.0        port: 5672        username: guest        password: guesteureka:    client:        serviceUrl:          defaultZone: http://10.83.3.1:8761/eureka/,http://10.83.3.2:8762/eureka/,http://10.83.3.3:8763/eureka/    instance:        prefer-ip-address: true     #指定自身服务的显示ip形式        ip-address: ${spring.cloud.client.ipAddress}        instance-id: ${spring.cloud.client.ipAddress}:${server.port}#zipkin数据保存到数据库中需要进行如下配置zipkin:   storage:        type: mysql   #表示zipkin数据存储方式是mysql

d.sql文件:
在resource下添加:zipkin.sql文件。
注:具体zipkin.sql可搜索官方的。

2)provider-user 和 consumer-beehive配置
a.pom.xml
a1.去掉spring-cloud-starter-zipkin
a2.添加spring-cloud-sleuth-zipkin-stream和spring-cloud-starter-stream-rabbit
    <dependency>    <groupId>org.springframework.cloud</groupId>    <artifactId>spring-cloud-sleuth-zipkin-stream</artifactId></dependency><dependency>    <groupId>org.springframework.cloud</groupId>    <artifactId>spring-cloud-starter-stream-rabbit</artifactId></dependency>

b.bootstrap.yml:添加mq配置
rabbitmq: #rabbitmq配置    host: 10.83.3.0    port: 5672    username: guest    password: guest

3.Mq异步通信+elasticsearch方式:
1)server-monitor:
a.pom.xml
a1.去掉mqsql 的相关配置
a2.添加elasticsearch配置
<dependency>    <groupId>io.zipkin.java</groupId>    <artifactId>zipkin</artifactId>    <version>1.24.0</version></dependency><!--保存到数据库需要如下依赖--><!-- 添加 spring-data-elasticsearch的依赖 --><dependency>    <groupId>io.zipkin.java</groupId>    <artifactId>zipkin-autoconfigure-storage-elasticsearch-http</artifactId>    <version>1.24.0</version>    <optional>true</optional></dependency>

b.bootstrap.yml
b1.去掉mqsql 的相关配置
b2.添加elasticsearch配置
spring:    zipkin:        base-url: http://10.83.3.12:8050    sleuth:        enabled: false   #表示当前程序不使用sleuth    rabbitmq: #rabbitmq配置        host: 10.83.3.0        port: 5672        username: guest        password: guesteureka:    client:        serviceUrl:            defaultZone: http://10.83.3.1:8761/eureka/,http://10.83.3.2:8762/eureka/,http://10.83.3.3:8763/eureka/    instance:       prefer-ip-address: true     #指定自身服务的显示ip形式        ip-address: ${spring.cloud.client.ipAddress}        instance-id: ${spring.cloud.client.ipAddress}:${server.port}#zipkin数据保存到数据库中需要进行如下配置zipkin:    storage:        type: elasticsearch   #表示zipkin数据存储方式是elasticsearch        StorageComponent: elasticsearch        elasticsearch:            cluster: elasticsearch-zipkin-cluster            hosts: 127.0.0.1:9300            max-requests: 64            index: zipkin            index-shards: 5            index-replicas: 1

2)provider-user 和 consumer-beehive配置 不变。
3)问题:若dependencies有问题,不能显示依赖关系
解决:添加jar:io.zipkin.dependencies:zipkin-dependencies
原创粉丝点击