简介
在微服务环境中经常需要排查系统之间调用哪个环节出问题了,如果有了追踪记录则排查起来就更加方便。这一期记录一下在SpringBoot中集成Slueth和Zipkin,推送至Zipkin服务端,并利用切面实现自定义Tag,尝试扩展追踪记录中的信息。
环境
- Idea2019
- Jdk1.8
- Maven3.6.3
- CentOs7
搭建zipkin服务端
建立初始数据表
如果采用其他类型数据存储的这一步可忽略,本人限于服务器内存太小,没有跑ES,所以用的是mysql存储。在自己的mysql数据库中执行初始脚本即可:源sql下载请点这里。
docker-compose配置
我这里zipkin服务端采用docker部署,如下是docker-compose配置:xjy-zipkin.yml。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21version: "2"
services:
nacos:
image: openzipkin/zipkin
container_name: xjy-zipkin
ports:
- "9411:9411"
environment:
- STORAGE_TYPE=mysql
# Point the zipkin at the storage backend
- MYSQL_DB=zipkin
- MYSQL_USER=123
- MYSQL_PASS=456
- MYSQL_HOST=your-mysql
- MYSQL_TCP_PORT=3306
networks:
- xjynet
networks:
xjynet:
external: true
启动一下看效果
启动命令1
docker-compose -f xjy-zipkin.yml up -d
访问http://你的域名:9411,看效果如下:
项目中集成Slueth和ZipKin
pom参数
pom文件中增加如下两个依赖:1
2
3
4
5
6
7
8
9
10<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-sleuth</artifactId>
<version>2.2.6.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zipkin</artifactId>
<version>2.2.6.RELEASE</version>
</dependency>
application.yml配置
相关配置如下:1
2
3
4
5
6
7spring:
zipkin:
enabled: true
baseUrl: http://你的域名:9411 # 服务端的地址
sleuth:
sampler:
percentage: 1 # 采样率,当前测试是百分之百,线上需按照性能调整
启动看效果
运行springboot项目,然后访问任一个restful接口,即可查看到追踪记录。
利用切面实现自定义Tag
编写切面类
下面以记录所有Controller的返回结果为例,切面类代码如下:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35package com.xjy.world.seconLevel.zipkin.aspect;
import brave.Span;
import brave.Tracer;
import com.alibaba.fastjson.JSONObject;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.stereotype.Component;
"spring.sleuth.enabled", matchIfMissing = false) (value =
public class TracerServiceAspect {
"execution(public * com.xjy.world.seconLevel.zipkin.controller..*.*(..))") (
public void tracerLog() {
}
// 全局的trace对象
Tracer tracer;
// 针对所有Controller层的方法的切面
"tracerLog()") (
public Object doSurround(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
Span currentSpan = tracer.currentSpan();
// 方法的执行结果
Object result = proceedingJoinPoint.proceed();
currentSpan.tag("controller返回结果", JSONObject.toJSONString(result));
return result;
}
}
重启查看效果
重启springboot项目,再请求任一restful接口,搜索追踪记录后点击SHOW查看详情,发现自定义的Tag信息已被记录:
结束语
服务追踪当然不是为只追踪单个应用,想看多个系统之间的调用关联信息,在各个springboot项目中都配置一下就好了,它们之间会通过追踪ID和父ID等信息关联,这里不在一一列举。探索更多用法可以推荐两篇参考文章:《Spring Cloud Sleuth 2.0概要使用说明》和《追踪工具Sleuth》。
下期预告
下期准备把Spring Boot Actuator和Spring Boot Admin实现健康性能监测实战一下,下期再见。
本文链接: https://www.xiajunyi.com/pages/p74.html
版权声明:本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。转载请注明出处!