随着应用功能越来越多,从单体架构发展到现在微服务架构,拆分的模块越来越细粒化,需要定位应用模块之间的问题困难越来越大,需要通过一些第三方工具去帮助我们快速定位和发现应用模块的问题,实现以下功能: 1、监控模块间响应时间展示 2、应用模块间调用链路展示 3、慢响应识别 市面上也有非常多的APM软件提供。主流开源的如SkyWalking、ZipKin、CAT、PinPoint、ElasticAPM。这些都是根开发语言有强绑定关系,并且需要业务加载对应的开发包和引入SDK,对业务具有一定的侵入性。目前还有新兴的解决方案,基于云原生ServiceMesh方式,对应用没有侵入性和开发语言绑定。
基于Google分布式链路追踪论文Dapper开发,由中国工程师吴晟开发并开源贡献给Apache基金会,支持多种开发语言如Java、PHP、Go、C++、Node.js、Python、.NET、Lua……
总体架构如下
SkyWalking架构总体分为四部分:
Agent:探针负责与各类开发语言和平台集成如ServiceMesh,进行Tracing和Metric数据收集。发送给Server端。 Server端(OAP):接受Agent采集发送过来的数据,进行数据分析、处理、聚合、查询以及将数据发送到后端存储。 Storage:支持多种后端存储(ElasticSearch、Mysql、Tidb…),接收Server端发送过来的数据。 UI: 进行数据计算后的结果统一展示和调用链路展示。
环境信息
软件 | 版本 |
---|---|
kubernetes | v1.18.20 |
skywalking | v8.1.0 |
SkyWalking官方支持多种安装方式,这里为了快速部署,使用的是在Kubernetes上用Helm安装,后端存储使用ElasticSearch。 使用官方Helm安装方式最小化安装,后端存储使用ElasticSearch。 参考部署手册 https://github.com/apache/skywalking-kubernetes (opens new window)
环境
配置环境变量
export SKYWALKING_RELEASE_NAME=skywalking
export SKYWALKING_RELEASE_NAMESPACE=default 配置repo
export REPO=skywalking
helm repo add ${REPO} https://apache.jfrog.io/artifactory/skywalking-helm
helm repo update
安装skywalking,这里安装会自动帮你部署一个ElasticSearch,如果需要对接已经存在的ElasticSearch集群或使用其他的后端存储,可以使用其他参数进行部署安装。
helm install "${SKYWALKING_RELEASE_NAME}" ${REPO}/skywalking -n "${SKYWALKING_RELEASE_NAMESPACE}" \
--set oap.image.tag=8.1.0-es7 \
--set oap.storageType=elasticsearch7 \
--set ui.image.tag=8.1.0 \
--set elasticsearch.imageTag=7.5.1
部署完后查看
kubectl get pod
NAME READY STATUS RESTARTS AGE
elasticsearch-master-0 1/1 Running 0 8m54s
elasticsearch-master-1 1/1 Running 0 8m54s
elasticsearch-master-2 1/1 Running 0 8m54s
skywalking-es-init-vl8c7 0/1 Completed 0 8m54s
skywalking-oap-64df9d4b8c-dvksd 1/1 Running 0 3m50s
skywalking-oap-64df9d4b8c-p6thl 1/1 Running 0 8m54s
skywalking-ui-649dc77bd7-t9d7m 1/1 Running 0 8m54s
部署了一个ElasticSearch集群和skywalking对应的组件
为了方便访问,我们将Skywalking的UI通过NodePort对外暴露出来。
kubectl patch svc skywalking-ui --type='json' -p '[{"op":"replace","path":"/spec/type","value":"NodePort"},{"op":"add","path":"/spec/ports/0/nodePort","value":30930}]'|
访问http://节点ip:30930,此时默认UI界面如下: (opens new window)
方式一:应用启动加载agent依赖包。 比如通过http://skywalking.apache.org/downloads/下载对应发行版本tar包里面包含的agent文件,然后应用启动命令加载此agent依赖文件即可。如以下通过容器应用构建Dockerfile方式加载。 (opens new window)
FROM registry.cn-shenzhen.aliyuncs.com/yedward/openjdk:8-jre-slim
USER appuser
EXPOSE 8080
COPY --from=build /usr/src/app/target/*.jar /app/
WORKDIR /app
CMD java -jar -Xms1024m -Xmx1024m /app/spring-petclinic.jar -javaagent:/opt/skywalking/agent/skywalking-agent.jar
方式二:通过外部挂载和参数引用方式。下面Demo主要就是对这种方式的演示。
这两种方式最大的区别在于,方式一需要改动应用启动命令,方式二对应用本身不需要进行改动,就需要进行升级即可。
以spring-petclinic为Demo进行演示,一个简单的应用,前面有一个Gateway做为统一流量入口,通过Web模块将对应的服务请求转发到后端不同的其他服务上,进行服务调用。
https://github.com/wanshaoyuan/spring-petclinic-msa.git (opens new window)
部署Demo应用
#下载
git clone https://github.com/wanshaoyuan/spring-petclinic-msa.git
#部署yaml
kubectl apply -f k8s/local-skywalking/
访问服务
http://host_ip:31080 (opens new window)
一个宠物医院系统,可以点击进行一些资料的添加和修改。
查看Skywalking的数据,点击右上角自动的按钮进行自动的刷新
调用Top耗时显示和响应耗时范围展示
服务响应时间和调用成功率
全局调用链路展示
总结: Skywalking UI做的非常精美,做为一款开源产品功能覆盖还是非常全面的,APM系统对于目前微服务体系的应用进行故障排查还是有非常大的帮助。但这种非常对开发语言还是有一定依赖性,另外一种不需要开发语言依赖的方式就是ServiceMesh的实现 完全不侵入应用,也不需要加载Jar包,ServiceMesh主要是通过做应用透明代理和流量劫持去实现链路追踪,如Istio,但他的缺点是只能追踪HTTP请求,覆盖范围有限,并且相对追踪的数据也比埋点的要少一些。