一、Zipkin简介
Zipkin是SpringCloud官方推荐的一款分布式链路监控的组件,使用它我们可以得知每一个请求所经过的节点以及耗时等信息,并且它对代码无任何侵入。Zipkin是 Twitter 的一个 开源项目 ,它基于 Google Dapper实现。我们可以使用它来收集各个 服务器 上请求链路的跟踪数据,并通过它提供的 REST API 接口来辅助我们查询跟踪数据以实现对分布式系统的监控程序,从而及时地发现系统中出现的延迟升高问题并找出系统性能瓶颈的根源。除了面向 开发 的API接口之外,它也提供了方便的 UI 组件来帮助我们直观的搜索跟踪信息和分析请求链路明细,比如:可以查询某段时间内各用户请求的处理时间等。
Zipkin的基础架构,它主要有4个核心组件构成:
- Collector:收集器组件,它主要用于处理从外部系统发送过来的跟踪信息,将这些信息转换为Zipkin内部处理的Span格式,以支持后续的存储、分析、展示等功能。
- Storage:存储组件,它主要对处理收集器接收到的跟踪信息,默认会将这些信息存储在内存中,我们也可以修改此存储策略,通过使用其他存储组件将跟踪信息存储到 数据库 中。
- RESTful API:API组件,它主要用来提供外部访问接口。比如给客户端展示跟踪信息,或是外接系统访问以实现监控等。
- Web UI:UI组件,基于API组件实现的上层应用。通过UI组件用户可以方便而有直观地查询和分析跟踪信息。
示例结构图:
① 工程下有4个模块:一个注册中心,一个 Zipkin 服务以及两个提供者
② Zipkin 也分为两部分,server 端和 client 端
③ server 端:收集数据,并展示
④ client 端:把调用信息发送给 server 端
二、Maven依赖
- 服务端Maven依赖
<!--zipkin-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zipkin</artifactId>
</dependency>
<!--图形界面-->
<dependency>
<groupId>io.zipkin.java</groupId>
<artifactId>zipkin-autoconfigure-ui</artifactId>
<version>2.11.8</version>
</dependency>
<dependency>
<groupId>io.zipkin.java</groupId>
<artifactId>zipkin-server</artifactId>
<version>2.11.8</version>
<exclusions>
<exclusion>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j-impl</artifactId>
</exclusion>
</exclusions>
</dependency>
注意:zipkin的版本问题,在此使用的为2.11.8,其它版本报不同错误。
- Zipkin客户端Maven配置
<!--zipkin-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zipkin</artifactId>
<version>2.1.3.RELEASE</version>
</dependency>
三、配置
- 服务端 application.properties 配置
server.port=9411
# zipkin 配置
# 采集率
spring.sleuth.sampler.probability=1.0
# 是否启动zipkin,默认为true
spring.zipkin.enabled=true
# 支持通过服务发现来定位host name:
spring.zipkin.locator.discovery.enabled=true
# 是否启动zipkin地址
spring.zipkin.base-url= http://localhost:9411
#zipkin启动报错无法访问的解决方法 设置为false,默认为true; 关闭自动配置启用所有请求得检测
management.metrics.web.server.auto-time-requests=false
- 服务端启动类
添加注解:@EnableZipkinServer
@SpringBootApplication
@EnableZipkinServer
public class SpringZipkinApplication {
public static void main(String[] args) {
SpringApplication.run(SpringZipkinApplication.class, args);
}
}
- 客户端application.properties 配置
# zipkin服务器地址
spring.zipkin.baseUrl=http://localhost:9411/
# 即100%的概率将链路的数据上传给Zipkin Server,在默认的情况下,该值为0.1
spring.sleuth.sampler.probability=1.0
# 过滤掉URL
spring.sleuth.web.skipPattern=(^cleanup.*)
- 客户端服务提供
spring.application.name=user-client
# 控制器服务提供代码
@RestController
@RequestMapping("user")
public class UserController {
@GetMapping
public String getUser() {
return "admin";
}
}
- 客户端服务消费
spring.application.name=goods-client
# 控制器服务消费代码
@RestController
@RequestMapping("goods")
public class GoodsController {
@Autowired
private RestTemplate restTemplate;
/**
* 注入Rest模板
* @return
*/
@Bean
public RestTemplate getRestTemplate() {
return new RestTemplate();
}
@GetMapping
public String getGoodsByUser() {
String response = (String) restTemplate.exchange("http://localhost:8080/user",
HttpMethod.GET, null, new ParameterizedTypeReference<String>() {
}).getBody();
return response;
}
}
四、测试
-
zipkin服务端监控
http://localhost:9411/zipkin/
-
服务调用
http://localhost:8081/goods
-
链路查看
![链路查看
五、常见错误
- Spring Boot2.1.7启动zipkin-server报错:Error creating bean with name 'armeriaServer' defined in class path
Zipkin最新2.12.9版从2.12.6开始有个较大的更新,迁移使用了Armeria HTTP引擎。存在版本冲突。
使用:
Caused by: java.lang.ClassNotFoundException: com.linecorp.armeria.common.HttpHeaders
zipkin-server的maven版本与spring-boot-starter-parent的maven版本不一致导致。Prometheus requires that all meters with the same name have the same set of tag keys.
在application.properties中添加配置:
# zipkin启动报错无法访问的解决方法
management.metrics.web.server.auto-time-requests=false