SkyWalking链路追踪 Docker环境搭建与使用

背景

随着互联网架构的扩张,分布式系统变得日趋复杂,越来越多的组件开始走向分布式化,如微服务、消息收发、分布式数据库、分布式缓存、分布式对象存储、跨域调用,这些组件共同构成了繁杂的分布式网络。
我们思考下这些问题:

1:一个请求经过了这些服务后其中出现了一个调用失败的问题,如何定位问题发生的地方?
2:如何计算每个节点访问流量?
3:流量波动的时候,增加哪些节点集群服务?

这些问题要想得到解决,一定是有数据支撑,绝不是靠开发人员或者运维人员的直觉。为了解决分布式应用、微服务系统面临的这些挑战,APM系统(Application Performance Management,即应用性能管理)应运而生。

分布式追踪系统的原理

分布式追踪系统大体分为三个部分,数据采集、数据持久化、数据展示
数据采集是指在代码中埋点,设置请求中要上报的阶段,以及设置当前记录的阶段隶属于哪个上级阶段。
数据持久化则是指将上报的数据落盘存储,
数据展示则是前端查询与之关联的请求阶段,并在界面上呈现。
Trace
一个 Trace 代表一个事务、请求或是流程在分布式系统中的执行过程。
OpenTracing 中的一条 Trace调用链,由多个 Span 组成,一个 Span 代表系统中具有开始时间和执行时长的逻辑单元,Span 一般会有一个名称,一条 Trace中 Span 是首尾连接的。
Span
Span 代表系统中具有开始时间和执行时长的逻辑单元,Span 之间通过嵌套或者顺序排列建立逻辑因果关系。

Skywalking介绍

2015年由个人吴晟(华为开发者)主导开源,作者是华为开发云监控产品经理,主导监控产品的规划、技术路线及相关研发工作,也是OpenTracing分布式追踪标准组织成员 ,该项目 2017年加入Apache孵化器,是一个分布式系统的应用程序性能监控工具(APM),专为微服务、云原生架构和基于容器(Docker、K8s、Mesos)架构而设计。

Skywalking是一个可观测性分析平台和应用性能管理系统,它也是基于OpenTracing规范、开源的AMP系统。Skywalking提供分布式跟踪、服务网格遥测分析、度量聚合和可视化一体化解决方案。

官方站点:http://skywalking.apache.org/
GitHub项目地址:https://github.com/apache/skywalking

我们在学习Skywalking之前,可以先访问官方提供的控制台演示
演示地址: http://demo.skywalking.apache.org/
账号:skywalking 密码:skywalking
在这里插入图片描述

SkyWalking 核心功能

指标分析:服务,实例,端点指标分析
问题分析:在运行时分析代码,找到问题的根本原因
服务拓扑:提供服务的拓扑图分析
依赖分析:服务实例和端点依赖性分析
服务检测:检测慢速的服务和端点
性能优化:根据服务监控的结果提供性能优化的思路
链路追踪:分布式跟踪和上下文传播
数据库监控:数据库访问指标监控统计,检测慢速数据库访问语句(包括SQL语句)
服务告警:服务告警功能
日志监控:日志功能

名词解释:
服务(service):业务资源应用系统
端点(endpoint):应用系统对外暴露的功能接口
实例(instance):物理机

Skywalking架构图:

在这里插入图片描述
skyWalking整体可分为:客户端,服务端
客户端:agent组件
基于探针技术采集服务相关信息(包括跟踪数据和统计数据),然后将采集到的数据上报给skywalking的数据收集器
服务端:又分为OAP,Storage,WebUI
OAP:observability analysis platform可观测性分析平台,负责接收客户端上报的数据,对数据进行分析,聚合,计算后将数据进行存储,并且还会提供一些查询API进行数据的查询,这个模块其实就是我们所说的链路追踪系统的Collector收集器
Storage:skyWalking的存储介质,默认是采用H2,同时支持许多其他的存储介质,比如:ElastaticSearch,mysql等
WebUI:提供一些图形化界面展示对应的跟踪数据,指标数据等等

