猿创征文 | [云原生]为微服务保驾护航之链路跟踪skywalking保姆级搭建教程
微服务中,有时候服务调用多了,排查问题会变得异常繁琐,需要不断找到调用链每个服务的日志查看问题,消耗大量人力物力,最终才找到问题。这时候如果出现线上重大问题,又需要快速定位问题,有什么组件是实时监控整个调用链辅助我们快速定位问题的呢?当然有,那就是链路跟踪,其中比较出名的就是skywalking,无代码侵入性,只需要运行脚本加入对应命令即可。本文介绍skywalking的搭建全过程,同时提供了普通
前言
微服务中,有时候服务调用多了,排查问题会变得异常繁琐,需要不断找到调用链每个服务的日志查看问题,消耗大量人力物力,最终才找到问题。
这时候如果出现线上重大问题,又需要快速定位问题,有什么组件是实时监控整个调用链辅助我们快速定位问题的呢?
当然有,那就是链路跟踪,其中比较出名的就是skywalking,无代码侵入性,只需要运行脚本加入对应命令即可。
本文介绍skywalking的搭建全过程,同时提供了普通服务和k8s服务加入skywalking探针的方法。
skywalking简单安装部署
前提:需要安装java环境
1、下载
安装
版本目录地址:https://archive.apache.org/dist/skywalking/
这里下载当前最新for es7的8.5.0版本。不用es7存储的可以下载其他版本。
下载命令:
wget https://dlcdn.apache.org/skywalking/8.7.0/apache-skywalking-apm-es7-8.7.0.tar.gz
解压
mkdir /data -p
#解压到/data目录
tar -zxf apache-skywalking-apm-es7-8.5.0.tar.gz -C /data/
#重命名
mv /data/apache-skywalking-apm-bin-es7 /data/skywalking
配置
环境配置
修改/etc/hosts,加入如下内容
#es在本地安装
127.0.0.1 es
搭建docker版的es
docker安装略,直接用docker安装es吧,省事点。
docker pull elasticsearch:7.6.2
#创建docker容器挂在的目录:
sudo mkdir -p /data/elasticsearch/config
sudo mkdir -p /data/elasticsearch/data
sudo mkdir -p /data/elasticsearch/plugins
#配置文件
echo "http.host: 0.0.0.0" >> /data/elasticsearch/config/elasticsearch.yml
#创建容器
sudo docker run --name elasticsearch -p 9200:9200 -p 9300:9300 \
-e "discovery.type=single-node" \
-e ES_JAVA_OPTS="-Xms84m -Xmx512m" \
-v /data/elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml \
-v /data/elasticsearch/data:/usr/share/elasticsearch/data \
-v /data/elasticsearch/plugins:/usr/share/elasticsearch/plugins \
-d elasticsearch:7.6.2
#查看启动详情
docker ps # 查看是否启动
docker logs elasticsearch #启动日志查询
docker restart elasticsearch #重启
docker exec -it elasticsearch bash #进入
# 可能会出现的安装异常
## 异常一:文件夹未设置所有用户读写执行权限,处理:sudo chmod -R 777 /opt/elasticsearch/
## 异常一:文件夹未设置所有用户读写执行权限,处理:sudo chmod -R 777 /opt/elasticsearch/
## 异常三:因虚拟内存太少导致,处理:sudo sysctl -w vm.max_map_count=262144
服务配置
进入安装目录
cd /data/skywalking
修改配置文件./config/application.yml,修改数据库为elasticsearch7,其他使用默认配置即可。
vim config/application.yml
#集群配置
cluster:
#选择配置,这里使用单机版
selector: ${SW_CLUSTER:standalone}
#单机版配置
standalone:
...
#基于zk集群配置
zookeeper:
...
...
#数据库
storage:
#这里使用elasticsearch7
selector: ${SW_STORAGE:elasticsearch7}
...
elasticsearch7:
nameSpace: ${SW_NAMESPACE:""}
clusterNodes: ${SW_STORAGE_ES_CLUSTER_NODES:node3:9200}
...
...
UI端口修改
修改./webapp/webapp.yml文件
vim webapp/webapp.yml
server:
#访问端口号
port: 8080
collector:
path: /graphql
ribbon:
ReadTimeout: 10000
# Point to all backend's restHost:restPort, split by ,
# 内置zuul负载均衡
listOfServers: 127.0.0.1:12800
启停
启动
执行启动命令./bin/startup.sh,默认会占用的8080,11800,12800端口
$ ./bin/startup.sh
SkyWalking OAP started successfully!
SkyWalking Web Application started successfully!
停止
杀掉8080、11800端口对应的pid
kill -9 [pid]
访问
访问地址
http://localhost:8080/
skywalking做成service服务
做成服务,保证skywalking挂了能自动重启,开机自启,而且方便启停。(当前也能直接用做成镜像,用docker,但对于这种cpu或内存占用大的,还是推荐做成服务比较好点)
位置:
/usr/lib/systemd/system/skywalking.service
内容
[Unit]
Description=skywalking service
After=network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
Environment=JAVA_HOME=/data/java/jdk
ExecStart=/data/skywalking/bin/startup.sh
KillSignal=SIGQUIT
TimeoutStopSec=5
KillMode=process
PrivateTmp=true
StandardOutput=syslog
StandardError=inherit
[Install]
WantedBy=multi-user.target
命令
#重载配置
systemctl daemon-reload
#开机自启
systemctl enable skywalking
#重启skywalking
systemctl restart skywalking
systemctl status skywalking
加入探针
agent文件放到对应位置
给 springboot 服务加入探针
我的 start.sh 文件如下
,需要注意的是: -jar 后面是要加探针的 jar 包,一定要放在命令行的最后。
java -Dfile.encoding=UTF-8 -Xms256m -Xmx256m \
-javaagent:/opt/skywalking/agent/skywalking-agent.jar \
-Dskywalking.agent.service_name=ybf-static \
-Dskywalking.collector.backend_service=vipmajia.com:11800 \
-jar /root/dev/ybf-static-0.0.2-SNAPSHOT.jar \
&
启动 springboot:
./start.sh
给k8s的微服务加入探针
如果是k8s,其yaml要添加如下内容:
#外部 skywalking引入k8s作为endpoints
apiVersion: v1
kind: Endpoints
metadata:
labels:
name: skywalking
name: skywalking
namespace: xcc-prod
subsets:
- addresses:
- ip: 10.10.40.161
ports:
- name: skywalking
port: 11800
---
#skywalking作为service
apiVersion: v1
kind: Service
metadata:
labels:
name: skywalking
name: skywalking
namespace: xcc-prod
spec:
ports:
- name: skywalking
port: 11800
targetPort: 11800
type: NodePort
对应服务上加入skywalking的探针
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-project-name
namespace: xcc-test
spec:
replicas: 1
selector:
matchLabels:
name: my-project-name
template:
metadata:
labels:
name: my-project-name
spec:
containers:
- name: my-project-name
...
env:
- ...
# 镜像中没有JAVA_OPTS这个ENV实际上这个地方不会生效,所以在docker中 -javaagent:/sidecar/agent/skywalking-agent.jar 是需要的。
#这里通过JAVA_TOOL_OPTIONS,而不是JAVA_OPTS可以实现不通过将agent命令加入到java应用jvm参数而实现agent的集成
- name: JAVA_TOOL_OPTIONS
value: -javaagent:/data/skywalking/agent/skywalking-agent.jar
- name: SW_AGENT_NAME
value: my-project-name
- name: SW_AGENT_COLLECTOR_BACKEND_SERVICES
value: skywalking:11800
volumeMounts:
- name: bd-skywalking
mountPath: /data/skywalking/agent
volumes:
- name: bd-skywalking
nfs:
path: /data/k8snfs/sys/skywalking/agent
server: 10.10.40.121
- volumes前提,在挂载的nfs里提前把skywalking的agent目录放好到目录 :/data/k8snfs/sys/skywalking/agent
- volumeMounts:跟volumes呼应,name要保持一致,mountPath为当前目录,跟env的JAVA_TOOL_OPTIONS路径一致,都为/data/skywalking/agent
- env:必要的环境变量,JAVA_TOOL_OPTIONS 是jar跑的时候的代理jar
- env:必要的环境变量,SW_AGENT_COLLECTOR_BACKEND_SERVICES 是agent后台地址,要能在当前容器里ping通
- env:必要的环境变量,SW_AGENT_NAME 为最终在 http://127.0.0.1:8080 里会展示出来的名字,最好跟项目名称呼应,如例子里的my-project-name
访问后台
http://localhost:8080/
页面里,核心是successful rate 即,访问成功率,这个正常服务要一直100%才是对的,低于这个数都得报警
更多推荐
所有评论(0)