zipkin是twitter公司基于Google的drapper论文,创建一套分布式、服务计时框架,可以用于链路跟踪。目前有的java版本的实现有DropWizard zipkin和Springcloud-sleuth+zipkin等。本文是搭建Springcloud的入门实例。
trace:个人理解,是一条链路的抽象,表示了一次完成的链路信息。traceid是该链路的唯一标识
span:是链路调用的节点,是链路上一次方法执行的过程。spanId是该过程的标识,同时span可以通过添加tag的方式附加业务信息。
Springcloud针对链路节点过程抽象了四种类型:
sr:server receive服务端接收
ss:server send 服务端发送
cr: client receive 客户端接收
cs:Client send 客户端发送。
下图说明了Springsleuth的链路调用图:
引入上下级span关系后可以形成下面链路图:
创建maven工程,并在pom.xml中引入zipkin相关依赖如下:
<dependency>
<groupId>io.zipkin.javagroupId>
<artifactId>zipkin-serverartifactId>
<version>2.4.2version>
dependency>
<dependency>
<groupId>io.zipkin.javagroupId>
<artifactId>zipkin-autoconfigure-uiartifactId>
<version>2.4.2version>
dependency>
zipkinui是用于页面显示用的。
创建Springboot启动类,并添加注解@EnableZipkinServer,表示为zipkin服务器。
@SpringBootApplication
@EnableZipkinServer
public class ZipkinServerApplicatoin {
public static void main(String[] args) {
SpringApplication.run(ZipkinServerApplicatoin.class,args);
}
}
启动后访问http://localhost:8080即可看到zipkin页面。当然目前服务名没有选项。
创建maven项目并在pom.xml文件中加入如下代码:
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-dependenciesartifactId>
<version>Camden.SR7version>
<type>pomtype>
<scope>importscope>
dependency>
dependencies>
dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
dependency>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-zipkinartifactId>
dependency>
dependencies>
注意Springcloud依赖管理的版本,不同的版本可能会报错。这里我们使用的是Camden.SR7版本。
在resources/application.yml中加入如下配置:
server:
port: 8082
spring:
application:
name: zipkinclientserverone
zipkin:
base-url: http://localhost:8080
sleuth:
sampler:
percentage: 1.0
这里我们将抽样率percentage:设置为100%,表示会抽取所有记录。
创建rest客户端:
@RestController
public class SleuthController {
@ResponseBody
@RequestMapping("/sayHello/{name}")
public String sayHello(@PathVariable String name) {
return "hello " + name;
}
}
启动服务后访问http://localhost:8082/sayHello/lisi,然后在http://localhost:8080中查看:
在服务列表中可以看到我们的客户端,选中查询,可以看到服务调用记录和耗时。
到这里最简单的单个服务的链路耗时调用就 完成了。
上面完成了单级服务调用,这里我们在创建一个zipkin监视服务,并且该服务为上面服务提供服务支持。创建过程如上面一致,只是将端口改为8888。这里不再赘述
增加RestTemplate配置,由Spring管理restTemplate,否则不能被链路调用拦截。
@Configuration
public class RestTemplateConfiguration {
@Bean
public RestTemplate restTemplate(){
return new RestTemplate();
}
}
创建feign调用api
@FeignClient(name = "sleuthService",url = "http://localhost:8888")
public interface SleuthService {
@RequestMapping("/sayHello/{name}")
public String sayHello(@PathVariable(name="name")String name);
}
修改controller
@RestController
public class SleuthController {
@Autowired
private RestTemplate restTemplate;
@Autowired
private SleuthService sleuthService;
@ResponseBody
@RequestMapping("/sayHello/{name}")
public String sayHello(@PathVariable String name) {
return "hello " + name;
}
@ResponseBody
@RequestMapping("/restHello/{name}")
public String restHello(@PathVariable String name){
return restTemplate.getForObject("http://localhost:8888/sayHello/" + name,String.class );
}
@ResponseBody
@RequestMapping("/feignHello/{name}")
public String feignHello(@PathVariable String name){
return sleuthService.sayHello(name);
}
}
启动后,访问系统我们可以在http://localhost:8080中看到如下依赖关系
参考资料
Spring官网资料
本文代码:
zipkinserver代码
监听目标服务一
监听目标服务二