spring-cloud 链路追踪
为什么需要链路追踪?
可以理清微服务间的调用关系;
可以快速查询日志;
可以实施系统监控;
根据traceId可以方便的查看这个服务的调用过程,请求参数、调用类、方法、lineNum、message信息;
目前主要的一些 APM 工具有: Cat、Zipkin、Pinpoint、SkyWalking。
一、spring-cloud-sleuth
官网: https://spring.io/projects/spring-cloud-sleuth
准备工作:docker 安装 zipkin server,nacos注册中心默认已有
docker pull openzipkin/zipkin
docker run --name zipkin -d -p 9411:9411 openzipkin/zipkin
访问zipkin服务:http://localhost:9411/zipkin/
开始构建项目 paw-trace-sleuth,添加依赖
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${release.train.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-sleuth</artifactId>
</dependency>
</dependencies>
未加依赖之前日志
引入sleuth依赖后日志
将数据发送到zipkin sever。
zipkin 配置
spring:
zipkin:
base-url: http://localhost:9411/
写一个服务调用 注册中心nacos,用openfeign调用
增加依赖,并在启动类开始 @EnableDiscoveryClient @EnableFeignClients
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
定义feignclient
@FeignClient("paw-trace-sleuth-b")
public interface SleuthBFeignClient {
@GetMapping("/sleuthB")
public String sleuthB();
}
服务调用
@Slf4j
@RestController
public class SleuthController {
@Autowired
private SleuthBFeignClient sleuthBFeignClient;
@GetMapping("/sleuth")
public String sleuth(){
log.info("==== sleuth");
String sleuthB = sleuthBFeignClient.sleuthB();
log.info(sleuthB);
return "sleuth";
}
}
创建服务调用的项目项目paw-trace-sleuth-b,配置过程同上
增加feign调用的开放接口
@RestController
public class SleuthBController {
@GetMapping("/sleuthB")
public String sleuthB(){
log.info("sleuthB");
return "sleuthB";
}
}
启动项目,查看日志,链路已生成
访问记录已发送到zipkin sever端。
show 显示详细信息。
官网文档,slf4j的logback日志已经添加了默认的日志格式,可以自定义logback-spring.xml日志。
zipkin默认用内存存储数据,实际项目中一般用 kafa+ES存储数据
docker 方式:
docker run -it -d --restart=always -e KAFKA_BOOTSTRAP_SERVERS=10.0.1.66:9092 \
-e STORAGE_TYPE=elasticsearch -e ES_HOSTS=http://10.0.1.66:9200 -p 10086:9411 openzipkin/zipkin
启动jar的方式
java -DKAFKA_ZOOKEEPER=10.22.0.130:2181 -DSTORAGE_TYPE=elasticsearch
-DES_HOSTS=http://10.22.0.130:9200 -jar zipkin.jar