springcloud-springcloudalibaba之skywalking分布式链路跟踪;跨多服务追踪,集成日志(十五)(代码片段)

MinggeQingchun MinggeQingchun     2022-10-22     627

关键词:

一、SkyWalking 跨多服务追踪

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

systemctl stop firewalld

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

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

3、启动SkyWalking-UI

[root@eureka8761 bin]# cd /opt/software/apache-skywalking-apm-bin/bin
[root@eureka8761 bin]# ll
total 40
-rwxr-xr-x. 1 501 games 1352 Sep 29  2021 oapService.bat
-rwxr-xr-x. 1 501 games 1364 Sep 29  2021 oapServiceInit.bat
-rwxr-xr-x. 1 501 games 1624 Sep 29  2021 oapServiceInit.sh
-rwxr-xr-x. 1 501 games 1367 Sep 29  2021 oapServiceNoInit.bat
-rwxr-xr-x. 1 501 games 1643 Sep 29  2021 oapServiceNoInit.sh
-rwxr-xr-x. 1 501 games 1626 Sep 29  2021 oapService.sh
-rwxr-xr-x. 1 501 games  941 Sep 29  2021 startup.bat
-rwxr-xr-x. 1 501 games  934 Sep 29  2021 startup.sh
-rwxr-xr-x. 1 501 games 1430 Sep 29  2021 webappService.bat
-rwxr-xr-x. 1 501 games 1657 Sep 29  2021 webappService.sh
[root@eureka8761 bin]# sh startup.sh
SkyWalking OAP started successfully!
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 服务消费者模块

@Slf4j
@RestController
public class GoodsController 

    @Autowired
    private GoodsFeignService goodsFeignService;

    //@Trace(operationName = "trace_goods")
    @RequestMapping("/nacos/goods")
    public Object getAllGoods() 

        return goodsFeignService.getAllGoods();
    

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

@FeignClient(name = "springcloud-alibaba-1-nacos-discovery-provider",
        fallbackFactory = GoodsFeignServiceFallbackFactory.class,
        configuration = FeignConfiguration.class)
public interface GoodsFeignService 

    @RequestMapping("/service/goodList")
    public Object getAllGoods();

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

@RestController
public class GoodsController 

    @Autowired
    private GoodsService goodsService;

    @GetMapping(value = "/service/goodList")
    public List<Goods> goodList()
        List<Goods> goodsList = goodsService.getAllGoods();

        System.out.println("查询商品列表成功:");
        for (Goods good:goodsList) 
            System.out.println("查询商品:"+ good);
        
        return goodsList;
    

二、自定义SkyWalking 链路追踪

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

<!-- SkyWalking 工具类 -->
        <dependency>
            <groupId>org.apache.skywalking</groupId>
            <artifactId>apm-toolkit-trace</artifactId>
            <version>8.1.0</version>
        </dependency>

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

TraceContext.putCorrelation("myKey", "123456");
Optional<String> op = TraceContext.getCorrelation("myKey");
log.info("myValue =  ", op.get());

String traceId = TraceContext.traceId();
log.info("traceId =  ", traceId);

控制台中也会有如下输出

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

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

@Slf4j
@RestController
public class GoodsController 

    @Autowired
    private GoodsFeignService goodsFeignService;

    @Trace(operationName = "trace_goods")
    @RequestMapping("/nacos/goods")
    public Object getAllGoods() 
        log.info("/goods --> getAllGoods --> ......" );

        TraceContext.putCorrelation("myKey", "123456");
        Optional<String> op = TraceContext.getCorrelation("myKey");
        log.info("myValue =  ", op.get());

        String traceId = TraceContext.traceId();
        log.info("traceId =  ", traceId);

        HttpSuport.getInstance().suport();

        return goodsFeignService.getAllGoods();
    



@Slf4j
public class HttpSuport 
    
    public static HttpSuport getInstance() 
        return new HttpSuport();
    

    /**
     * 该方法不能静态
     */
    @Trace(operationName = "http_suport")
    public void suport() 

        TraceContext.putCorrelation("httpKey", "http123456");
        Optional<String> op = TraceContext.getCorrelation("httpKey");
        log.info("HttpSuport myValue =  ", op.get());

        String traceId = TraceContext.traceId();

        log.info("HttpSuport traceId =  ", traceId);
    

三、SkyWalking 集成日志框架

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

