• SpringCloud - Spring Cloud Alibaba 之 SkyWalking 分布式链路跟踪;跨多服务追踪,集成日志(十五)


    一、SkyWalking 跨多服务追踪

    1、关闭防火墙,如果nacos使用MySQL持久化规则,则启动MySQL服务

    systemctl stop firewalld

    2、 启动单机版Nacos,浏览器输入http://192.168.133.129:8848/nacos

    1. [root@eureka8761 ~]# cd /opt/software/nacos/bin/
    2. [root@eureka8761 bin]# ll
    3. total 24
    4. -rw-r--r--. 1 root root 721 Jul 7 09:44 derby.log
    5. drwxr-xr-x. 2 root root 270 Jul 25 14:56 logs
    6. -rwxr-xr-x. 1 502 games 954 May 14 2020 shutdown.cmd
    7. -rwxr-xr-x. 1 502 games 951 Dec 14 2021 shutdown.sh
    8. -rwxr-xr-x. 1 502 games 3368 Jan 12 2022 startup.cmd
    9. -rwxr-xr-x. 1 502 games 5161 Jul 5 12:19 startup.sh
    10. drwxr-xr-x. 3 root root 20 Jul 5 12:19 work
    11. [root@eureka8761 bin]# sh startup.sh -m standalone

    3、启动SkyWalking-UI

    1. [root@eureka8761 bin]# cd /opt/software/apache-skywalking-apm-bin/bin
    2. [root@eureka8761 bin]# ll
    3. total 40
    4. -rwxr-xr-x. 1 501 games 1352 Sep 29 2021 oapService.bat
    5. -rwxr-xr-x. 1 501 games 1364 Sep 29 2021 oapServiceInit.bat
    6. -rwxr-xr-x. 1 501 games 1624 Sep 29 2021 oapServiceInit.sh
    7. -rwxr-xr-x. 1 501 games 1367 Sep 29 2021 oapServiceNoInit.bat
    8. -rwxr-xr-x. 1 501 games 1643 Sep 29 2021 oapServiceNoInit.sh
    9. -rwxr-xr-x. 1 501 games 1626 Sep 29 2021 oapService.sh
    10. -rwxr-xr-x. 1 501 games 941 Sep 29 2021 startup.bat
    11. -rwxr-xr-x. 1 501 games 934 Sep 29 2021 startup.sh
    12. -rwxr-xr-x. 1 501 games 1430 Sep 29 2021 webappService.bat
    13. -rwxr-xr-x. 1 501 games 1657 Sep 29 2021 webappService.sh
    14. [root@eureka8761 bin]# sh startup.sh
    15. SkyWalking OAP started successfully!
    16. SkyWalking Web Application started successfully!

    4、IDEA中配置使用SkyWalking

    -javaagent:D:\SoftDevelopMentTools\SkyWalking\apache-skywalking-java-agent-8.8.0\skywalking-agent\skywalking-agent.jar

    SW_AGENT_COLLECTOR_BACKEND_SERVICES=192.168.133.129:11800;SW_AGENT_NAME=springboot-1-consumer

    5、启动网关、消费者,服务者查看 SkyWalking-UI控制台

    拓扑图如下:

    代码流程追踪:

    (1) springcloud-alibaba-1-nacos-discovery-consumer 服务消费者模块

    1. @Slf4j
    2. @RestController
    3. public class GoodsController {
    4. @Autowired
    5. private GoodsFeignService goodsFeignService;
    6. //@Trace(operationName = "trace_goods")
    7. @RequestMapping("/nacos/goods")
    8. public Object getAllGoods() {
    9. return goodsFeignService.getAllGoods();
    10. }
    11. }

    (2) springcloud-alibaba-1-commons 公共模块

    1. @FeignClient(name = "springcloud-alibaba-1-nacos-discovery-provider",
    2. fallbackFactory = GoodsFeignServiceFallbackFactory.class,
    3. configuration = FeignConfiguration.class)
    4. public interface GoodsFeignService {
    5. @RequestMapping("/service/goodList")
    6. public Object getAllGoods();
    7. }

    (3) springcloud-alibaba-1-nacos-discovery-provider 服务提供者模块

    1. @RestController
    2. public class GoodsController {
    3. @Autowired
    4. private GoodsService goodsService;
    5. @GetMapping(value = "/service/goodList")
    6. public List goodList(){
    7. List goodsList = goodsService.getAllGoods();
    8. System.out.println("查询商品列表成功:");
    9. for (Goods good:goodsList) {
    10. System.out.println("查询商品:"+ good);
    11. }
    12. return goodsList;
    13. }
    14. }

    二、自定义SkyWalking 链路追踪

    1、我们在服务消费者模块 springcloud-alibaba-1-nacos-discovery-consumer 添加依赖

    1. <dependency>
    2. <groupId>org.apache.skywalkinggroupId>
    3. <artifactId>apm-toolkit-traceartifactId>
    4. <version>8.1.0version>
    5. dependency>

    2、 在controller调用方法中添加如下代码

    1. TraceContext.putCorrelation("myKey", "123456");
    2. Optional op = TraceContext.getCorrelation("myKey");
    3. log.info("myValue = {} ", op.get());
    4. String traceId = TraceContext.traceId();
    5. log.info("traceId = {} ", traceId);

    控制台中也会有如下输出

    这样就可以获取跟踪的traceId,便于根据traceId去ui界面搜索整个跟踪链路

    3、如果一个业务方法想在ui界面的跟踪链路上显示出来,只需要在业务方法上加上@Trace注解即可

    1. @Slf4j
    2. @RestController
    3. public class GoodsController {
    4. @Autowired
    5. private GoodsFeignService goodsFeignService;
    6. @Trace(operationName = "trace_goods")
    7. @RequestMapping("/nacos/goods")
    8. public Object getAllGoods() {
    9. log.info("/goods --> getAllGoods --> ......" );
    10. TraceContext.putCorrelation("myKey", "123456");
    11. Optional op = TraceContext.getCorrelation("myKey");
    12. log.info("myValue = {} ", op.get());
    13. String traceId = TraceContext.traceId();
    14. log.info("traceId = {} ", traceId);
    15. HttpSuport.getInstance().suport();
    16. return goodsFeignService.getAllGoods();
    17. }
    18. }
    19. @Slf4j
    20. public class HttpSuport {
    21. public static HttpSuport getInstance() {
    22. return new HttpSuport();
    23. }
    24. /**
    25. * 该方法不能静态
    26. */
    27. @Trace(operationName = "http_suport")
    28. public void suport() {
    29. TraceContext.putCorrelation("httpKey", "http123456");
    30. Optional op = TraceContext.getCorrelation("httpKey");
    31. log.info("HttpSuport myValue = {} ", op.get());
    32. String traceId = TraceContext.traceId();
    33. log.info("HttpSuport traceId = {} ", traceId);
    34. }
    35. }

    三、SkyWalking 集成日志框架

    1、服务提供者、消费者、网关模块都添加依赖

    1. <dependency>
    2. <groupId>org.apache.skywalkinggroupId>
    3. <artifactId>apm-toolkit-logback-1.xartifactId>
    4. <version>8.1.0version>
    5. dependency>

    2、resources下添加 logback-spring.xml 文件

    1. <configuration>
    2. <include resource="org/springframework/boot/logging/logback/defaults.xml"/>
    3. <property name="CONSOLE_LOG_PATTERN" value="%clr(%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS}}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %tid %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}"/>
    4. <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
    5. <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
    6. <layout class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.TraceIdPatternLogbackLayout">
    7. <Pattern>${CONSOLE_LOG_PATTERN}Pattern>
    8. layout>
    9. encoder>
    10. appender>
    11. <springProperty name="applicationName" scope="context" source="spring.application.name" />
    12. <property name="FILE_LOG_PATTERN" value="%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS}} ${LOG_LEVEL_PATTERN:-%5p} ${PID:- } %tid --- [%t] %-40.40logger{39} : %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}"/>
    13. <property name="LOG_FILE" value="/logs/${applicationName}.log"/>
    14. <appender name="file" class="ch.qos.logback.core.rolling.RollingFileAppender">
    15. <file>${LOG_FILE}file>
    16. <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
    17. <fileNamePattern>${LOG_FILE}.%d{yyyy-MM-dd}.%i.gzfileNamePattern>
    18. <maxHistory>7maxHistory>
    19. <maxFileSize>10MBmaxFileSize>
    20. rollingPolicy>
    21. <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
    22. <layout class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.TraceIdPatternLogbackLayout">
    23. <Pattern>${FILE_LOG_PATTERN}Pattern>
    24. layout>
    25. encoder>
    26. appender>
    27. <root level="INFO">
    28. <appender-ref ref="console"/>
    29. <appender-ref ref="file"/>
    30. root>
    31. configuration>

    3、controller调用方法中添加日志记录,如

    log.info("/goods --> getAllGoods --> ......" );

    4、访问controller测试,查看日志输出,就可以在日志中看到跟踪的traceId

    本地也会有日志输出文件

  • 相关阅读:
    android开发工作笔记
    C++之委托构造函数实例(二百四十三)
    rabbitmq载在.net中批量消费的问题记录
    【LeetCode】15. 三数之和
    保研笔记二 软件工程与计算卷二(13-16章)
    input六位验证码,输入自动跳到下一格,删除自动回退到上一格
    数字媒体概论——3D篇
    新特性解读 | MySQL 8.0 在线调整 REDO
    Axios 的介绍(使用和作用)
    【Linux】基本操作指令汇总(不完全)
  • 原文地址:https://blog.csdn.net/MinggeQingchun/article/details/126054275