• 猿创征文 | [云原生]为微服务保驾护航之链路跟踪skywalking保姆级搭建教程


    skywalking链路跟踪

    前言

    微服务中,有时候服务调用多了,排查问题会变得异常繁琐,需要不断找到调用链每个服务的日志查看问题,消耗大量人力物力,最终才找到问题。
    这时候如果出现线上重大问题,又需要快速定位问题,有什么组件是实时监控整个调用链辅助我们快速定位问题的呢?
    当然有,那就是链路跟踪,其中比较出名的就是skywalking,无代码侵入性,只需要运行脚本加入对应命令即可。
    本文介绍skywalking的搭建全过程,同时提供了普通服务和k8s服务加入skywalking探针的方法。

    skywalking简单安装部署

    前提:需要安装java环境

    1、下载

    安装
    版本目录地址:https://archive.apache.org/dist/skywalking/

    这里下载当前最新for es7的8.5.0版本。不用es7存储的可以下载其他版本。

    下载命令:

    wget https://dlcdn.apache.org/skywalking/8.7.0/apache-skywalking-apm-es7-8.7.0.tar.gz
    
    • 1

    解压

    mkdir /data -p
    #解压到/data目录
    tar -zxf apache-skywalking-apm-es7-8.5.0.tar.gz -C /data/
    
    #重命名
    mv /data/apache-skywalking-apm-bin-es7 /data/skywalking
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    配置

    环境配置

    修改/etc/hosts,加入如下内容

    #es在本地安装
    127.0.0.1 es
    
    • 1
    • 2

    搭建docker版的es

    docker安装略,直接用docker安装es吧,省事点。

    docker pull elasticsearch:7.6.2
    
    #创建docker容器挂在的目录:
    sudo mkdir -p /data/elasticsearch/config
    sudo mkdir -p /data/elasticsearch/data
    sudo mkdir -p /data/elasticsearch/plugins
    #配置文件
    echo "http.host: 0.0.0.0" >> /data/elasticsearch/config/elasticsearch.yml
    
    #创建容器
    sudo docker run --name elasticsearch -p 9200:9200  -p 9300:9300 \
    -e "discovery.type=single-node" \
    -e ES_JAVA_OPTS="-Xms84m -Xmx512m" \
    -v /data/elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml \
    -v /data/elasticsearch/data:/usr/share/elasticsearch/data \
    -v /data/elasticsearch/plugins:/usr/share/elasticsearch/plugins \
    -d elasticsearch:7.6.2
    
    
    #查看启动详情
    
    docker ps # 查看是否启动
    docker logs elasticsearch  #启动日志查询
    docker restart elasticsearch   #重启
    docker exec -it elasticsearch bash #进入
    
    
    #  可能会出现的安装异常
    ## 异常一:文件夹未设置所有用户读写执行权限,处理:sudo chmod -R 777 /opt/elasticsearch/
    ## 异常一:文件夹未设置所有用户读写执行权限,处理:sudo chmod -R 777 /opt/elasticsearch/
    ## 异常三:因虚拟内存太少导致,处理:sudo sysctl -w vm.max_map_count=262144
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31

    服务配置

    进入安装目录

    cd /data/skywalking
    
    • 1

    修改配置文件./config/application.yml,修改数据库为elasticsearch7,其他使用默认配置即可。

    vim config/application.yml
    #集群配置
    cluster:
      #选择配置,这里使用单机版
      selector: ${SW_CLUSTER:standalone}
      #单机版配置
      standalone:
        ...
      #基于zk集群配置
      zookeeper:
        ...
    ...
    #数据库
    storage:
      #这里使用elasticsearch7
      selector: ${SW_STORAGE:elasticsearch7}
      ...
      elasticsearch7:
        nameSpace: ${SW_NAMESPACE:""}
        clusterNodes: ${SW_STORAGE_ES_CLUSTER_NODES:node3:9200}
        ...
    ...
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    UI端口修改

    修改./webapp/webapp.yml文件

    vim webapp/webapp.yml
    server:
      #访问端口号
      port: 8080
    
    collector:
      path: /graphql
      ribbon:
        ReadTimeout: 10000
        # Point to all backend's restHost:restPort, split by ,
        # 内置zuul负载均衡
        listOfServers: 127.0.0.1:12800
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    启停

    启动

    执行启动命令./bin/startup.sh,默认会占用的8080,11800,12800端口

    $ ./bin/startup.sh
    SkyWalking OAP started successfully!
    SkyWalking Web Application started successfully!
    
    • 1
    • 2
    • 3

    停止

    杀掉8080、11800端口对应的pid

    kill -9 [pid]
    
    • 1

    访问

    访问地址

    http://localhost:8080/
    
    • 1

    skywalking做成service服务

    做成服务,保证skywalking挂了能自动重启,开机自启,而且方便启停。(当前也能直接用做成镜像,用docker,但对于这种cpu或内存占用大的,还是推荐做成服务比较好点)

    位置:

    /usr/lib/systemd/system/skywalking.service
    
    • 1

    内容

    [Unit]
    Description=skywalking service
    After=network.target remote-fs.target nss-lookup.target
    
    [Service]
    Type=forking
    Environment=JAVA_HOME=/data/java/jdk
    ExecStart=/data/skywalking/bin/startup.sh
    KillSignal=SIGQUIT
    TimeoutStopSec=5
    KillMode=process
    PrivateTmp=true
    StandardOutput=syslog
    StandardError=inherit
    
    [Install]
    WantedBy=multi-user.target
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    命令

    #重载配置
    systemctl daemon-reload
    
    #开机自启
    systemctl enable skywalking
    
    #重启skywalking
    systemctl restart skywalking
    
    
    systemctl status skywalking
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    加入探针

    agent文件放到对应位置

    给 springboot 服务加入探针

    我的 start.sh 文件如下
    ,需要注意的是: -jar 后面是要加探针的 jar 包,一定要放在命令行的最后。

    java -Dfile.encoding=UTF-8  -Xms256m -Xmx256m \
     -javaagent:/opt/skywalking/agent/skywalking-agent.jar \
     -Dskywalking.agent.service_name=ybf-static \
     -Dskywalking.collector.backend_service=vipmajia.com:11800 \
     -jar  /root/dev/ybf-static-0.0.2-SNAPSHOT.jar \
     &
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    启动 springboot:

    ./start.sh
    
    • 1

    给k8s的微服务加入探针

    如果是k8s,其yaml要添加如下内容:

    #外部 skywalking引入k8s作为endpoints
    apiVersion: v1
    kind: Endpoints
    metadata:
      labels:
        name: skywalking
      name: skywalking
      namespace: xcc-prod
    subsets:
      - addresses:
          - ip: 10.10.40.161
        ports:
          - name: skywalking
            port: 11800
    
    ---
    #skywalking作为service
    apiVersion: v1
    kind: Service
    metadata:
      labels:
        name: skywalking
      name: skywalking
      namespace: xcc-prod
    spec:
      ports:
        - name: skywalking
          port: 11800
          targetPort: 11800
      type: NodePort
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30

    对应服务上加入skywalking的探针

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: my-project-name
      namespace: xcc-test
    spec:
      replicas: 1
      selector:
        matchLabels:
          name: my-project-name
      template:
        metadata:
          labels:
            name: my-project-name
        spec:
          containers:
            - name: my-project-name
              ...
              env:
                - ...
                # 镜像中没有JAVA_OPTS这个ENV实际上这个地方不会生效,所以在docker中 -javaagent:/sidecar/agent/skywalking-agent.jar 是需要的。
                #这里通过JAVA_TOOL_OPTIONS,而不是JAVA_OPTS可以实现不通过将agent命令加入到java应用jvm参数而实现agent的集成
                - name: JAVA_TOOL_OPTIONS
                  value: -javaagent:/data/skywalking/agent/skywalking-agent.jar
                - name: SW_AGENT_NAME
                  value: my-project-name
                - name: SW_AGENT_COLLECTOR_BACKEND_SERVICES
                  value: skywalking:11800
              volumeMounts:
                - name: bd-skywalking
                  mountPath: /data/skywalking/agent
          volumes:
            - name: bd-skywalking
              nfs:
                path: /data/k8snfs/sys/skywalking/agent
                server: 10.10.40.121
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • volumes前提,在挂载的nfs里提前把skywalking的agent目录放好到目录 :/data/k8snfs/sys/skywalking/agent
    • volumeMounts:跟volumes呼应,name要保持一致,mountPath为当前目录,跟env的JAVA_TOOL_OPTIONS路径一致,都为/data/skywalking/agent
    • env:必要的环境变量,JAVA_TOOL_OPTIONS 是jar跑的时候的代理jar
    • env:必要的环境变量,SW_AGENT_COLLECTOR_BACKEND_SERVICES 是agent后台地址,要能在当前容器里ping通
    • env:必要的环境变量,SW_AGENT_NAME 为最终在 http://127.0.0.1:8080 里会展示出来的名字,最好跟项目名称呼应,如例子里的my-project-name

    访问后台

    http://localhost:8080/

    skywalking

    img

    页面里,核心是successful rate 即,访问成功率,这个正常服务要一直100%才是对的,低于这个数都得报警

  • 相关阅读:
    被职场PUA了...
    C# 获取本机IP地址,IPv4,IPv6(保姆级)
    [单片机框架][bsp层][N32G4FR][bsp_i2c] i2c配置和使用
    windows下 PHP 安装
    大数据技术Spark详解
    SSM毕设项目超市零售管理系统mq344(java+VUE+Mybatis+Maven+Mysql)
    因势而变,因时而动,Go lang1.18入门精炼教程,由白丁入鸿儒,Go lang泛型(generic)的使用EP15
    Docker的数据管理(数据卷、容器互联)
    06. Nginx进阶-Nginx代理服务
    38、Java——汽车租赁系统(JDBC+MySQL+Apache DBUtils)
  • 原文地址:https://blog.csdn.net/qq_24298751/article/details/126649776