SkyWalking环境搭建

官方下载:http://skywalking.apache.org/downloads/
在这里插入图片描述
Skywalking数据存储方式有2种,分别为H2(内存)和elasticsearch,如果数据量比较大,建议使用后者,工作中也建议使用后者。
Skywalking自身提供了UI管理控制台,我们安装的组件:

1:elasticsearch,建议使用elasticsearch7.x
2:elasticsearch-hq,elasticsearch的管理工具,更方便管理elasticsearch
3:Skywalking
4:Skywalking-UI

elasticsearch安装

1)系统资源配置修改
elasticsearch占用系统资源比较大,我们需要修改下系统资源配置,这样才能
很好的运行elasticsearch,修改虚拟机配置, vi/etc/security/limits.conf ,追加内容:
soft nofile 65536
hard nofile 6553

修改 vi /etc/sysctl.conf ,追加内容 :
vm.max_map_count=655360
让配置立即生效:
/sbin/sysctl -p

2)安装elasticsearch
建议安装:elasticsearch7.x,我们这里选择7.6.2,并且采用容器的安装方式,安装如下:

docker run --name elasticsearch -p 9200:9200 -p 9300:9300 --
restart=always -e "discovery.type=single-node" -e
ES_JAVA_OPTS="-Xms84m -Xmx512m" -d elasticsearch:7.6.2

3)elasticsearch跨域配置
elasticsearch默认是没有开启跨域,我们需要配置跨域,并配置集群节点名字:

#进入容器
docker exec -it elasticsearch /bin/bash

修改容器中 /usr/share/elasticsearch/config/elasticsearch.yml 文件,添加配置如下:

cluster.name: "elasticsearch"
http.cors.enabled: true
http.cors.allow-origin: "*"
network.host: 0.0.0.0
discovery.zen.minimum_master_nodes: 1

参数说明:

cluster.name:集群服务名字
http.cors.enabled:开启跨域
http.cors.allow-origin: 允许跨域域名,*代表所有域名
network.host: 外部访问的IP
discovery.zen.minimum_master_nodes: 最小主节点个数

安装完成后,重启容器 docker restart elasticsearch ,再访问http://192.168.200.129:9200/ 效果如下:
在这里插入图片描述
安装 ElasticSearch管理界面elasticsearch-hq

docker run -d --name elastic-hq -p 5000:5000 --restart always
elastichq/elasticsearch-hq

在这里插入图片描述

Skywalking安装

Skywalking的安装我们也采用Docker安装方式,同时我们需要为Skywalking指定存储服务:

#安装Skywalking
docker run --name skywalking -d -p 1234:1234 -p 11800:11800 -
p 12800:12800 --restart always --link
elasticsearch:elasticsearch -e SW_STORAGE=elasticsearch7 -e
SW_STORAGE_ES_CLUSTER_NODES=elasticsearch:9200
apache/skywalking-oap-server

参数说明:

--link elasticsearch:elasticsearch:存储服务使用elasticsearch
-e SW_STORAGE=elasticsearch7:存储服务elasticsearch的版本
-e SW_STORAGE_ES_CLUSTER_NODES=elasticsearch:9200:存储服务
elasticsearch的链接地址

接下来安装Skywalking-UI,需要指定Skywalking服务名字:

docker run --name skywalking-ui -d -p 8080:8080 --link
skywalking:skywalking -e SW_OAP_ADDRESS=skywalking:12800 --
restart always apache/skywalking-ui

在这里插入图片描述

docker-compose部署

创建docker-compose.yml并配置如下