<!-- SkyWalking 对 Logback 的集成 -->
        <!--  apm-toolkit-logback-1.x -->
        <dependency>
            <groupId>org.apache.skywalking</groupId>
            <artifactId>apm-toolkit-logback-1.x</artifactId>
            <version>8.1.0</version>
        </dependency>

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

<?xml version="1.0" encoding="UTF-8"?>
<configuration>

    <!-- 引入 Spring Boot 默认的 logback XML 配置文件  -->
    <include resource="org/springframework/boot/logging/logback/defaults.xml"/>

    <!-- 控制台 Appender -->
    <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.40logger39)cyan %clr(:)faint %m%n$LOG_EXCEPTION_CONVERSION_WORD:-%wEx"/>

    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
        <!-- 日志的格式化 -->
        <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
            <layout class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.TraceIdPatternLogbackLayout">
                <Pattern>$CONSOLE_LOG_PATTERN</Pattern>
            </layout>
        </encoder>
    </appender>

    <!-- 从 Spring Boot 配置文件中,读取 spring.application.name 应用名 -->
    <springProperty name="applicationName" scope="context" source="spring.application.name" />

    <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.40logger39 : %m%n$LOG_EXCEPTION_CONVERSION_WORD:-%wEx"/>

    <!-- 日志文件的路径 -->
    <property name="LOG_FILE" value="/logs/$applicationName.log"/>

    <!-- 日志文件 Appender -->
    <appender name="file" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>$LOG_FILE</file>
        <!--滚动策略,基于时间 + 大小的分包策略 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>$LOG_FILE.%dyyyy-MM-dd.%i.gz</fileNamePattern>
            <maxHistory>7</maxHistory>
            <maxFileSize>10MB</maxFileSize>
        </rollingPolicy>
        <!-- 日志的格式化 -->
        <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
            <layout class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.TraceIdPatternLogbackLayout">
                <Pattern>$FILE_LOG_PATTERN</Pattern>
            </layout>
        </encoder>
    </appender>

    <!-- 设置 Appender -->
    <root level="INFO">
        <appender-ref ref="console"/>
        <appender-ref ref="file"/>
    </root>

</configuration>

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

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

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

本地也会有日志输出文件

springcloud-springcloud之stream构建消息驱动微服务框架;springcloudalibaba集成rocketmq(二十四)(代码片段)

阅读本文前可先参考SpringCloud-SpringCloud之Stream构建消息驱动微服务框架;RabbitMQ(十九)_MinggeQingchun的博客-CSDN博客_springcloudstream一、SpringCloudStream在微服务的开发过程中,会经常用到消息中间件,通过消息中间... 查看详情

springcloud-springcloud之config分布式配置;config注册至eureka;集成security安全认证(十七)(代码片段)

阅读本文前可先参考​​​​​​SpringCloud-SpringCloud根/父项目,开发准备(二)_MinggeQingchun的博客-CSDN博客https://blog.csdn.net/MinggeQingchun/article/details/125337347https://blog.csdn.net/MinggeQingchun/arti 查看详情

springcloud-springcloud之config分布式配置;加解密;配置信息局部刷新;springcloudbus+rabbitmq全局刷新(十六)(代码片段)

阅读本文前可先参考​​​​​​SpringCloud-SpringCloud根/父项目,开发准备(二)_MinggeQingchun的博客-CSDN博客https://blog.csdn.net/MinggeQingchun/article/details/125337347一、加解密在Git仓库中明文存储配置信息值,对于某些敏感... 查看详情

springcloud-springcloud之sleuth分布式链路跟踪;zipkin埋点数据;elasticsearch数据持久化(十八)(代码片段)

阅读本文前可先参考​​​​​​SpringCloud-SpringCloud根/父项目,开发准备(二)_MinggeQingchun的博客-CSDN博客一、SpringCloudSleuth微服务有几种监控方式,如SpringBootActuator监控微服务,SpringBootAdmin监控微服务,Hy... 查看详情

springcloud-springcloud之security服务安全机制(二十)(代码片段)

阅读本文前可先参考​​​​​​SpringCloud-SpringCloud根/父项目,开发准备(二)_MinggeQingchun的博客-CSDN博客SpringSecurity微服务的Rest服务都是基于http请求的,因此很有可能暴露在公网上,任何人都可能调用访问&#... 查看详情

springcloud-springcloud之gateway网关(十三)

