在微服务应用非常广的今天,面临必要的问题
一个大型的互联网项目,采用微服务的架构设计,可能保证整个项目的完整运营就需要几十上百个服务的互相协作,那如果某个服务突然宕机或出现死锁等bug,怎么办?这个时候各个服务的维护团组开始互相扯皮了,都一口咬定是XXX的错误,与自己无关,哈哈哈哈哈,这个时候如果通过日志一层一层的去追踪足以把人逼疯了
1.那怎么快速串联调用的链路,对出现问题的服务进行排查呢?
2.怎么一目了然的知道各个服务之间的依赖关系?
3. 一个调用下怎样知道串联的各个服务所消耗性能?
4.执行顺序谁先谁后?
分布式调用链就是为了解决以上几个问题而生,它主要的作用如下:
1、自动采集各项服务的数据数据,并且监控调用各服务所消耗的性能
2、能分析数据,可以监控完整的调用过程,问题可追踪可复现
3、数据可视化:每个组件的性能可视化,能帮助我们很好地定位系统的瓶颈,及时找出问题所在
这里就搭建Skywalking来示例,当然也有很多链路追踪监控工具
我这里就用 elasticsearch+skywalking来实现
当然skywalking也支持其 它配置可选项有H2/MYSQL/elasticsearch7/tidb/influxdb
配置elasticsearch7非结构型数据存储效率更高
好了现在就开始搭建吧
linux服务器 一台
Elasticsearch 压缩包 下载Download Elasticsearch | Elastic
skywalking 压缩包 下载Downloads | Apache SkyWalking
linux需要先搭建jdk环境哈
我这边是先下载到本地然后通过shell工具上传到linux服务器,你也可以直接wget 压缩包地址
类似 wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.14.0-linux-x86_64.tar.gz
解压elasticsearch
tar -zxvf elasticsearch-7.14.0-linux-x86_64.tar.gz
修改config/elasticsearch.yml文件
cluster.name: my-application
node.name: node-1
path.data: /usr/local/data
path.logs: /usr/local/logs
network.host: 0.0.0.0
http.port: 9200
cluster.initial_master_nodes: ["node-1"]
# 需要开启跨域才能给elasticsearch-head,kibana等连接
http.cors.enabled: true
http.cors.allow-origin: "*"
http.cors.allow-headers: Authorization,X-Requested-With,Content-Length,Content-Type
创建用户组用户并授权
groupadd elsearch
sudo useradd elsearch -g elsearch
passwd elsearch
chown -R elsearch:elsearch elasticsearch-7.14.0
vi /etc/sysctl.conf
vm.max_map_count=262144
保存并退出
:wq
使之立即生效
sysctl -p
su - elsearch //切换用户 需要输入密码的哈,按提示来,就是上面自己设置的
使用elsearch 用户执行 你存放elasticsearch目录下的bin目录里面的elasticsearch文件
./elasticsearch -d
访问你服务器的ip:9200 能出现以下数据就是部署成功了
好了到skywalking
再切换回去
su - root
解压你的skywalking压缩包
tar -zxvf apache-skywalking-apm-es7-8.5.0.tar.gz
cd apache-skywalking-apm-bin-es7/
config/application.yml 这个配置文件要改成我们前面设置的elasticsearch
它默认使用的是H2
把这个位置修改成这个
storage:
selector: ${SW_STORAGE:elasticsearch7}
$ bin/oapService.sh
修改 webapp.yml 的端口 默认是8080,很容易被占用冲突
webapp/webapp.yml
bin/startup.sh
执行就ok了
成功之后就可以通过你部署的ip+webapp.yml里面配置的端口访问你的skywalking
比如我的就是127.0.0.1:7080 就可以了,当然我这里面已经有内容了是因为我已经使用,你刚启动好的话,里面应该是空白没有内容的
好了,这skywalking环境是已经搭建好了,那怎么开启链路监控呢?
比如我这个demo来说
我这里idea经过了汉化,不喜欢用汉化的可以找到 VM options: 这个位置把下面内容填充进去
-javaagent:D:\skywalking-agent\skywalking-agent.jar -DSW_AGENT_NAME=demo-client -DSW_AGENT_COLLECTOR_BACKEND_SERVICES=127.0.0.1:11800
nohup java -javaagent:agent/skywalking-agent.jar -Dskywalking.agent.service_name=你的服务名 -jar demo.jar > demo.log 2>&1 &
当然你也可以设置大小-Xms512m -Xmx512m 等等等等
我这里是一个比较简单的demo,所以看起来影响不大,哈哈哈哈,等你几十个服务就可以看到密密麻麻的调用了
你用的啥语言就搞啥语言的代理 你执行
-javaagent:D:\skywalking-agent\skywalking-agent.jar -DSW_AGENT_NAME=demo-client -DSW_AGENT_COLLECTOR_BACKEND_SERVICES=127.0.0.1:11800
对应的