使用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, 如果不用容器編排工具
的話就比較麻煩。
下面是本次搭建的一個目錄結構:
-
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
-
elasticsearch.dockerfile
在up的時候,將這個es文件copy到 容器的config文件夾下。
FROM elasticsearch:5.6.4
EXPOSE 9200 9300
COPY elasticsearch.yml /usr/share/elasticsearch/config/
-
application.yml
skywalking的配置文件,這里也有一個坑:連接es的地址中,配置的 clustername一定要修改成和es的clustername保持一致,否則會連不上,這里容器之間用link
進行互聯,所以es的ip改成elasticsearch就可以了,其他的ip改成0.0.0.0 。
View Code
-
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
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" ]
復制代碼
-
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,大家可以參照官方安裝一下。
- 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
- 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
- 最后在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下載
