部署你的分布式調用鏈跟蹤框架skywalking


使用docker-compose 一鍵部署你的分布式調用鏈跟蹤框架skywalking

https://www.cnblogs.com/huangxincheng/p/9666930.html

  一旦你的程序docker化之后,你會遇到各種問題,比如原來采用的本地記日志的方式就不再方便了,雖然你可以掛載到宿主機,但你使用 --scale 的話,會導致

記錄日志異常,所以最好的方式還是要做日志中心化,另一個問題,原來一個請求在一個進程中的痙攣失敗,你可以在日志中巡查出調用堆棧,但是docker化之后,

原來一個進程的東西會拆成幾個微服務,這時候最好就要有一個分布式的調用鏈跟蹤,類似於wcf中的svctraceview工具。

一:搭建skywalking

  gihub地址是:https://github.com/apache/incubator-skywalking 從文檔中大概看的出來,大體分三個部分:存儲,收集器,探針,存儲這里就選用推薦的

elasticsearch。收集器准備和es部署在一起,探針就有各自語言的實現了,總之這里就有三個docker container: es,kibana,skywalking, 如果不用容器編排工具

的話就比較麻煩。

  下面是本次搭建的一個目錄結構:
  1. elasticsearch.yml

    es的配置文件,不過這里有一個坑,就是一定要將 network.publish_host: 0.0.0.0 ,否則skywalking會連不上 9300端口。

network.publish_host: 0.0.0.0
transport.tcp.port: 9300
network.host: 0.0.0.0

  1. elasticsearch.dockerfile

    在up的時候,將這個es文件copy到 容器的config文件夾下。

FROM elasticsearch:5.6.4

EXPOSE 9200 9300

COPY elasticsearch.yml /usr/share/elasticsearch/config/

  1. application.yml

    skywalking的配置文件,這里也有一個坑:連接es的地址中,配置的 clustername一定要修改成和es的clustername保持一致,否則會連不上,這里容器之間用link

進行互聯,所以es的ip改成elasticsearch就可以了,其他的ip改成0.0.0.0 。

View Code

  1. skywalking.dockerfile

    接下來就是 skywalking的 下載安裝,使用dockerfile流程化。

復制代碼
FROM centos:7

LABEL username="hxc@qq.com"

WORKDIR /app

RUN yum install -y wget &&
yum install -y java-1.8.0-openjdk

ADD http://mirrors.hust.edu.cn/apache/incubator/skywalking/5.0.0-RC2/apache-skywalking-apm-incubating-5.0.0-RC2.tar.gz /app

RUN tar -xf apache-skywalking-apm-incubating-5.0.0-RC2.tar.gz &&
mv apache-skywalking-apm-incubating skywalking

RUN ls /app

copy文件

COPY application.yml /app/skywalking/config/application.yml

WORKDIR /app/skywalking/bin

USER root

RUN echo "tail -f /dev/null" >> /app/skywalking/bin/startup.sh

CMD ["/bin/sh","-c","/app/skywalking/bin/startup.sh" ]
復制代碼

  1. docker-compose.yml

    最后就是將這三個容器進行編排,要注意的是,因為收集器會將數據放入到es中,所有一定要將es的data掛載到宿主機的大硬盤下,否則你的空間會不足的。

復制代碼
version: '3.1'

services:

elastic 鏡像

elasticsearch:
build:
context: .
dockerfile: elasticsearch.dockerfile
# ports:
# - "9200:9200"
# - "9300:9300"
volumes:
- "/data/es2:/usr/share/elasticsearch/data"

kibana 可視化查詢,暴露 5601

kibana:
image: kibana
links:
- elasticsearch
ports:
- 5601:5601
depends_on:
- "elasticsearch"

skywalking

skywalking:
build:
context: .
dockerfile: skywalking.dockerfile
ports:
- "10800:10800"
- "11800:11800"
- "12800:12800"
- "8080:8080"
links:
- elasticsearch
depends_on:
- "elasticsearch"
復制代碼

二:一鍵部署

  要部署在docker中,你還得需要安裝docker-ce 和 docker-compose,大家可以參照官方安裝一下。
  1. Docker-ce 的安裝

復制代碼
sudo yum remove docker
docker-client
docker-client-latest
docker-common
docker-latest
docker-latest-logrotate
docker-logrotate
docker-selinux
docker-engine-selinux
docker-engine

