APM学习之—skywalking

目前入职差不多一个月了,一个月来一直都在学习微服务方面的知识,前段时间我们项目组的技术栈都已经确定了下来,所以这段时间自己也一直在学习相关方面的知识。今天想学习下我们项目采用的APM工具——skywalking,关于它的相关信息可以去看下官网,我们还是从使用方面着手。

一、skywalking组成

为什么是skywalking?skywalking是可观察性分析平台和应用程序性能管理系统。提供分布式跟踪,服务网格遥测分析,度量聚合和可视化等多合一解决方案——来自官网的介绍。
首先到skywalking官网下载稳定版本,然后解压。我们先通过项目结构了解一下,skywalking的组成。

skywalking目录结构.png

skywalking我个人理解可以分为3个部分:1、UI部分(webappService),即webapp文件夹,主要负责数据展示;2、数据收集部分(oapService),这部分涉及到的是configoap-lib,一个是配置相关,一个是oap需要依赖的jar包;3、代理模块,即agent文件夹。当然把1和2合起来看成一个模块也没问题。
bin目录下是skywalking启动的脚本,其实根据脚本也可以发现,其实skywalking启动脚本,也不过是分别启动oapService和webappService。

二、启动skywalking

在启动项目之前我们需要修改下数据收集的配置,因为skywalking默认使用的是H2,根据自己的需要改成elasticsearch或者MysqlTiDB。但是使用elasticsearch时不建议使用较高版本的比如7.5。根据官方的文档给出说明是,elasticsearch版本只要高于6.3.2或以上,最好是7.0.0或以上(skywalking版本为6.5的前提下)。因为我自己在尝试使用elasticsearch7.5的过程中出现了不少的问题,但是官方并没有给出相关的解释,折腾了半天只能更换版本。因为自己对elasticsearch也不是特别的了解,出现的问题自己也解决不了,所以最终还是老老实实使用6.4.0版本。PS:elasticsearch版本更新是在太快了......
进入到config目录下修改application.yml,因为使用的是单机版本,因此之修改存储部分的配置即可,如果想了解更多配置,建议看下官方文档
。我自己只是将H2改成了elasticsearch,如下:

storage:
  elasticsearch:
#    nameSpace: ${SW_NAMESPACE:""}
    clusterNodes: ${SW_STORAGE_ES_CLUSTER_NODES:127.0.0.1:9200}
    protocol: ${SW_STORAGE_ES_HTTP_PROTOCOL:"http"}
#    trustStorePath: ${SW_SW_STORAGE_ES_SSL_JKS_PATH:"../es_keystore.jks"}
#    trustStorePass: ${SW_SW_STORAGE_ES_SSL_JKS_PASS:""}
#    user: ${SW_ES_USER:""}
#    password: ${SW_ES_PASSWORD:""}
    indexShardsNumber: ${SW_STORAGE_ES_INDEX_SHARDS_NUMBER:2}
    indexReplicasNumber: ${SW_STORAGE_ES_INDEX_REPLICAS_NUMBER:0}
#    # Those data TTL settings will override the same settings in core module.
    recordDataTTL: ${SW_STORAGE_ES_RECORD_DATA_TTL:7} # Unit is day
#    otherMetricsDataTTL: ${SW_STORAGE_ES_OTHER_METRIC_DATA_TTL:45} # Unit is day
#    monthMetricsDataTTL: ${SW_STORAGE_ES_MONTH_METRIC_DATA_TTL:18} # Unit is month
#    # Batch process setting, refer to https://www.elastic.co/guide/en/elasticsearch/client/java-api/5.5/java-docs-bulk-processor.html
    bulkActions: ${SW_STORAGE_ES_BULK_ACTIONS:1000} # Execute the bulk every 1000 requests
    flushInterval: ${SW_STORAGE_ES_FLUSH_INTERVAL:10} # flush the bulk every 10 seconds whatever the number of requests
    concurrentRequests: ${SW_STORAGE_ES_CONCURRENT_REQUESTS:2} # the number of concurrent requests
#    resultWindowMaxSize: ${SW_STORAGE_ES_QUERY_MAX_WINDOW_SIZE:10000}
#    metadataQueryMaxSize: ${SW_STORAGE_ES_QUERY_MAX_SIZE:5000}
#    segmentQueryMaxSize: ${SW_STORAGE_ES_QUERY_SEGMENT_SIZE:200}

另外如果使用Mysql是8.0的版本,则需要将相关的驱动添加到oap-libs文件夹下。
我们修改下webappService端口号,进入到webapp目录下,修改webapp.yml中的端口号即可,我的修改成18080。
接下来启动skywalking,当然在这之前需要先启动elasticsearch
进入到bin目录下,执行启动命令:

 ./startup.sh 