version: '3.3'
services:
  elasticsearch:
    image: elasticsearch:7.6.2
    container_name: elasticsearch
    restart: always
    privileged: true
    hostname: elasticsearch
    ports:
      - 9200:9200
      - 9300:9300
    environment:
      - discovery.type=single-node
      - bootstrap.memory_lock=true
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
      - TZ=Asia/Shanghai
    networks:
      - skywalking
    ulimits:
      memlock:
        soft: -1
        hard: -1
  elasticsearch-hq:
    image: elastichq/elasticsearch-hq
    container_name: elasticsearch-hq
    restart: always
    privileged: true
    hostname: elasticsearch-hq
    ports:
      - 5000:5000
    environment:
      - TZ=Asia/Shanghai
    networks:
      - skywalking
  oap:
    image: apache/skywalking-oap-server:8.7.0-es7
    container_name: oap
    hostname: oap
    privileged: true
    depends_on:
      - elasticsearch
    links:
      - elasticsearch
    restart: always
    ports:
      - 11800:11800
      - 12800:12800
    environment:
      SW_STORAGE: elasticsearch7
      SW_STORAGE_ES_CLUSTER_NODES: elasticsearch:9200
      TZ: Asia/Shanghai
    volumes:
      - ./config/alarm-settings.yml:/skywalking/config/alarm-settings.yml
    networks:
      - skywalking
  ui:
    image: apache/skywalking-ui:8.7.0
    container_name: ui
    privileged: true
    depends_on:
      - oap
    links:
      - oap
    restart: always
    ports:
      - 8080:8080
    environment:
      SW_OAP_ADDRESS: oap:12800
      TZ: Asia/Shanghai
    networks:
      - skywalking

networks:
  skywalking:
    driver: bridge

通过命令一键启动:

docker-compose up -d

启动成功后访问skywalking的webui页面:http://192.168.200.129:8080/

Skywalking应用

skywalking-collector:链路数据归集器,数据可以落地ElasticSearch/H2
skywalking-ui:web可视化平台,用来展示落地的数据
skywalking-agent:探针,用来收集和发送数据到归集器

agent下载

Skywalking-agent,它简称探针,用来收集和发送数据到归集器,我们先来学习下探针使用,探针对应的jar包在Skywalking源码中,我们需要先下载源码。
Skywalking源码下载地址: https://archive.apache.org/dist/skywalking/
在这里插入图片描述
agent目录结构如下:
在这里插入图片描述

agent应用

项目使用agent,如果是开发环境,可以使用IDEA集成,如果是生产环境,需要将项目打包上传到服务器。为了使用agent,我们同时需要将下载的 apacheskywalking-apm-bin 文件包上传到服务器上去。不过无论是开发环境还是生产环境使用agent,对项目都是无侵入式的。
应用名配置
我们需要用到 agent ,此时需要将 agent/config/agent.config 配置文件拷贝到每个需要集成Skywalking工程的resource目录下,
并修改其中的agent.service_name

IDEA集成使用agent

在运行的程序配置 jvm参数:
-javaagent:C:\developer\skywalking\apache-skywalking-apm\bin\agent\skywalking-agent.jar
-Dskywalking.agent.service_name=test

生产环境使用agent

生产环境使用,因此我们需要将agent和每个项目的jar包上传到服务器上,上传 apache-skywalking-apm-bin 至/usr/local/server/skywalking ,再将 工程 中的项目打包,并分别上传到服务器上,如下三个工程:

hailtaxi-order-1.0-SNAPSHOT.jar
hailtaxi-gateway-1.0-SNAPSHOT.jar
hailtaxi-driver-1.0-SNAPSHOT.jar

1)启动hailtaxi-gateway

java -javaagent:/usr/local/server/skywalking/apacheskywalking-apm-bin/agent/skywalking-agent.jar 
-Dskywalking.agent.service_name=hailtaxi-gateway -jar
hailtaxi-gateway-1.0-SNAPSHOT.jar &

2)启动hailtaxi-driver

java -javaagent:/usr/local/server/skywalking/apacheskywalking-apm-bin/agent/skywalking-agent.jar
 -Dskywalking.agent.service_name=hailtaxi-driver -jar hailtaxidriver-1.0-SNAPSHOT.jar &

