背景
筒子们,最近雷袭又接触到一项新工具:Skywalking,本着好东西要和大家分享的原则,在对它有了初步了解,草草的进行了实践之后,就迫不及待的把它推荐给大家了。在写本篇博客时,本人对Skywalking的了解还比较粗浅,仅限于对它做个入门前的介绍,大佬们看了之后不要笑我哈。
Skywalking介绍
SkyWalking是一个开源的可观测平台,用于从服务和云原生基础设施收集,分析,聚合及可视化数据。它提供了一种简便的方式来清晰地观测分布式系统,甚至横跨多个云平台。它还是一个现代化的应用程序性能监控(Application Performance Monitoring)系统,尤其专为云原生、基于容器的分布式系统设计。
Skywalking的服务网格接收器可以让Skywalking接收来自服务网格框架(例如Istio,Linkerd)的遥测数据,以帮助用户理解整个分布式系统。使用SkyWalking时, 用户可以看到服务与端点之间的拓扑结构,每个服务/服务实例/端点的性能指标,还可以设置报警规则。
SkyWalking 逻辑上分为四部分: 探针, 平台后端, 存储和用户界面.
探针:基于不同的来源可能是不一样的, 但作用都是收集数据, 将数据格式化为 SkyWalking 适用的格式.
平台后端:支持数据聚合, 数据分析以及驱动数据流从探针到用户界面的流程。分析包括 Skywalking 原生追踪和性能指标以及第三方来源,包括 Istio 及 Envoy telemetry , Zipkin 追踪格式化等。 你甚至可以使用 Observability Analysis Language 对原生度量指标和用于扩展度量的计量系统自定义聚合分析。
存储:通过开放的插件化的接口存放 SkyWalking 数据. 你可以选择一个既有的存储系统, 如 ElasticSearch, H2 或 MySQL 集群(Sharding-Sphere 管理),也可以选择自己实现一个存储系统。
UI:一个基于接口高度定制化的Web系统,用户可以可视化查看和管理 SkyWalking 数据。
有关于Skywalking的详细介绍,可以看Apache SkyWalking官网和SkyWalking 文档中文版。
SpringBoot与Skywalking
看了上面的介绍,相信大家对Skywalking都有了一定的了解,那么怎么在工作中使用它呢?接下来咱们以一个SpringBoot项目为例,讲述SkyWalking在Java项目中的使用过程。
1、下载Skywalking安装包,安装包地址见链接和下图。其中SkyWalking APM是监控系统,Java Agent是Java探针,两个都要下载。
2、下载了SkyWalking APM完成后,在本地解压打开,其目录说明如下:
webapp:UI前端jar包及配置文件,该文件夹内可修改前端端口(8080)。
oap-libs:后台应用的jar包,以及依赖,里面server-starter-10.1.0.jar是启动程序
config:启动后台应用程序的配置文件,使用的各种配置。主要是application.yml。
bin:各种启动脚本,一般使用startup.sh来启动页面和后端应用。
|----oapService.bat:默认使用的后台程序启动脚本;
|----oapServiceInit.bat:使用init模式启动;在此模式下,OAP服务器启动以执行初始化工作,然后退出。
|----oapServiceNoInit.bat:使用no init模式启动;在此模式下,OAP服务器不进行初始化。
|----webappService.bat:UI前端的启动脚本
|----startup.bat:组合脚本,同时使用oapService.sh,webappService.sh脚本
下图是skywalking/config/application.yml文件,该文件是用于skywalking apm的基础配置,几个主要的配置如下:
cluster:集群相关配置
core:核心配置
storage:数据存储配置(默认h2,最常改的就是这个)
agent-analyzer:接收探针代理配置
log-analyzer:日志分析
receiver-sharding-server:共享服务器
configuration:远程服务器配置
receiver:数据接收器
从这些配置也可以看出,Skywalking的扩展能力极强,支持多种数据存储方式和集群方式。为方便实践,本次不对配置文件作任何修改。大家在实践时可以根据自己的需要进行调整。
3、启动控制台,Windows环境下直接双击/bin/startup.bat,然后就可以打开http://localhost:8080查看控制台。
至此,Skywalking的控制台就起来了,skywalking-web-ui 的端口默认为8080,skywalking-oap-server服务启动后默认开启11800和12800端口,分别用于收集监控数据(11800)、接受前端请求(12800),这些端口都可以修改,这里暂时不作变更。
4、通过Idea创建一个SpringBoot空的项目,仅包含一个测试的Controller。
package com.leixi.basic.controller;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
/**
*
* @author 雷袭月启
* @since 2024/12/5 19:39
*/
@RestController
public class DemoController {
private final static Logger logger = LoggerFactory.getLogger(DemoController.class);
@GetMapping("/demo")
public Object demo(String str) {
logger.info("Get in demo, the str is:{} ", str);
return "Hello World " + str;
}
}
5、点击Idea右上角的Edit Configuration,在VM Options里添加以下内容:
-javaagent:D:/software/skywalking-agent/skywalking-agent.jar
-DSW_AGENT_COLLECTOR_BACKEND_SERVICES=127.0.0.1:11800
-DSW_AGENT_NAME=leixi-server
解释如下:
-javaagent:用于配置skywalking-agent.jar的地址,即第一步下载解压的java agent地址。
-DSW_AGENT_COLLECTOR_BACKEND_SERVICES:用于配置Skywalking控制台接收信息的地址
-DSW_AGENT_NAME:用于配置本服务在控制台中显示的名称。
6、启动项目,通过浏览器执行请求:http://127.0.0.1:19200/leixi/demo?str=1,在查看控制台-服务,就可以看到相关数据:
7、接下来咱们玩花一点,创建三个服务并注册到Nacos里,通过服务一调服务二,服务二调服务三,三个服务都配置上Skywalking,测试下它的链路跟踪功能,Springboot+Nacos的服务搭建见我之前的博客:SpringBoot+Nacos+feign微服务调用,测试结果如下:
以下是Skywalking的监控情况:
8、上面是通过Idea的方式集成Skywalking,那么在测试、生产环境呢,总不能还用Idea启动项目吧!别急别急,启动jar包时集成Skywalking同样很简单,只需要使用以下命令即可:
java -javaagent:D:/software/skywalking-agent/skywalking-agent.jar -DSW_AGENT_COLLECTOR_BACKEND_SERVICES=127.0.0.1:11800 -DSW_AGENT_NAME=leixi-server -jar xxx.jar
9、如果想在skywalking中看到springboot微服的日志信息,可以在pom.xml中添加以下依赖:
<dependency>
<groupId>org.apache.skywalking</groupId>
<artifactId>apm-toolkit-logback-1.x</artifactId>
<version>9.3.0</version>
</dependency>
<dependency>
<groupId>org.apache.skywalking</groupId>
<artifactId>apm-toolkit-trace</artifactId>
<version>9.3.0</version>
</dependency>
然后,在resources文件夹下创建logback-spring.xml:
<configuration debug="false" scan="false">
<springProperty scop="context" name="spring.application.name" source="spring.application.name" defaultValue=""/>
<property name="log.path" value="logs/${spring.application.name}"/>
<!-- 彩色日志格式 -->
<property name="CONSOLE_LOG_PATTERN"
value="${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>
<!-- 彩色日志依赖的渲染类 -->
<conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter"/>
<conversionRule conversionWord="wex"
converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter"/>
<conversionRule conversionWord="wEx"
converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter"/>
<!-- Console log output -->
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>${CONSOLE_LOG_PATTERN}</pattern>
</encoder>
</appender>
<!-- Log file debug output -->
<appender name="debug" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.path}/debug.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${log.path}/%d{yyyy-MM, aux}/debug.%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern>
<maxFileSize>50MB</maxFileSize>
<maxHistory>30</maxHistory>
</rollingPolicy>
<encoder>
<pattern>%date [%thread] %-5level [%logger{50}] %file:%line - %msg%n</pattern>
</encoder>
</appender>
<!-- Log file error output -->
<appender name="error" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.path}/error.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${log.path}/%d{yyyy-MM}/error.%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern>
<maxFileSize>50MB</maxFileSize>
<maxHistory>30</maxHistory>
</rollingPolicy>
<encoder>
<pattern>%date [%thread] %-5level [%logger{50}] %file:%line - %msg%n</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>ERROR</level>
</filter>
</appender>
<appender name="stdout" 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>%d{yyyy-MM-dd HH:mm:ss.SSS} [%tid] [%thread] %-5level %logger{36} -%msg%n</Pattern>
</layout>
</encoder>
</appender>
<appender name="grpc" class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.log.GRPCLogClientAppender">
<encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
<layout class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.mdc.TraceIdMDCPatternLogbackLayout">
<Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%X{tid}] [%thread] %-5level %logger{36} -%msg%n</Pattern>
</layout>
</encoder>
</appender>
<!--nacos 心跳 INFO 屏蔽-->
<logger name="com.alibaba.nacos" level="OFF">
<appender-ref ref="error"/>
</logger>
<!-- Level: FATAL 0 ERROR 3 WARN 4 INFO 6 DEBUG 7 -->
<root level="INFO">
<!-- <appender-ref ref="console"/>-->
<appender-ref ref="debug"/>
<appender-ref ref="error"/>
<appender-ref ref="stdout"/>
<appender-ref ref="grpc"/>
</root>
</configuration>
再重新启动项目,就可以在skywalking控制台看到服务的日志信息了:
综上,Skywalking确实能直观的监控到各服务之间的调用情况,反映整个系统的服务拓扑结构。这让我想到了SpringCloud大礼包里的Sleuth,但综合对比来看,Skywalking明显比Sleuth更有性价比。
后记与致谢
以上就是今天分享的全部内容了,因为本文着重于介绍Skywalking在Windows环境下的搭建,以及它与SpringBoot项目的集成,服务链路监控,所以对它的其他特性如性能监控,日志监控等并没有深入介绍,读者可以自行实践。
在整理这篇博客时,雷袭同样参考了许多大佬的资料,以下是雷袭觉得很有价值的,分享给大家,同样拜谢大佬!
SkyWalking Server配置文件详解-CSDN博客
skywalking教程 文档手册 使用详情 从搭建到集群
Skywalking的存储配置与调优
Skywalking安装部署,在springboot中的使用
Skywalking学习及整合springboot
skywalking部署及集成Springboot进行简单入门