SkyWalking是一个开源的分布式系统性能监测和追踪解决方案。它主要用于监控和追踪分布式系统中的服务和应用,以便帮助开发人员和运维团队定位和解决性能问题和故障。以下是SkyWalking的主要作用:
分布式追踪:SkyWalking可以跟踪分布式系统中各个组件之间的调用链,从而实现对整个系统的端到端追踪。通过追踪,可以了解请求在系统中的传播路径和调用关系,帮助识别潜在的性能瓶颈和错误。
性能监测:SkyWalking能够监测分布式系统中的各个组件的性能指标,如响应时间、吞吐量、错误率等。通过监测,可以实时了解系统的运行状态,并且可以在性能出现异常时及时做出响应,以保障系统的稳定性和高可用性。
故障定位:当分布式系统发生故障或性能问题时,SkyWalking可以帮助定位问题的原因和位置。通过追踪调用链和监测性能指标,可以找到导致故障的具体组件或服务,并快速排查问题。
可视化监控:SkyWalking提供了直观的可视化监控界面,可以以图形化的方式展示分布式系统的拓扑结构、调用链路和性能指标。这样可以更方便地查看系统运行情况,发现潜在的问题,并进行更有效的决策。
支持多种语言和框架:SkyWalking支持多种编程语言和常用的框架,包括Java、Python、Go、.NET等,使得它适用于不同类型的分布式系统。
总体而言,SkyWalking作为一款强大的分布式性能监测和追踪工具,有助于提高分布式系统的可观察性和可靠性,帮助开发人员和运维团队更好地管理和维护复杂的分布式应用。
使用之前我们首先需要去下载安装包:https://archive.apache.org/dist/skywalking/8.5.0/
不要去下最新版的了,我刚下了个9.5.0的,启动报错,jdk版本不支持,如果要用新版本的自己先去安装对应版本jdk
将安装包上传到服务器/usr/local目录下解压
tar -zxvf apache-skywalking-apm-8.5.0.tar.gz
找到webapp/目录下面的webapp.yml
cd /usr/local/apache-skywalking-apm-bin/webapp/
我们改一下这个端口,原端口是8080,容易冲突
改完之后我们去config/目录下找到application.yml
cd /usr/local/apache-skywalking-apm-bin/config
找到storage.selector,改为mysql
往下拉,找到mysql配置,修改为自己的mysql
记得去建一个数据库swtest,不用建表,服务启动时会自己建表
对了还有个问题,好像需要将mysql的驱动放到/usr/local/apache-skywalking-apm-bin/oap-libs下
这个驱动包可以直接去自己maven库里面找,直接搜mysql-con就可以了,版本差不多就行不一定非要一致
然后我们去bin/目录下启动服务
cd /usr/local/apache-skywalking-apm-bin/bin
直接:sh startup.sh
启动成功后我们打开:http://192.168.43.128:7070/ (这个7070就是刚才自己配置的端口号)
下面这个就是控制台
启动失败的话去/usr/local/apache-skywalking-apm-bin/logs下面看下日志,我第一次就是用了高版本的提示jdk版本异常
还有刚才建的数据库
这些都是自动加进来的表
现在我们把它整合到项目中
找到刚才那个安装包在本地解压一份,因为我们需要agent里面的skywalking-agent.jar
记住这个skywalking-agent.jar不能单独抽出来,一定要放在agent包里面
它后面启动是需要这里面其它文件支持的
然后我们在需要用到的项目模块配置vm运行参数,加入skywalking-agent.jar
我们先在gateway服务里面加上这个
这里注意下idea版本不一样位置有些区别
反正都是在Configuration的里面VM options里面
在里面填入这个:
-javaagent:E:\java_projects\apache-skywalking-apm-bin\agent\skywalking-agent.jar # 自己解压的目录
-Dskywalking.agent.service_name=gateway-service # 服务名称,取的nacos的注册服务名,可以随便取
-Dskywalking.collector.backend_service=192.168.43.128:11800 # 刚部署的服务,11800是固定的不用改
启动的时候看下控制台,刚开始几行要是没报错就说明成功了
今天继续更新一下,昨天找了一下午都没找到为什么skywalking控制台看不到请求接口但是有服务名称
今天早上来重新启动虚拟机启动服务再请求几下接口自己就好了,说明昨天安装配置是正确的,可能就是需要重启一下服务,所以大家也一样,发现和预计不一样确定自己安装配置无异常的情况下先重启服务看看,不然要浪费很多时间
这边是拓扑图,可以看到服务的链路组成
里面有几个服务还没有显示服务名,因为还有些服务没有配置vm启动参数
我们在所有服务里面加上vm启动参数,记得修改-Dskywalking.agent.service_name=gateway-service的服务名称
就可以看到服务名称了
还能看到链路追踪
如果有异常的话这里还会显示是哪个接口异常了
如果我们要在linux上部署服务要用到这个也是一样的在启动命令中加上启动参数就好
/usr/local/apache-skywalking-apm-bin/webapp就是我们之前在服务器上解压的那个路径,这里面有个skywalking-agent.jar
order-0.0.1-SNAPSHOT.jar就是你自己打的order服务包
nohup java -javaagent:/usr/local/apache-skywalking-apm-bin/agent/skywalking-agent.jar -Dskywalking.agent.service_name=order-provider -Dskywalking.collector.backend_service=192.168.43.128:7070 -jar order-0.0.1-SNAPSHOT.jar > order.log 2>&1 &
为了项目能正常打包记得在pom里面加上下面这个,这是springboot基础就不粘贴全部代码了
<build>
<plugins>
<!-- spring-boot package to jar -->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>${spring-boot.version}</version>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
我们还可以在里面通过注解的方式让它在追踪的时候显示请求参数和返回参数
首先我们在order服务的pom里面加入这个:
<!-- skywalking工具类 -->
<dependency>
<groupId>org.apache.skywalking</groupId>
<artifactId>apm-toolkit-trace</artifactId>
<version>8.5.0</version>
</dependency>
然后我们在OrderServiceImpl的addOrder方法上加两个注解就可以了
@Trace和@Tags
@Tags里面的key就是方法名,returnedObj为返回参数,arg[0]表示第一个请求参数
package com.sakura.order.service.impl;
import com.sakura.order.entify.Order;
import com.sakura.order.feign.ProductFeignService;
import com.sakura.order.feign.StockFeignService;
import com.sakura.order.mapper.OrderMapper;
import com.sakura.order.param.AddOrderParam;
import com.sakura.order.service.OrderService;
import io.seata.spring.annotation.GlobalLock;
import io.seata.spring.annotation.GlobalTransactional;
import lombok.extern.java.Log;
import org.apache.http.client.utils.DateUtils;
import org.apache.skywalking.apm.toolkit.trace.Tag;
import org.apache.skywalking.apm.toolkit.trace.Tags;
import org.apache.skywalking.apm.toolkit.trace.Trace;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.Date;
/**
* @author Sakura
* @date 2023/7/28 16:18
*/
@Service
@Log
public class OrderServiceImpl implements OrderService {
@Autowired
OrderMapper orderMapper;
@Autowired
ProductFeignService productFeignService;
@Autowired
StockFeignService stockFeignService;
@Override
@GlobalLock
@GlobalTransactional
@Trace
@Tags({
@Tag(key = "addOrder", value = "returnedObj"),
@Tag(key = "addOrder", value = "arg[0]")
})
public String addOrder(AddOrderParam addOrderParam) {
Order order1 = new Order();
order1.setOrderNo("6341341");
orderMapper.insert(order1);
// 先去查询商品库存信息
Integer num = stockFeignService.getProductNum(addOrderParam.getProductNo());
log.info("商品库存数量:" + num);
if (num == null || num < 1 || num < addOrderParam.getNum()) {
return "商品库存不足";
}
Order order = new Order();
// 根据当前日期加随机数生成一个订单号
order.setOrderNo(DateUtils.formatDate(new Date(), "yyyyMMddHHmmssSSS")
+ (int) ((Math.random() * 9 + 1) * 10000000));
order.setProductNo(addOrderParam.getProductNo());
order.setNum(addOrderParam.getNum());
// 去商品服务获取商品单价
Integer unitPrice = productFeignService.getUnitPrice(addOrderParam.getProductNo());
log.info("商品单价:" + unitPrice);
if (unitPrice == null || unitPrice < 0) {
return "商品价格异常";
}
order.setTotalPrice(addOrderParam.getNum() * unitPrice);
order.setStatus(1);
orderMapper.insert(order);
return "商品下单成功:" + order.getOrderNo() + " 库存:" + num + " 单价:" + unitPrice;
}
}
我们请求一下这个接口,然后在控制台追踪里面找到它
太多乱七八糟的请求就点右上角清空
再点一下上面那个小框里面的内容就可以看到请求参数和返回参数了,其它的接口也是一样的配置
再来看一下性能剖析
点右上角新建任务建一个任务
我们多请求几次这个接口,然后点击一下箭头位置就可以看到这个接口各个部分组成的请求时间
选择时间久的点击分析,就可以看到更详细的分析了,这个大家自己研究一下
最后还剩一个告警功能,这个就是在服务异常的时候它会触发警报功能,这个警报功能你可以自己配置,比如在服务里面写个接口然后记录日志或者发送邮件什么,这里就不讲了,大家自己了解下就可以
有需要代码的自取(https://github.com/PX1206/SpringCloudAlibaba)