或者分别执行下面两个命令:

./oapService.sh
./webappService.sh

启动之后在浏览器输入localhost:18080即可访问到skywalking的UI界面了。当然因为我们还没有使用代理模块启动相关服务,aopService没有收集到监控服务的数据,所以UI没有数据展示。接下来我们使用代理模式

三、agent模块使用

agent模块的功能也是非常强大的,支持的中间件、框架和库也非常的多,大家可以看下官方目前支持的列表。
我自己则是准备在上次Spring Cloud之网关-Gateway(二)
项目的基础上使用agent。当然代码或者配置文件会有一点点小的改动,这里就不再细述了。
首先我先为我的网关服务gateway-service配置好agent,首先复制skywalking下的agent的文件夹到一个指定目录,我自己则是新建了一个serviceAgents目录。将agent文件夹复制到serviceAgents下并重命名为agent-gateway(这里文件夹名称只是为了做区分),接着修改config目录下agent.config
主要是修改代理服务的名称,如下:

agent.service_name=${SW_AGENT_NAME:gateway-service}

然后启动gateway-service,启动命令中需要添加JVM启动参数,指定skywalking-agent.jar的绝对路径,如果是通过命令行启动,则命令如下:

# java -javaagent:/path/to/skywalking-agent/skywalking-agent.jar  -jar yourApp.jar
## 自己的实际启动命令
java -javaagent:/home/ypcfly/ypcfly/software/skyWalking/apache-skywalking-apm-6.5.0/serviceAgents/agent-gateway/skywalking-agent.jar  -jar gateway-0.0.1-SNAPSHOT.jar

如果是通过idea开发工具启动则在启动配置上的VM options添加JVM启动参数即可,如下图所示:

idea启动配置.png

user-service服务同理,复制一份agent,并修改agent.config,然后启动服务。这里要说一点,因为微服务使用了Nacos作为注册中心和配置中心,因此在启动各个服务前先启动Nacos
接下来我们在skywalking的服务仪表盘查看下相关服务,如下图:
服务仪表盘.png

然后我们调用一个数据查询的接口,使用接口调用工具调用localhost:8090/user/list,这个请求会到达网关gateway-service,之后路由到user-service,然后查询数据库。我们在看下网络拓扑图,如下:
网络拓扑图-1.png

刚开始我有点吃惊,为什么只有user-service和postgresql,gateway-service呢??按理来讲请求是先到达的gateway-service,为什么整个网络拓扑中没有它呢???然后仔细看下skywalking支持的版本列表发现skywalking只支持Spring Cloud Gateway 2.1.x.RELEASE,并是Optional,这意味着需将optional-plugins目录下的内容复制到plugins目录下,另外我使用的Gateway版本是2.2.1.RELEASE。问题找到了,我先将agent-gateway目录下optional-plugins下jar复制到plugins下。然后重新启动gateway-service,重新测试一下,虽然仪表盘有了gateway-service,但是拓扑图里面依然没有.....看来还是要修改下版本号,那就修改下gateway-service的版本为2.1.1.RELEASE,然后重新打包,但是可惜启动失败....由于时间原因我就不再去追查这个问题了。包括我看了最近的skywalking6.6.0版本,依然是只支持Spring Cloud Gateway 2.1.x.RELEASE,所以在选择版本的时候一定注意一下。
既然修改gateway-service版本有问题,那么我决定重新在创建一个服务,并使用Fegin来进行服务间的调用,创建order-service服务,同理也创建一个与其对应的agent,修改其配置文件。在user-service中引入Feign依赖,通过user-service调用order-service,我们调用localhost:8090/user/order/userId,这个接口是先调用通过user-service,其通过Feign调用order-service。修改之后我们重新启动相关的服务,并调用上面的接口,之后我们来看下拓扑图:
网络拓扑图-2.png

根据这个图可以看到两个服务之间已经建立起了连接,如果Gateway版本较低应该也是出现的,而且左边也给出了服务的类型SpringMvcPostgresql
接着我们看下追踪面板信息,如下图:
追踪图.png

通过上面这个图可以明显看到调用服务接口的整个走向,以及每个跨度的相关信息,比如执行时间、请求路径、包括sql语句等等。

四、总结

相比之前使用过的Zipkin,skywalking的功能更全面一些,另外还可以监控JVM的一些信息,堆、栈、垃圾回收等等,还有数据库的一些信息,比如某个应用接口执行的sql,响应时间等等。就skywalking的使用来讲好像没什么特别难的地方,跟着文档基本没问题,当然我觉得还是要多动手,这样才能发现问题。感兴趣的可以尝试下将其他的中间件引入到skywalking中,比如RedisRocketMQ等等。

你可能感兴趣的:(APM学习之—skywalking)