其他的类似

【练习题】01.成员变量 猜数字游戏 一个A有一个成员变量v 有一个初值100。定义一个 对A成员变量v 进行猜。如果大了则提示大了 小了则提示小了。等于则提示猜测成功。 【练习题】02.成员变量 请定义一个交通工具(Vehicle)的 其中有: 属性 速度(speed) 体积(size)等等 方法 移动(move()) 设置速度(setSpeed(int speed)) 加速speedUp(),减速speedDown()等等. 最后在测试Vehicle中的main()中实例化一个交通工具对象 并通过方法给它初始化sp eed,size的值 并且通过打印出来。另外 调用加速 减速的方法对速度进行改变。 【练习题】03.成员变量方法、构造方法 在程序中 经常要对时间进行操作 但是并没有时间型的数据。那么 我们可以自己实现 一个时间 来满足程序中的需要。 定义名为MyTime的 其中应有三个整型成员 时 hour 分 minute 秒 second 为了保 证数据的安全性 这三个成员变量应声明为私有。 为MyTime定义构造方法 以方便创建对象时初始化成员变量。 再定义diaplay方法 用于将时间信息打印出来。 为MyTime添加以下方法 addSecond(int sec) addMinute(int min) addHour(int hou) subSecond(int sec) subMinute(int min) subHour(int hou) 分别对时、分、秒进行加减运算。 【练习题】04.构造方法 编写Java程序 模拟简单的计算器。 定义名为Number的 其中有两个整型数据成员n1n2 应声明为私有。编写构造方法 赋 予n1n2初始值 再为该类定义加 addition 、减 subtration 、乘 multiplication 、 除 division 等公有成员方法 分别对两个成员变量执行加、减、乘、除的运算。 在main方法中创建Number对象 调用各个方法 并显示计算结果。 【练习题】05.构造方法 编写Java程序 用于显示人的姓名年龄。 定义一个 Person 该类中应该有两个私有属性 姓名 name 年龄 age 。定义构造 方法 用来初始化数据成员。再定义显示 display 方法 将姓名年龄打印出来。 在main方法中创建人的实例 然后将信息显示。 【练习题】06.get方法set方法 定义一个 该类一个私有成员变量 通过构造方法将其进行赋初值 并提供该成员的g etXXX()setXXX()方法 提示 假设有private String name。则有 public void setName(String name){ this.name = name。 } public String getName(){ return this.name。 } 【练习题】07.构造方法重载 为"无名"一个 class WuMingFen 要求 1.有三个属性 面码:String theMa 的分量(两) int quantity 是否带汤 boolean likeSoup 2.一个构造方法 以便于简化初始化过程 如 WuMingFen f1 = new WuMingFen("牛肉",3,true)。 3.重载构造方法 使得初始化过程可以多样化 WuMingFen f2 = new WuMingFen("牛肉",2)。 4.如何使得下列语句构造出来的对象是酸辣面码、2两、带汤的 WuMingFen f3 = new WuMingFen()。 5.一个普通方法 check() 用于查看是否符合要求。即 将对象的三个属性打印在控 制台上。 【练习题】08.构造方法的重载 定义一个名为Vehicles 交通工具 的基 该类中应包含String型的成员属性brand 商 标 color 颜色 还应包含成员方法run 行驶 在控制台显示"我已经开动了" showI nfo 显示信息 在控制台显示商标颜色 并编写构造方法初始化其成员属性。 编写Car 小汽车 继承于Vehicles 增加int型成员属性seats 座位 还应增加成员方 法showCar 在控制台显示小汽车的信息 并编写构造方法编写Truck 卡车 继承于Vehicles 增加float型成员属性load 载重 还应增加成员 方法showTruck 在控制台显示卡车的信息 并编写构造方法。 在main方法中测试以上各。 【练习题】09.构造方法重载 定义一个网络用户 要处理的信息有用户ID、用户密码、email地址。在建立的实例 时 把
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

橘右今

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值