当前的应用架构基本都采用微服务架构,微服务解决了传统单体应用臃肿、难以扩展等问题,但同时也带来了新的问题。众多的微服务交织在一起,使得定位线上问题变的非常棘手,所以就需要一个链路追踪系统,把一次请求所经过的路径全部串起来,一旦请求失败了,能很直观的定位到问题出现在哪一环。目前主流的链路追踪系统有zipkin、SkyWalking、cat、jaeger等,SkyWalking是非常优秀的国产软件,对应用性能的影响是最低的,目前已成为Apache基金会的顶级项目,本文将介绍SkyWalking。

1 安装Docker

2 安装elasticsearch

使用Docker安装skywalking docker skywalking_apache


从配置文件中可以看到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

查看是否安装成功

使用Docker安装skywalking docker skywalking_docker_02

3 安装SkyWalking

由于存储采用的是elasticsearch7,所以要用es7结尾的版本。

使用Docker安装skywalking docker skywalking_skywalking_03


需要分别安装服务端和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文件中的参数。

使用Docker安装skywalking docker skywalking_elasticsearch_04


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一致

使用Docker安装skywalking docker skywalking_docker_05


使用Docker安装skywalking docker skywalking_elasticsearch_06


8080是UI界面访问端口

4 Java项目接入

4.1 自动埋点

创建两个Springboot项目:goods和order。

SkyWalking采用的是Java探针技术来采集监控信息,需要在启动命令上指定agent。

在官网下载包:apache-skywalking-apm-es7-8.1.0,解压后可看到里面有个agent文件夹(注意文件夹结构不能改动),打开config文件夹下的agent.config文件。

使用Docker安装skywalking docker skywalking_elasticsearch_07


将此处的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

使用Docker安装skywalking docker skywalking_docker_08


在拓扑图里可以看到服务之间的依赖关系,图中的虚线是流动的,通过流向可以知道谁依赖谁

使用Docker安装skywalking docker skywalking_云原生_09


如果有接口访问,在追踪里可以看到链路信息

使用Docker安装skywalking docker skywalking_apache_10


在一次请求里,不管是在同一个服务里还是跨服务,追踪ID是同一个

点击任一接口可以看到异常信息

使用Docker安装skywalking docker skywalking_云原生_11

4.2 手动埋点

需要引入第三方包

<dependency>
      <groupId>org.apache.skywalking</groupId>
      <artifactId>apm-toolkit-trace</artifactId>
      <version>8.1.0</version>
    </dependency>

使用Docker安装skywalking docker skywalking_docker_12


使用Docker安装skywalking docker skywalking_云原生_13

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)

使用Docker安装skywalking docker skywalking_docker_14


tid就是追踪ID

查看接口日志

使用Docker安装skywalking docker skywalking_云原生_15


使用Docker安装skywalking docker skywalking_apache_16