参考
官网文档
史上最简单的SpringCloud教程 | 第九篇: 服务链路追踪(Spring Cloud Sleuth)
zipkin简介
Spring Cloud Sleuth 主要功能就是在分布式系统中提供追踪解决方案,并且兼容支持了 zipkin,zipkin为分布式链路调用监控系统,聚合各业务系统调用延迟数据,达到链路调用监控跟踪。
随着微服务数量不断增长,它们之间的关系会越来越复杂,如果链路上任何一个服务出现问题或者网络超时,都会形成导致接口调用失败,需要跟踪一个请求从一个微服务到下一个微服务的传播过程
分布式服务跟踪可以:
zipkin涉及几个概念:
把注意力集中到一条链路中,一条链路通过Trace Id唯一标识,Span标识发起的请求信息,各span通过parent id 关联起来
利用Annotation信息来计算调用的延迟
sr-cs 得到请求发出延迟
ss-sr 得到服务端处理延迟
cr-cs 得到真个链路完成延迟
案例主要有三个工程组成:
一个server-zipkin,它的主要作用使用ZipkinServer 的功能,收集调用数据,并展示;
一个service-hi,对外暴露hi接口;
一个service-miya,对外暴露miya接口;
这两个service可以相互调用;并且只有调用了,server-zipkin才会收集数据的
引入依赖
<dependency>
<groupId>io.zipkin.javagroupId>
<artifactId>zipkin-serverartifactId>
dependency>
<dependency>
<groupId>io.zipkin.javagroupId>
<artifactId>zipkin-autoconfigure-uiartifactId>
dependency>
启动类加上注解@EnableZipkinServer,开启ZipkinServer的功能
引入依赖
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-zipkinartifactId>
dependency>
在配置文件application.yml中
server:
port: 8988
spring:
application:
name: service-hi
zipkin:
base-url: http://localhost:9411
可以看出,zipkin-client的搭建很简单,通过引入spring-cloud-starter-zipkin依赖和设置spring.zipkin.base-url就可以了
接口
@SpringBootApplication
@RestController
public class ServiceMiyaApplication {
public static void main(String[] args) {
SpringApplication.run(ServiceMiyaApplication.class, args);
}
private static final Logger LOG = Logger.getLogger(ServiceMiyaApplication.class.getName());
@RequestMapping("/hello")
public String hello(){
LOG.log(Level.INFO, "hi is being called");
return "hi i'm miya!";
}
@RequestMapping("/miya")
public String miya(){
LOG.log(Level.INFO, "info is being called");
return restTemplate.getForObject("http://localhost:8988/hello",String.class);
}
@Autowired
private RestTemplate restTemplate;
@Bean
public RestTemplate getRestTemplate(){
return new RestTemplate();
}
@Bean
public AlwaysSampler defaultSampler(){
return new AlwaysSampler();
}
}
@SpringBootApplication
@RestController
public class ServiceHiApplication {
public static void main(String[] args) {
SpringApplication.run(ServiceHiApplication.class, args);
}
private static final Logger LOG = Logger.getLogger(ServiceHiApplication.class.getName());
@Autowired
private RestTemplate restTemplate;
@Bean
public RestTemplate getRestTemplate(){
return new RestTemplate();
}
@RequestMapping("/hello")
public String hello(){
LOG.log(Level.INFO, "calling trace service-hi ");
return "i'm service-hi";
}
@RequestMapping("/hi")
public String hi(){
LOG.log(Level.INFO, "calling trace service-hi ");
return restTemplate.getForObject("http://localhost:8989/hello", String.class);
}
@Bean
public AlwaysSampler defaultSampler(){
return new AlwaysSampler();
}
}
AlwaysSampler 类,它会导出所有的span,不能缺少该类
先启动http://localhost:9411,可以看到zipkin的UI界面
先调用http://localhost:8988/hi
再调用http://localhost:8989/miya
可以很清楚的看到调用微服务之间的调用关系
(注意,这里接口如果为/info好像有莫名的错误)