说明
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关系后可以形成下面链路图:
搭建Springcloud-sleuth+zipkin
1环境说明
- 开发IDE:intellij IDEA2017
- jdk:1.8
- maven:3.3.9
- springboot:1.5.2RELEASE
- springcloud:Camden.SR7
2创建zipkin服务器
创建maven工程,并在pom.xml中引入zipkin相关依赖如下:
<!--引入Springzipkinserver-->
<dependency>
<groupId>io.zipkin.java</groupId>
<artifactId>zipkin-server</artifactId>
<version>2.4.2</version>
</dependency>
<!--引入Springzipkinwebui-->
<dependency>
<groupId>io.zipkin.java</groupId>
<artifactId>zipkin-autoconfigure-ui</artifactId>
<version>2.4.2</version>
</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页面。当然目前服务名没有选项。
3创建zipkin监控服务
创建maven项目并在pom.xml文件中加入如下代码:
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Camden.SR7</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--引入zipkin-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zipkin</artifactId>
</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信息是默认保存在内存中的
- 客户端的sleuth信息,是通过socket请求发送到zipkin服务器的,客户端会不停扫描sleuth队列,一旦有信息就推送到zipkin服务器
- 客户端多级服务链路采集是通过添加请求头实现的,原理是通过AOP切面,在请求头里添加链路信息,二级服务,通过filter获取链路信息并发送到zipkin服务器。
- Spring支持的二级服务调用方式有:feign、resttemplate两种方式,当然,这两种方式都要求通过Spring容器来做。如果自己创建连接或者resttemplate是不可能被Spring处理的,毕竟是AOP方式实现链路信息添加。
- zipkin服务端是通过HttpProcesser来处理链路信息,因此想要通过webfilter实现拦截是不可能的。
4多级服务调用链路
上面完成了单级服务调用,这里我们在创建一个zipkin监视服务,并且该服务为上面服务提供服务支持。创建过程如上面一致,只是将端口改为8888。这里不再赘述
5修改第一个工程加入RestTemplate支持和Feign支持
增加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代码
监听目标服务一
监听目标服务二
来源:CSDN
作者:niemingming
链接:https://blog.csdn.net/niemingming/article/details/78988903