一旦你的程序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

2. elasticsearch.dockerfile

在up的时候,将这个es文件copy到 容器的config文件夹下。


FROM elasticsearch:5.6.4EXPOSE 9200 9300COPY elasticsearch.yml /usr/share/elasticsearch/config/

3. application.yml

skywalking的配置文件,这里也有一个坑:连接es的地址中,配置的 clustername一定要修改成和es的clustername保持一致,否则会连不上,这里容器之间用link进行互联,所以es的ip改成elasticsearch就可以了,其他的ip改成0.0.0.0 。


# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License.  You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.#cluster:
#  zookeeper:
#    hostPort: localhost:2181
#    sessionTimeout: 100000
naming:jetty:host: 0.0.0.0port: 10800contextPath: /
cache:
#  guava:caffeine:
remote:gRPC:host: 0.0.0.0port: 11800
agent_gRPC:gRPC:host: 0.0.0.0port: 11800#Set these two setting to open ssl#sslCertChainFile: $path#sslPrivateKeyFile: $path#Set your own token to active auth#authentication: xxxxxx
agent_jetty:jetty:host: 0.0.0.0port: 12800contextPath: /
analysis_register:default:
analysis_jvm:default:
analysis_segment_parser:default:bufferFilePath: ../buffer/bufferOffsetMaxFileSize: 10MbufferSegmentMaxFileSize: 500MbufferFileCleanWhenRestart: true
ui:jetty:host: 0.0.0.0port: 12800contextPath: /
storage:elasticsearch:clusterName: elasticsearchclusterTransportSniffer: trueclusterNodes: elasticsearch:9300indexShardsNumber: 2indexReplicasNumber: 0highPerformanceMode: truettl: 7
#storage:
#  h2:
#    url: jdbc:h2:~/memorydb
#    userName: sa
configuration:default:
#     namespace: xxxxx
# alarm thresholdapplicationApdexThreshold: 2000serviceErrorRateThreshold: 10.00serviceAverageResponseTimeThreshold: 2000instanceErrorRateThreshold: 10.00instanceAverageResponseTimeThreshold: 2000applicationErrorRateThreshold: 10.00applicationAverageResponseTimeThreshold: 2000
# thermodynamicthermodynamicResponseTimeStep: 50thermodynamicCountOfResponseTimeSteps: 40

4.  skywalking.dockerfile

接下来就是 skywalking的 下载安装,使用dockerfile流程化。


FROM centos:7LABEL username="hxc@qq.com"WORKDIR /appRUN yum install -y wget && \yum install -y java-1.8.0-openjdkADD http://mirrors.hust.edu.cn/apache/incubator/skywalking/5.0.0-RC2/apache-skywalking-apm-incubating-5.0.0-RC2.tar.gz /appRUN tar -xf apache-skywalking-apm-incubating-5.0.0-RC2.tar.gz && \mv apache-skywalking-apm-incubating skywalkingRUN ls /app#copy文件
COPY application.yml /app/skywalking/config/application.ymlWORKDIR /app/skywalking/binUSER rootRUN  echo "tail -f /dev/null" >> /app/skywalking/bin/startup.shCMD ["/bin/sh","-c","/app/skywalking/bin/startup.sh" ]

5. 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 可视化查询,暴露 5601kibana:image: kibanalinks:- elasticsearchports:- 5601:5601depends_on:- "elasticsearch"#skywalkingskywalking:build:context: .dockerfile: skywalking.dockerfileports:- "10800:10800"- "11800:11800"- "12800:12800"- "8080:8080"links:- elasticsearchdepends_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-enginesudo yum install -y yum-utils \
device-mapper-persistent-data \
lvm2sudo yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.reposudo 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

2. 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-composesudo chmod +x /usr/local/bin/docker-compose

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


