​飘飞的绿叶之 spring-cloud 链路追踪

​spring-cloud 链路追踪

 

为什么需要链路追踪?

可以理清微服务间的调用关系;

可以快速查询日志;

可以实施系统监控;

 

下面是一个日志,根据traceId可以方便的查看这个服务的调用过程,请求参数、调用类、方法、lineNum、message信息;

​飘飞的绿叶之 spring-cloud 链路追踪

目前主要的一些 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>

 

未加依赖之前日志

​飘飞的绿叶之 spring-cloud 链路追踪

 

引入sleuth依赖后日志

​飘飞的绿叶之 spring-cloud 链路追踪

 

将数据发送到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 {  @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调用的开放接口

@RestControllerpublic class SleuthBController {  @GetMapping("/sleuthB")  public String sleuthB(){    log.info("sleuthB");    return "sleuthB";  }}

 

启动项目,查看日志,链路已生成

​飘飞的绿叶之 spring-cloud 链路追踪

​飘飞的绿叶之 spring-cloud 链路追踪

 

访问记录已发送到zipkin sever端。

​飘飞的绿叶之 spring-cloud 链路追踪

 

show 显示详细信息。

​飘飞的绿叶之 spring-cloud 链路追踪

 

官网文档,slf4j的logback日志已经添加了默认的日志格式,可以自定义logback-spring.xml日志。

​飘飞的绿叶之 spring-cloud 链路追踪

 

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

​飘飞的绿叶之 spring-cloud 链路追踪

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

 

启动成功 查看进程

​飘飞的绿叶之 spring-cloud 链路追踪

 

访问UI localhost:8080

​飘飞的绿叶之 spring-cloud 链路追踪

 

启动采集端 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>

输出日志

​飘飞的绿叶之 spring-cloud 链路追踪

 

项目中加入feign调用后查看

​飘飞的绿叶之 spring-cloud 链路追踪​飘飞的绿叶之 spring-cloud 链路追踪

 

kibana查看ES,有很多数据记录在ES中

​飘飞的绿叶之 spring-cloud 链路追踪

 

通过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 链路追踪

 

 

上一篇:如何根据日志来了解一个请求经历了什么?


下一篇:SkyWalking年轻人的第一个分布式追踪与监控:PHP篇