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
二、SkyWalking 分布式追踪系统
官网:https://skywalking.apache.org/
简书:https://www.jianshu.com/p/2fd56627a3cf
文档:https://skywalking.apache.org/docs/
SkyWalking ,它是一款优秀的国产APM工具。
APM(Application Performance Management)
SkyWalking 8.x
tar包下载,SkyWalking APM Distribution
https://skywalking.apache.org/downloads/
选择版本 v8.5.0 for H2/MySQL/TiDB/InfluxDB/ElasticSearch 7
启动服务:
OAPServerStartUp配置文件 config/application.yml 默认存储h2,修改存储为elasticsearch7,以及ES7服务地址。
skywalking-webapp 配置文件 webapp/webapp.yml
UI默认端口localhost:8080
selector: ${SW_STORAGE:elasticsearch7}
clusterNodes: ${SW_STORAGE_ES_CLUSTER_NODES:localhost:9200}
在安装bin目录下
./startup.sh
启动成功 查看进程
访问UI localhost:8080
启动采集端 java agent
java -jar方式通过修改启动脚本启动,示例 修改${}处
nohup java -javaagent:/data/skywalking/apache-skywalking-apm-bin-es7/agent/skywalking-agent.jar -
Dskywalking.agent.service_name=${SERVER_NAME} -Dskywalking.collector.backend_service=127.0.0.1:11800 -
jar -Xms1024m -Xmx1024m -Djava.security.egd=file:/dev/./urandom $JAR_FILE --spring.application.
name=${SERVER_NAME} --spring.profiles.active=${ACTIVE} --server.port=${PORT}> /data/logs/${SERVER_NAME}
/console.log 2>&1&
idea中启动,修改 VM options,示例如下
-DSW_AGENT_NAME=skywalking-consumer ##
-DSW_AGENT_COLLECTOR_BACKEND_SERVICES=127.0.0.1:11800 ##
-javaagent:D:\mengwei\work\kuaidian\code\skywalking\apache-skywalking-apm-bin-es7\agent\skywalking-agent.
jar ##agent
日志中打印traceId 增加[%traceId]
<dependency>
<groupId>org.apache.skywalking</groupId>
<artifactId>apm-toolkit-logback-1.x</artifactId>
<version>8.5.0</version>
</dependency>
修改logback.xml中的Appender的Pattern
<encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
<layout class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.TraceIdPatternLogbackLayout">
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level logger_name:%logger{36} - [%tid] - message:%msg%n</pattern>
</layout>
</encoder>
输出日志
项目中加入feign调用后查看
kibana查看ES,有很多数据记录在ES中
通过logstash发送日志数据到ES,省略。
至此即完成链路追踪,性能检测,日志查询。
总结:
链路追踪是微服务治理中的重要一环,可起到对服务中的整体监控,链路节点的性能监控,日志的快速查询等重要作用。综合java agent的低侵入性,以及对性能的低影响性,推荐skywalking进行链路追踪。
号外:docker 安装 skywalking
docker pull apache/skywalking-oap-server:8.5.0-es7
docker run --name skywalking --net esnet -d -e SW_STORAGE=elasticsearch7 \
-e SW_STORAGE_ES_CLUSTER_NODES=localhost:9200 apache/skywalking-oap-server:8.5.0-es7
参考博文:
SkyWalking 分布式追踪系统
java agent技术原理及简单实现
Logback获取SkyWalking的全局唯一标识 trace-id 记录到日志中
调用链选型之Zipkin,Pinpoint,SkyWalking,CAT
探针性能揭秘
gitee:
mater paw-trace-xx 或 paw-trace 分支
https://gitee.com/tg_seahorse/paw-demos