一旦你的程序docker化之后,你会遇到各种问题,比如原来采用的本地记日志的方式就不再方便了,虽然你可以挂载到宿主机,但你使用 —scale 的话,会导致记录日志异常,所以最好的方式还是要做日志中心化,另一个问题,原来一个请求在一个进程中的痉挛失败,你可以在日志中巡查出调用堆栈,但是docker化之后,原来一个进程的东西会拆成几个微服务,这时候最好就要有一个分布式的调用链跟踪,类似于wcf中的svctraceview工具。
一:搭建skywalking
github地址:
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
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 。
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 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 使用后台执行。这样 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);
});
}
}
}
可以看到这张图还是蛮漂亮的哈,也方便我们快速的跟踪代码,发现问题,找出问题, 还有更多的功能期待你的挖掘啦。 好了,本篇就说到这里,希望对你有帮助。