分布式链路追踪--SkyWalking7.0.0+es7.0.0

分布式链路追踪--SkyWalking

​ 微服务的出现,的确解决了一些业务痛点,但是也造成了新的问题比如随着调用链的拉长,如果想要知道请求为什么这么慢,这个请求到底经历了哪些环节,又依赖了哪些东西,在微服务架构中定位这些问题并且解决是比较麻烦的。

​ 什么是调用链呢?

​ A服务调用B服务也可以说是一个调用链,即使是同一个服务中的一个方法调用到另一个方法,也可以说是一个调用链。

​ 以前单体应用中,排查问题往往只需要到这台应用的服务,查看日志基本就能把问题解决了。但是在微服务系统中,一般是分布式部署的,这也就给排查增加了难度,如果把一台台服务器登录上找问题,既麻烦又耗时。

​ 为了解决这些问题,业内已经有了分布式链路追踪的解决方案,比如使用ZipKin、SkyWalking等。

SkyWalking介绍

​ SkyWalking是基于OpenTracing实现的开源项目,2017年12月8日已进入Apache孵化器。

​ 是一个APM(应用性能监控)系统,专为微服务、云原生架构和基于容器(Docker、k8s、Mesos)架构而设计。通过探针收集应用的指针,并进行分布式链路追踪。SkyWalking会感知服务之间的调用链路关系,形成相应的统计数据。它的特性如下:

  • 支持警告
  • 采用探针技术,对业务代码零侵入
  • 支持自动及手动探针
  • 轻量高效,不需要大数据平台
  • 多种监控手段,多语言自动探针
  • 可视化后台
  • 模块化

SkyWalking的整体架构:

  • 探针(agent):负责数据收集,包含了Tracing和Metrics的数据
  • 可观测性能分析平台(OAP):接收探针发送的数据,并使用分析引擎进行数据整合、运算,然后把数据存储到对应的存储介质(可用H2或Elasticsearch等)上,还为UI后台提供接口
  • UI:调用OAP的接口,提供可视化界面展示

Elasticsearch下载安装

那么SkyWalking的存储介质,笔者这s选择使用Elasticsearch,先到Elasticsearch的官网下载。

windows版本下载地址,选择下载了一个7.0.0版本的。

这里笔者就使用windows版本了,需要linux版本或其他可以自行查阅资料。

下载解压后,到config/elasticsearch.yml中修改下集群名:

cluster.name: my-application

后直接到bin目录下,执行elasticsearch.bat即可执行es服务,默认端口9200

启动完毕后,访问下localhost:9200,得到如下信息即是安装成功

完成后,再去安装SkyWalking。注意这里cluster.name是my-application。后面skywalking需要用。

SkyWalking下载安装

下载地址:https://skywalking.apache.org/downloads/

下载过慢或者下载无反应的,可以尝试使用国内镜像地址去下载,https://mirrors.cloud.tencent.com/apache/skywalking

笔者使用7.0.0版本的,地址在这里:https://www.apache.org/dyn/closer.cgi/skywalking/7.0.0/apache-skywalking-apm-es7-7.0.0.tar.gz

这里提供下网盘资源:

链接:https://pan.baidu.com/s/1lQoMDFIH3PYGCla3PtIIRg

提取码:2a96

下载解压后,得到如下目录:

  • agent:探针相关,代理模块
  • bin:oapService和webappService的启动脚本,也有两个脚本合并的脚本start.bat,linux系统启动.sh的文件
  • config:数据收集器、存储、告警等配置信息
  • logs:collector和web-ui的日志
  • webapp:SkyWalking展示的UIjar文件和配置文件

config/application.yml中修改配置

yml 复制代码
storage:
  selector: ${SW_STORAGE:elasticsearch7}

修改elsticsearch的nameSpace和ClusterNodes,这里nameSpace是前面配置的es的集群名称

yml 复制代码
storage:
  selector: ${SW_STORAGE:elasticsearch7}
  elasticsearch7:
    nameSpace: ${SW_NAMESPACE:"my-application"}
    clusterNodes: ${SW_STORAGE_ES_CLUSTER_NODES:localhost:9200}

注意:SkyWalking默认使用的端口是8080、11800、12800,如有占有,可去config/application.ymlwebapp/application.yml中修改

启动

执行startup.bat启动

访问localhost:8080即可进入skywalking的可视化界面

IDEA使用agent

IDEA使用agent主要使用于本地开发环境,需要又agent文件夹,然后加上启动参数即可。

找到两个springboot微服务项目,然后在它们的IDEA启动配置中,增加参数:

transaction的

shell 复制代码
-javaagent:D:\env\envir\skywalking7\agent\skywalking-agent.jar
-Dskywalking.agent.service_name=transaction-distribution
-Dskywalking.collector.backend_service=localhost:11800