[root@localhost docker]# docker-compose up --build
Creating network "docker_default" with the default driver
Building elasticsearch
Step 1/3 : FROM elasticsearch:5.6.4---> 7a047c21aa48
Step 2/3 : EXPOSE 9200 9300---> Using cache---> 8d66bb57b09d
Step 3/3 : COPY elasticsearch.yml /usr/share/elasticsearch/config/---> Using cache---> 02b516c03b95
Successfully built 02b516c03b95
Successfully tagged docker_elasticsearch:latest
Building skywalking
Step 1/12 : FROM centos:7---> 5182e96772bf
Step 2/12 : LABEL username="hxc@qq.com"---> Using cache---> b95b96a92042
Step 3/12 : WORKDIR /app---> Using cache---> afdf4efe3426
Step 4/12 : RUN yum install -y wget &&     yum install -y java-1.8.0-openjdk---> Using cache---> 46be0ca0f7b5
Step 5/12 : ADD http://mirrors.hust.edu.cn/apache/incubator/skywalking/5.0.0-RC2/apache-skywalking-apm-incubating-5.0.0-RC2.tar.gz /app---> Using cache---> d5c30bcfd5ea
Step 6/12 : RUN tar -xf apache-skywalking-apm-incubating-5.0.0-RC2.tar.gz &&     mv apache-skywalking-apm-incubating skywalking---> Using cache---> 1438d08d18fa
Step 7/12 : RUN ls /app---> Using cache---> b594124672ea
Step 8/12 : COPY application.yml /app/skywalking/config/application.yml---> Using cache---> 10eaf0805a65
Step 9/12 : WORKDIR /app/skywalking/bin---> Using cache---> bc0f02291536
Step 10/12 : USER root---> Using cache---> 4498afca5fe6
Step 11/12 : RUN  echo "tail -f /dev/null" >> /app/skywalking/bin/startup.sh---> Using cache---> 1c4be7c6b32a
Step 12/12 : CMD ["/bin/sh","-c","/app/skywalking/bin/startup.sh" ]---> Using cache---> ecfc97e4c97d
Successfully built ecfc97e4c97d
Successfully tagged docker_skywalking:latest
Creating docker_elasticsearch_1 ... done
Creating docker_skywalking_1    ... done
Creating docker_kibana_1        ... done
Attaching to docker_elasticsearch_1, docker_kibana_1, docker_skywalking_1
elasticsearch_1  | [2018-09-17T23:51:57,886][INFO ][o.e.c.m.MetaDataCreateIndexService] [FC_bOh1] [service_metric_day] creating index, cause [api], templates [], shards [2]/[0], mappings [type]
elasticsearch_1  | [2018-09-17T23:51:57,962][INFO ][o.e.c.r.a.AllocationService] [FC_bOh1] Cluster health status changed from [YELLOW] to [GREEN] (reason: [shards started [[service_metric_day][0]] ...]).
elasticsearch_1  | [2018-09-17T23:51:58,115][INFO ][o.e.c.m.MetaDataCreateIndexService] [FC_bOh1] [application_metric_hour] creating index, cause [api], templates [], shards [2]/[0], mappings [type]
elasticsearch_1  | [2018-09-17T23:51:58,176][INFO ][o.e.c.r.a.AllocationService] [FC_bOh1] Cluster health status changed from [YELLOW] to [GREEN] (reason: [shards started [[application_metric_hour][1]] ...]).
elasticsearch_1  | [2018-09-17T23:51:58,356][INFO ][o.e.c.m.MetaDataCreateIndexService] [FC_bOh1] [application_metric_month] creating index, cause [api], templates [], shards [2]/[0], mappings [type]
elasticsearch_1  | [2018-09-17T23:51:58,437][INFO ][o.e.c.r.a.AllocationService] [FC_bOh1] Cluster health status changed from [YELLOW] to [GREEN] (reason: [shards started [[application_metric_month][0]] ...]).
elasticsearch_1  | [2018-09-17T23:51:58,550][INFO ][o.e.c.m.MetaDataCreateIndexService] [FC_bOh1] [instance_mapping_month] creating index, cause [api], templates [], shards [2]/[0], mappings [type]
elasticsearch_1  | [2018-09-17T23:52:05,544][INFO ][o.e.c.m.MetaDataCreateIndexService] [FC_bOh1] [gc_metric_minute] creating index, cause [api], templates [], shards [2]/[0], mappings [type]

