Springboot联手Docker、Skywalking,打造一体化监控体系,没有你想象的那么困难

4,903 阅读3分钟

前言

最近在对我的开源项目maochd-cloud在进行依赖升级,目前先对服务链路调用监控进行了升级。
1.0.0版本的时候,我采用的是zipkin + sleuth的方式来实现,这种方式可能有点过时,所以,这次我选择了用skywalking来作为新一代的链路调用监控。

过程

这里我们都采用docker的方式进行部署,docker的安装过程在这里就不过多赘述了,可参考菜鸟教程快速安装。
首先,我们需要在docker hub上找到skywalking的镜像包。
这里我们选择8.4.0版本,我尝试过6.6.0和9.2.0版本,6.6.0的部署方式跟8.4.0一样,但是6.6.0会出现服务没法被skywalking监控到,9.2.0版本的部署方式有所改变,由于时间原因没有深入研究,后期会在新的文章里更新部署方式。 image.png 按照他的overview一步步操作就能部署。这里就直接提供一些shell命令,来快速完成搭建。 由于这边是本地配置调试,没有使用es,生产使用的话请尽量使用es作为存储介质,es的配置在docker hub中都有,可以参考官方文档进行配置。

1、安装skywaling server

docker run -d \  
--restart always \  
--name maochd-skywalking \  
-p 1234:1234 \  
-p 11800:11800 \  
-p 12800:12800 \  
apache/skywalking-oap-server:8.4.0-es7

2、安装skywalking ui

docker run -d \  
--restart always \  
--name maochd-skywalking-ui \  
-p 8088:8080 \  
-e SW_OAP_ADDRESS=http://127.0.0.1:12800 \  
apache/skywalking-ui:8.4.0

访问http://127.0.0.1:8808,能出现UI界面就算搭建完成了

image.png
3、编写Dockfile文件

cd /opt && vim Dockerfile
## 拉取镜像(这里用jre可以让镜像的体积变小,打完会在100-300M之间,取决于jar包大小)
## docker hub上也提供了skywalking的镜像,但是那个打完包以后镜像包会特别的大,大概在800-1000M左右
FROM openjdk:8-jre-alpine  

## 定义服务名称,默认值为maochd-default-service
ARG SERVICE_NAME=maochd-default-service  

## 定义skywalking grpc地址, 默认值为127.0.0.1:11800
ENV SKYWALKING_SERVICE=127.0.0.1:11800  

## 拼接jar包名称
ENV JAR_NAME ${SERVICE_NAME}.jar  

## 把ARG中的SERVICE_NAME赋值到环境变量中,防止docker run的时候丢失参数
ENV SERVICE_NAME ${SERVICE_NAME}  

## 定义语言
ENV LANG en_US.UTF-8  
  
## 处理时间、时区、字体等配置  
RUN echo "http://mirrors.aliyun.com/alpine/v3.6/main" > /etc/apk/repositories \  
&& echo "http://mirrors.aliyun.com/alpine/v3.6/community" >> /etc/apk/repositories \  
&& apk add --no-cache tzdata ttf-dejavu fontconfig \  
&& ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \  
&& echo "Asia/Shanghai" > /etc/timezone  
 
## 定义JVM参数 
ENV JAVA_OPTS='-Xms512m -Xmx512m -Xss512k'  
  
## 复制jar到镜像内  
COPY ${JAR_NAME} /${JAR_NAME}  

## 复制agent探针到镜像指定目录下
COPY agent /usr/local/agent  

## 执行java命令
CMD java -javaagent:/usr/local/agent/skywalking-agent.jar \  
-Dskywalking.agent.service_name=$SERVICE_NAME \  
-Dskywalking.collector.backend_service=$SKYWALKING_SERVICE \  
$JAVA_OPTS -jar $JAR_NAME

4、下载agent

wget -P /opt https://archive.apache.org/dist/skywalking/8.4.0/apache-skywalking-apm-es7-8.4.0.tar.gz \
&& cd /opt \
&& tar -zvxf apache-skywalking-apm-es7-8.4.0.tar.gz \
&& cp -r apache-skywalking-apm-bin-es7/agent . \

5、打包镜像

docker build --build-arg SERVICE_NAME=test.jar -t test:1.0.0 .

6、运行镜像

docker run -itd \  
--restart always \  
--name maochd-test \  
-p 9191:9191 \  
-e SKYWALKING_SERVICE=127.0.0.1:11800 \  
test:1.0.0  

由于skywalking是懒加载模式,需要调用接口后才能呈现效果,所以我们可以调用一个jar包内的接口,当页面出现接口请求的时候就算成功了。
image.png

总结

在研究过程中,遇到了比较多的问题:第一个问题是skywalking的版本,用新不用旧,老版本可能会有些莫名其妙的问题,6.6.0的版本折腾了快3个小时,换成8.4.0后10分钟就部署成功了,第二个问题就是想封装一个轻量又适配性的Dockerfile文件,然后在Dockerfile的编写上出了很多的问题,最搞笑的是单词拼错了导致变量没有赋值成功。
其实,部署一些应用广泛的服务,没那么困难,先看下官方文档,然后再结合一些技术博客,最后再加上一点细心,什么都可以克服的。