order的

shell 复制代码
-javaagent:D:\env\envir\skywalking7\agent\skywalking-agent.jar
-Dskywalking.agent.service_name=transaction-order
-Dskywalking.collector.backend_service=localhost:11800
  • D:\env\envir\skywalking7\agent\skywalking-agent.jar`是agent的目录路径
  • service_name:服务名称
  • backend_service:skywalking的服务地址(端口是11800)

完事儿后,启动它们。

调用一个接口,执行它们。

拓扑图

到skywalking的拓扑图页面

可以看到真题的技术架构及调用关系。

追踪

到skywalking的追踪页面

可以看到所有的执行记录,并且将这些详细到:发生在哪个类哪个方法中,如执行sql查询的那条,点击后,我们甚至可以看到sql的执行信息。

还可知接口的执行时间分布,以及采用的技术

如上图:/createOrder接口总执行2.4s,/distribution是使用feign调用的,且执行了1s左右。

忽略端点

有时可能不需要采集某个端点的数据,如心跳之类的请求,不是那么重要。可以设置忽略它们,意味着包含这些路径的追踪信息不会被agent发送到collector中。

  1. 将skywalking中的agent/optional-pluginsapm-trace-ignore-plugin-7.0.0.jar拷贝至我们的agent/plugins

  2. 在IDEA中做启动配置,我们模拟将/createOrder/distribution接口忽略

    shell 复制代码
    -javaagent:D:\env\envir\skywalking7\agent\skywalking-agent.jar
    -Dskywalking.agent.service_name=transaction-distribution
    -Dskywalking.collector.backend_service=localhost:11800
    -Dskywalking.trace.ignore_path=/createOrder
    shell 复制代码
    -javaagent:D:\env\envir\skywalking7\agent\skywalking-agent.jar
    -Dskywalking.agent.service_name=transaction-order
    -Dskywalking.collector.backend_service=localhost:11800
    -Dskywalking.trace.ignore_path=/distribution

ignore_path这个参数可以支持表达式:

/path/*path/**/path/?

?表示匹配任意单字符,*表示匹配0个或任意数量字符,**表示匹配0或更多的目录

配置后,在调用匹配规则的接口路径时,agent就不会再采集这些接口的数据了。

除此外还有另一种方式

同样是需要先将skywalking中的agent/optional-pluginsapm-trace-ignore-plugin-7.0.0.jar拷贝至我们的agent/plugins

然后去配置agent/config/agent.config文件忽略端点,服务每次启动都会去读取这个配置文件。

config 复制代码
trace.ignore_path==${SW_AGENT_TRACE_IGNORE_PATH:/createOrder, /distribution}

告警

告警功能是skywalking的一大特色。Skywalking会定时把采集到的数据和配置的告警规则进行对比,如果满足阈值条件,则会出发警告。

Skywalking允许用户基于webhook(网络钩子)的规范,自定义触发告警之后的逻辑,如发短信、发邮件、电话、公众号通知等。

Skywalking程序路径下的config/alarm-settings.yml文件就是告警的规则。

yml 复制代码
rules:
  service_resp_time_rule: # 服务响应时间规则
    metrics-name: endpoint_percent # 名称
    threshold: 75	# 阈值
    op: <		# 小于
    period: 10	# 间隔时间
    count: 3	# 次数
    silence-period: 10 # 告警发送多少分钟内警告不会重复发送
    message: Successful rate of endpoint {name} is lower than 75%
#webhooks:
#  - http://127.0.0.1/notify/
#  - http://127.0.0.1/go-wechat/

webhooks中就是触发警告后,需要执行的操作。

我们可以自己做个触发钩子后的执行操作接口

  • 来个告警信息类
java 复制代码
public class AlarmMessage {
    
    private Integer scopeId;    // 作用域
    private String name;        // 目标作用域下的实体名称
    private Integer id0;        // 作用域下的实体ID,与名称相匹配
    private Integer id1;
    private String ruleName;    // alarm-setting.yml中的配置规则
    private String alarmMessage;   // 告警信息
    private Long startTime;     // 告警产生时间
    
    // get.set.toString()方法省略
    
}
  • 做个接口
java 复制代码
@RequestMapping("/notify")
public void alarm(@RequestBody List<AlarmMessage> alarmMessages) {
    alarmMessages.forEach(value -> System.out.println(value.toString()));
}
  • 修改config/alarm-settings.yml配置文件,增加钩子的后续执行。
yml 复制代码
webhooks:
  - http://127.0.0.1:9002/notify

重启skywalking及两个微服务项目,多次调用/createOrder接口(模拟的超时报错),这里记得把忽略的端点给放开,否则skywalking是发不了告警的。

可看到告警一栏中的

看到控制台打印的数据:

性能分析

Skywalking的性能分析能帮助用户很容易找到性能问题,并且不需要代码埋点等操作。Skywalking的性能分析是对业务周期性保存快照操作,资源消耗小。

到Skywalking UI的性能剖析窗口,点击新建任务,如创建/createOrder接口的任务。

然后可以调用几次/createOrder接口,刷新页面,选中刚刚创建的任务,右侧出现createOrder的信息,选中,点击分析按钮。

调用/createOrder的流程,使用的技术,服务名,耗时,栈信息等一览无余。

点击查看能看到这个步骤的详细信息,执行的具体操作,抛出的异常。

Tomcat或Jar包使用agent

IDEA中使用agent一般用于本地开发环境,若正式环境,一般使用Tomcat或jar包的方式启动应用。

Linux系统Tomcat使用agent

linux系统中修改tomcat的bin/catalina.sh文件,加入代码

shell 复制代码
CATALINA_OPTS="$CATALINA_OPTS -javaagent:/root/agent/skywalking-agent.jar -Dskywalking.agent.service_name=transaction-distribution -Dskywalking.collector.backend_service=localhost:11800";
export CATALINA_OPTS

Windows系统Tomcat使用agent

windows系统中修改tomcat的bin/catalina.bat文件setlocal下,加入代码

bat 复制代码
set CATALINA_OPTS="-javaagent:D:\env\envir\skywalking7\agent\skywalking-agent.jar -Dskywalking.agent.service_name=transaction-distribution -Dskywalking.collector.backend_service=localhost:11800";

jar包使用agent

启动时的命令

shell 复制代码
java -javaagent:D:\env\envir\skywalking7\agent\skywalking-agent.jar -Dskywalking.agent.service_name=transaction-distribution -Dskywalking.collector.backend_service=localhost:11800 -jar transaction-distribution.jar

配置账号密码登录

Skywalking的功能很强大,能看到项目中的很多隐私信息(项目架构、调用链路、sql语句等),自然不希望其他无关人员能看到。那么通常设置账号密码的方式。

在skywalking6.x版本中能配置,但是在7.x版本中被移除了,作者提出可以使用nginx配置账号和密码:

使用nginx配置账号密码登录主要是依靠ngx_http_auth_basic_module模块。

下面是用nginx的增强版,OpenResty配置账号和密码登录。OpenResty的安装可以自行查阅资料。

安装和配置

  • 安装hptpasswd工具
shell 复制代码
yum install -y httpd-tools
  • 使用htpasswd生成用户名和密码
shell 复制代码
htpasswd -b -c /usr/local/openresty/passwd wlh wlh

-b参数:用户创建passwdfile,如果passwdfile存在,那么它会重写

-c参数:允许命令行中一起输入账号和密码

  • 到OpenResty的安装目录,修改nginx/conf/nginx.conf配置文件,修改server中的内容就行了
conf 复制代码
server{
  listen	80;
  server_name	localhost;
  location / {
  		auth_basic "Please input password";	# 提示信息
  		auth_basic_user_file	/user/local/openrestry/passwd;	# 存放账号密码的文件
  		proxy_pass	http://localhost:8080;	# 代理到8080端口
  }

}

最后linux系统记得放开需要的端口。重启OpenResty然后访问主机http://192.168.1.41(默认80端口),就会弹框提示需要输入账号和密码了。

相关推荐
夏天的味道٥3 小时前
使用 Java 执行 SQL 语句和存储过程
java·开发语言·sql
TiDB_PingCAP5 小时前
海量数据融合互通丨TiDB 在安徽省住房公积金监管服务平台的应用实践
分布式·tidb·htap
冰糖码奇朵5 小时前
大数据表高效导入导出解决方案,mysql数据库LOAD DATA命令和INTO OUTFILE命令详解
java·数据库·sql·mysql
好教员好5 小时前
【Spring】整合【SpringMVC】
java·spring
程序员的世界你不懂6 小时前
Kafka 推送消息,移动端自动化测试,数据驱动测试
分布式·kafka·linq
浪九天6 小时前
Java直通车系列13【Spring MVC】(Spring MVC常用注解)
java·后端·spring
堕落年代6 小时前
Maven匹配机制和仓库库设置
java·maven
功德+n6 小时前
Maven 使用指南:基础 + 进阶 + 高级用法
java·开发语言·maven
香精煎鱼香翅捞饭7 小时前
java通用自研接口限流组件
java·开发语言
ChinaRainbowSea7 小时前
Linux: Centos7 Cannot find a valid baseurl for repo: base/7/x86_64 解决方案
java·linux·运维·服务器·docker·架构