sudo yum install -y yum-utils
device-mapper-persistent-data
lvm2

sudo yum-config-manager
--add-repo
https://download.docker.com/linux/centos/docker-ce.repo

sudo yum install docker-ce
復制代碼

然后啟動一下docker 服務,可以看到版本是18.06.1

[root@localhost ~]# service docker start
Redirecting to /bin/systemctl start docker.service
[root@localhost ~]# docker -v
Docker version 18.06.1-ce, build e68fc7a

  1. docker-compose的安裝

sudo curl -L "https://github.com/docker/compose/releases/download/1.22.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

sudo chmod +x /usr/local/bin/docker-compose

  1. 最后在centos上執行 docker-compopse up --build 就可以了,如果不想terminal上運行,可以加 -d 使用后台執行。

View Code

從上圖中可以看到 es,kibana,skywalking都啟動成功了,你也可以通過docker-compose ps 看一下是否都起來了,netstat 看一下宿主機開放了哪些端口。

復制代碼
[root@localhost docker]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9aa90401ca16 kibana "/docker-entrypoint.…" 2 minutes ago Up 2 minutes 0.0.0.0:5601->5601/tcp docker_kibana_1
c551248e32af docker_skywalking "/bin/sh -c /app/sky…" 2 minutes ago Up 2 minutes 0.0.0.0:8080->8080/tcp, 0.0.0.0:10800->10800/tcp, 0.0.0.0:11800->11800/tcp, 0.0.0.0:12800->12800/tcp docker_skywalking_1
765d38469ff1 docker_elasticsearch "/docker-entrypoint.…" 2 minutes ago Up 2 minutes 9200/tcp, 9300/tcp docker_elasticsearch_1
[root@localhost docker]# netstat -tlnp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 192.168.122.1:53 0.0.0.0:* LISTEN 2013/dnsmasq
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1141/sshd
tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN 1139/cupsd
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 1622/master
tcp6 0 0 :::8080 ::😗 LISTEN 38262/docker-proxy
tcp6 0 0 :::10800 ::😗 LISTEN 38248/docker-proxy
tcp6 0 0 :::22 ::😗 LISTEN 1141/sshd
tcp6 0 0 ::1:631 ::😗 LISTEN 1139/cupsd
tcp6 0 0 :::11800 ::😗 LISTEN 38234/docker-proxy
tcp6 0 0 ::1:25 ::😗 LISTEN 1622/master
tcp6 0 0 :::12800 ::😗 LISTEN 38222/docker-proxy
tcp6 0 0 :::5601 ::😗 LISTEN 38274/docker-proxy
[root@localhost docker]#
復制代碼

然后就可以看一些8080端口的可視化UI,默認用戶名密碼admin,admin,一個比較耐看的UI就出來了。

三: net下的探針

  從nuget上拉取一個SkyWalking.AspNetCore探針進行代碼埋點,github地址:https://github.com/OpenSkywalking/skywalking-netcore

在startup類中進行注入,在頁面請求中進行一次cnblogs.com的請求操作,然后仔細觀察一下調用鏈跟蹤是一個什么樣子?

復制代碼
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.DependencyInjection;
using SkyWalking.Extensions;
using SkyWalking.AspNetCore;
using System.Net;

namespace WebApplication1
{
public class Startup
{
// This method gets called by the runtime. Use this method to add services to the container.
// For more information on how to configure your application, visit https://go.microsoft.com/fwlink/?LinkID=398940
public void ConfigureServices(IServiceCollection services)
{
services.AddSkyWalking(option =>
{
// Application code is showed in sky-walking-ui
option.ApplicationCode = "10001 測試站點";

            //Collector agent_gRPC/grpc service addresses.
            option.DirectServers = "192.168.23.183:11800";
        });
    }

    // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }

        app.Run(async (context) =>
        {
            WebClient client = new WebClient();

            var str = client.DownloadString("http://cnblogs.com");

            await context.Response.WriteAsync(str);
        });
    }
}

}
復制代碼

     可以看到這張圖還是蠻漂亮的哈,也方便我們快速的跟蹤代碼,發現問題,找出問題, 還有更多的功能期待你的挖掘啦。 好了,本篇就說到這里,希望對你有幫助。

Demo下載


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM