Spring Cloud(六):链路追踪Sleuth与Zipkin结合
来源:互联网 发布:pkm2软件 编辑:程序博客网 时间:2024/05/24 03:12
一:概述
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-serverserver: port: 9411#服务注册eureka: client: serviceUrl: defaultZone: http://eureka:123456@localhost:8761/eureka/
3.1.3:程序入口
@SpringBootApplication@EnableZipkinServer //收集spans,通过zipkin-UI查询@EnableEurekaClientpublic 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:9411spring.zipkin.enabled=true#收集信息需要一定的比列,默认0.1 修改为1 采样率spring.sleuth.sampler.percentage=1
说明:采样率默认是0.1,十次中有一次计入Zipkin,所有有时候,感觉运行了很多次项目,就是在监控平台没有服务的相关追踪。
3.2.3:程序入口
@SpringBootApplication@EnableEurekaClientpublic class SleuthProviderApplication {public static void main(String[] args) { SpringApplication.run(SleuthProviderApplication.class, args); }}
3.2.4:提供一个服务
@RestControllerpublic 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提供者代码一致,写一个消费者的调用测试
@RestControllerpublic class SleuthConsumerController {private static final Logger LOGGER = LoggerFactory.getLogger(SleuthConsumerController.class);@Bean@LoadBalancedpublic RestTemplate restTemplate(){ return new RestTemplate();}@Autowiredprivate RestTemplate restTemplate;@Autowiredprivate 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
完!
- Spring Cloud(六):链路追踪Sleuth与Zipkin结合
- Spring Cloud(七):链路追踪Sleuth-Zipkin与Mysql数据的持久化
- Spring Cloud Sleuth Zipkin 展示追踪数据
- Spring Cloud Sleuth 链路追踪
- Spring Cloud 服务链路追踪 (zipkin)
- 全链路spring cloud sleuth+zipkin
- Spring Cloud Sleuth+Zipkin实践
- Spring Cloud应用进行服务追踪分析(Zipkin和spring cloud Sleuth)
- SpringCloud: 服务链路追踪(Spring Cloud Sleuth)
- spring cloud 使用sleuth +zipkin 实例测试
- Spring Cloud Sleuth Zipkin 升级使用
- Spring Cloud Sleuth Zipkin 升级使用
- Spring Cloud Sleuth与Zipkin整合时遇到的问题记录
- 史上最简单的SpringCloud教程 | 第九篇: 服务链路追踪(Spring Cloud Sleuth)
- 史上最简单的SpringCloud教程 | 第九篇: 服务链路追踪(Spring Cloud Sleuth)
- 史上最简单的SpringCloud教程 | 第九篇: 服务链路追踪(Spring Cloud Sleuth)
- 史上最简单的SpringCloud教程 | 第九篇: 服务链路追踪(Spring Cloud Sleuth)
- 史上最简单的SpringCloud教程 | 第九篇: 服务链路追踪(Spring Cloud Sleuth)
- linux系统/var/log目录下的信息详解
- annotation processor tool(apt)的套路
- EFM32片内外设CMU -- 设置时钟输出
- Android 实现一个简单的自定义View
- redis的常用命令(1)
- Spring Cloud(六):链路追踪Sleuth与Zipkin结合
- U3D 遇到的 object reference not set to an insance 原因及解决方法
- java 代理ip
- KafkaOffsetMonitor
- 【剑指Offer】最小的k个数
- Dlib库landmark算法解析
- 福利来啦!Apsara Clouder大数据专项技能认证:使用Quick BI 制作企业数据分析报表
- 3招解决信用不良问题
- Android 自定义标尺控件(选择身高、体重等)