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@RestControllerpublic class SleuthController {@Autowiredprivate SleuthBFeignClient sleuthBFeignClient;@GetMapping("/sleuth")public String sleuth(){log.info("==== sleuth");String sleuthB = sleuthBFeignClient.sleuthB();log.info(sleuthB);return "sleuth";}}
创建服务调用的项目项目paw-trace-sleuth-b,配置过程同上
增加feign调用的开放接口
@RestControllerpublic 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

Spring Cloud Sleuth与SkyWalking:分布式追踪与性能监控实战

本文介绍了Spring Cloud Sleuth和SkyWalking在微服务架构中的应用,用于实现链路追踪和性能监控。通过示例展示了如何配置Sleuth与Zipkin集成,以及SkyWalking的安装和使用,包括日志格式定制和数据存储。强调了链路追踪在微服务治理中的重要性,并推荐使用SkyWalking因其低侵入性和性能影响小的特点。
2468

被折叠的 条评论
为什么被折叠?