阅读本文前可先参考​​​​​​SpringCloud-SpringCloud根/父项目,开发准备(二)_MinggeQingchun的博客-CSDN博客一、API网关引自百度百科API网关,软件术语,两个相互独立的局域网之间通过路由器进行通信,中... 查看详情

springcloud-springcloud之zuul和gateway网关(十四)(代码片段)

SpringCloudGateway是SpringCloud的一个子项目。而zuul则是Netflix公司的项目,只是Spring将zuul集成在SpringCloud中使用而已。因为zuul2.0连续跳票和zuul1的性能表现不是很理想,所以催生了spring团队开发了Gateway项目ZuulZuul是netflix公司的... 查看详情

springcloud-springcloud之config分布式配置;server,client配置(十五)(代码片段)

阅读本文前可先参考​​​​​​SpringCloud-SpringCloud根/父项目,开发准备(二)_MinggeQingchun的博客-CSDN博客在分布式微服务系统中,几乎所有服务的运行都离不开配置文件的支持,这些配置文件通常由各个服务... 查看详情

springcloud-springcloud简介(代码片段)

1,springcloud简介​springcloud是分布式微服务架构的一站式解决方案,是多种微服务架构落地技术的集合体,俗称微服务全家桶。实现的功能有服务注册与发现,服务调用,服务熔断,负载均衡,服务降... 查看详情

springcloud-springcloud之apolloconfig携程阿波罗配置中心(二十一)(代码片段)

由于SpringCloud自带的Config需要配合Bus使用,且不能实时刷新,因此市面上出现了很多开元的配置中心市面上开源的配置中心Apollo(阿波罗):携程框架部门研发的分布式配置中心,能够集中化管理应用不同... 查看详情

springcloud-springcloudnetflix之ribbon(代码片段)

阅读本文前可先参考 SpringCloud-SpringCloud根/父项目,开发准备(二)_MinggeQingchun的博客-CSDN博客SpringCloudRibbon是一套基于NetflixRibbon实现的客户端负载均衡和服务调用工具Ribbon是Netflix公司发布的开源组件,其主要功... 查看详情

springcloud-springcloudalibaba之gateway集成sentinel(代码片段)

阅读本文前可先参考SpringCloud-SpringCloud之Gateway网关(十三)_MinggeQingchun的博客-CSDN博客_spring.cloud.gateway.routes[0]SpringCloud-SpringCloudAlibaba之Sentinel规则持久化(十)_MinggeQingchun的博客-CSDN 查看详情

springcloud-springcloudnetflix之hystrixdashboard仪表盘监控(代码片段)

阅读本文前可先参考SpringCloud-SpringCloud根/父项目,开发准备(二)_MinggeQingchun的博客-CSDN博客https://blog.csdn.net/MinggeQingchun/article/details/125308948https://blog.csdn.net/MinggeQingchun/article/de 查看详情

springcloud-springcloudnetflix之eureka,ribbon(代码片段)

阅读本文前可先参考 SpringCloud-SpringCloud根/父项目,开发准备(二)_MinggeQingchun的博客-CSDN博客我们首先来看下不需要注册服务中心,服务消费者直接调用服务提供者一、服务消费者直接访问服务提供者1、服务提... 查看详情

springcloud-springcloudnetflix之zuul网关;路由(代码片段)

阅读本文前可先参考SpringCloud-SpringCloud根/父项目,开发准备(二)_MinggeQingchun的博客-CSDN博客一、API网关引自百度百科API网关,软件术语,两个相互独立的局域网之间通过路由器进行通信,中间的路由被称... 查看详情

springcloud-springcloudnetflix之hystrix;turbine(代码片段)

阅读本文前可先参考SpringCloud-SpringCloud根/父项目,开发准备(二)https://blog.csdn.net/MinggeQingchun/article/details/125308948https://blog.csdn.net/MinggeQingchun/article/details/125312594 https://blog.csdn.net/MinggeQingchun/article/details/125315839SpringClou... 查看详情

springcloud-springcloudnetflix之zuul网关;过滤器filter(代码片段)

阅读本文前可先参考​​​​​​SpringCloud-SpringCloud根/父项目,开发准备(二)_MinggeQingchun的博客-CSDN博客https://blog.csdn.net/MinggeQingchun/article/details/125326667Zuul包含了对请求的路由和过滤两个最主要的功能,外加代... 查看详情