从上图中可以看到 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的请求操作,然后仔细观察一下调用链跟踪是一个什么样子?


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=398940public void ConfigureServices(IServiceCollection services){services.AddSkyWalking(option =>{// Application code is showed in sky-walking-uioption.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);});}}
}

可以看到这张图还是蛮漂亮的哈,也方便我们快速的跟踪代码,发现问题,找出问题, 还有更多的功能期待你的挖掘啦。好了,本篇就说到这里,希望对你有帮助。

使用 docker 构建分布式调用链跟踪框架skywalking相关推荐

  1. 微服务调用链追踪框架Skywalking,看完你就懂了!

    思维导图 文章已收录Github精选,欢迎Star:https://github.com/yehongzhi/learningSummary 概述 **skywalking**又是一个优秀的国产开源框 ...

  2. java高可用grpc_GRPC java 分布式调用链跟踪实践

    Opentracing基本模型 image.png 如图,在跟踪链中有以下几个比较重要的数据结构和概念: span:标识一次分布式调用,其自身包含了id,parentId(指向上级Span的id), ...

  3. 快狗打车CTO沈剑:低成本搞定分布式调用链追踪系统

    本文根据沈剑老师在[2020 Gdevops全球敏捷运维峰会]现场演讲内容整理而成. 讲师介绍 沈剑,到家集团技术VP&技术委员会主席,快狗打车CTO,互联网架构技术专家,"架构师之 ...

  4. 小程聊微服务-自己动手扩展分布式调用链

    一.说在前面 微服务是当下最火的词语,现在很多公司都在推广微服务,当服务越来越多的时候,我们是否会纠结以下几个问题: 面对一笔超时的订单,究竟是哪一步处理时间超长呢? 数据由于并发莫名篡改,到底都谁有 ...

  5. 程超:手把手教你动手扩展分布式调用链

    一.说在前面 微服务是当下最火的词语,现在很多公司都在推广微服务,当服务越来越多的时候,我们是否会纠结以下几个问题: 面对一笔超时的订单,究竟是哪一步处理时间超长呢? 数据由于并发莫名篡改,到底都谁有 ...

  6. 分布式全链路跟踪系统-skywalking

    什么是链路追踪 本节视频 [视频]Spring Cloud Alibaba-SkyWalking-分布式链路追踪 微服务架构是通过业务来划分服务的,使用 REST 调用.对外暴露的一个接口,可能需要很 ...

  7. SpringCloud系列:分布式服务调用链跟踪整合Zipkin、RabbitMQ、Elasticsearch(二)

    2019独角兽企业重金招聘Python工程师标准>>> 一.概述 RabbitMQ用于的服务和Zipkin服务端的通信,代替服务和Zipkin服务端通过http协议的通信,实现了微服 ...

  8. 分布式调用跟踪与监控实战

    云栖社区 2017-05-04 12:09 更多深度文章,请关注云计算频道:https://yq.aliyun.com/cloud 分布式调用系统的现状 当前,随着互联网架构的扩张,分布式系统变得日趋 ...

  9. 分布式调用跟踪系统的设计和应用

    一.为什么需要分布式调用跟踪系统 随着分布式服务架构的流行,特别是微服务等设计理念在系统中的应用,业务的调用链越来越复杂, 可以看到,随着服务的拆分,系统的模块变得越来越多,不同的模块可能由不同的团队 ...

最新文章

  1. Android被逼学习小例子1
  2. String、toString、String.valueOf()三个有啥区别?
  3. 设置图例字体_plotly_标题参数详解(大小,颜色,字体,位置)
  4. 第二阶段团队冲刺(五)
  5. 万份销量,五星好评!这门Python神作刷爆朋友圈!
  6. RecyclerView的基础用法
  7. 北理工-大二数据结构乐学编程题-约瑟夫问题、验证表、循环小数、综教楼后的坑...
  8. 企业微信可以批量删除聊天记录吗?
  9. secureCRT查看日志命令
  10. .styl格式的CSS样式文件是什么文件
  11. javascript飞机大战-----007爆炸效果
  12. MacBook系统升级问题
  13. 工作能力强的人,都有哪些特点?
  14. jbox2d android教程,Jbox2d实践应用
  15. 四川大学计算机专业调剂,四川大学计算机学院(软件学院)2019考研调剂信息
  16. 腾讯云音视频及融合通信技术
  17. 相约,一朵春天的微笑
  18. [Android]gradle与Android gradle
  19. GStreamer | 一
  20. hardware_hp存储映射_方案

热门文章

  1. PHP7 学习笔记(十一)使用phpstudy快速配置一个虚拟主机
  2. 分析cocos2d-x中的CrystalCraze示例游戏
  3. craigslist_如何设置Craigslist警报(用于电子邮件或SMS)
  4. CentOS 桌面启动无登录界面
  5. 最大连续子数组和与JUnit测试
  6. css3 伪类选择器
  7. Hadoop日常管理与维护
  8. 痞子衡嵌入式:ARM Cortex-M内核那些事(2)- 第一款微控制器
  9. Java并发编程-原子性变量
  10. Linux上搭建nginx,及简单配置