当前的应用架构基本都采用微服务架构,微服务解决了传统单体应用臃肿、难以扩展等问题,但同时也带来了新的问题。众多的微服务交织在一起,使得定位线上问题变的非常棘手,所以就需要一个链路追踪系统,把一次请求所经过的路径全部串起来,一旦请求失败了,能很直观的定位到问题出现在哪一环。目前主流的链路追踪系统有zipkin、SkyWalking、cat、jaeger等,SkyWalking是非常优秀的国产软件,对应用性能的影响是最低的,目前已成为Apache基金会的顶级项目,本文将介绍SkyWalking。
1 安装Docker
2 安装elasticsearch
从配置文件中可以看到SkyWalking支持的存储组件,本文采用elasticsearch。
拉取镜像:
docker pull docker.elastic.co/elasticsearch/elasticsearch:7.3.0
启动:
docker run -d --name es -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" docker.elastic.co/elasticsearch/elasticsearch:7.3.0
查看是否安装成功
3 安装SkyWalking
由于存储采用的是elasticsearch7,所以要用es7结尾的版本。
需要分别安装服务端和UI界面
拉取镜像:
docker pull apache/skywalking-oap-server:8.1.0-es7
docker pull apache/skywalking-ui:8.1.0-es7
启动服务端:
docker run --name oap --restart always -d \
-e TZ=Asia/Shanghai \
-p 12800:12800 \
-p 11800:11800 \
-e SW_STORAGE=elasticsearch7 \
-e SW_NAMESPACE=docker-cluster \
-e SW_STORAGE_ES_CLUSTER_NODES=0.0.0.0:9200 \
apache/skywalking-oap-server:8.1.0-es7
其中
SW_STORAGE:表示选择elasticsearch7作为存储组件
SW_NAMESPACE:命名空间,必须与elasticsearch的集群名称一致
SW_STORAGE_ES_CLUSTER_NODES:elasticsearch的节点,多个用逗号隔开
以上参数均为application.yml文件中的参数。
12800是rest相关API的访问端口,11800是服务端相关API的访问端口
启动UI界面:
docker run -d --name skywalking-ui \
-e TZ=Asia/Shanghai \
-p 8080:8080 \
--link oap:oap \
-e SW_OAP_ADDRESS=oap:12800 \
apache/skywalking-ui:8.1.0
SW_OAP_ADDRESS是设置服务端opa的IP地址,作用与webapp.yml文件中的参数listOfServers一致
8080是UI界面访问端口
4 Java项目接入
4.1 自动埋点
创建两个Springboot项目:goods和order。
SkyWalking采用的是Java探针技术来采集监控信息,需要在启动命令上指定agent。
在官网下载包:apache-skywalking-apm-es7-8.1.0,解压后可看到里面有个agent文件夹(注意文件夹结构不能改动),打开config文件夹下的agent.config文件。
将此处的IP地址改为服务端oap的地址,agent会将监控信息推送至服务端。
启动命令
java
-javaagent:path\apache-skywalking-apm-bin-es7\agent\skywalking-agent.jar
-Dskywalking.agent.service_name=goods
-jar goods.jar
java
-javaagent:path\apache-skywalking-apm-bin-es7\agent\skywalking-agent.jar
-Dskywalking.agent.service_name=order
-jar order.jar
注
如果想使用optional-plugins文件夹下的插件,需要复制到plugins文件夹下,根据官方文档,此部分的插件对性能有一定的影响。
访问UI界面
UI界面部署的IP地址:8080
在拓扑图里可以看到服务之间的依赖关系,图中的虚线是流动的,通过流向可以知道谁依赖谁
如果有接口访问,在追踪里可以看到链路信息
在一次请求里,不管是在同一个服务里还是跨服务,追踪ID是同一个
点击任一接口可以看到异常信息
4.2 手动埋点
需要引入第三方包
<dependency>
<groupId>org.apache.skywalking</groupId>
<artifactId>apm-toolkit-trace</artifactId>
<version>8.1.0</version>
</dependency>
4.3 追踪ID与日志组件集成
需要引入第三方包
<dependency>
<groupId>org.apache.skywalking</groupId>
<artifactId>apm-toolkit-logback-1.x</artifactId>
<version>8.1.0</version>
</dependency>
在日志的xml文件中加上如下配置(如logback.xml)
tid就是追踪ID
查看接口日志