服务追踪
产生背景
在微服务系统中,随着业务的发展,系统会变得越来越大,那么各个服务之间的调用关系也就变得越来越复杂。一个 HTTP 请求会调用多个不同的微服务来处理返回最后的结果,在这个调用过程中,可能会因为某个服务出现网络延迟过高或发送错误导致请求失败,这个时候,对请求调用的监控就显得尤为重要了。Spring Cloud Sleuth 提供了分布式服务链路监控的解决方案。下面介绍 Spring Cloud Sleuth 整合 Zipkin 的解决方案。
分布式服务追踪系统优点
1.RPC远程调用过程中,服务与服务依赖的关系非常复杂,A调用B服务,B服务C服务 如果某个服务出现问题可能会导致整个链响应延迟;
2.如果服务的依赖关系非常复杂,建议改成MQ异步的形式。
服务追踪常用框架
\1. Sleuth +Zipkin SpringCloud封装了 Sleuth +Zipkin
\2. 阿里的鹰眼系统
\3. Skywalking(非常推荐大家使用 功能非常强大)---Skywalking
Sleuth+Zipkin
1.Spring Cloud Sleuth实现了一种分布式的服务链路跟踪解决方案,通过使用Sleuth可以让我们快速定位某个服务的问题。
服务追踪常见名词
1.Sleuth可以结合Zipkin可以实现界面化的形式管理我们接口依赖信息;
2.Sleuth 每一次RPC远程调用请求都会生成一个spanid记录每一次rpc请求的信息,还有一个traceid 全局唯一id;
3.spanid为请求单元ID、traceid 为请求链全局id
skyWalking
SkyWalking是一个开源的观测平台,用于从服务和云原生等基础设施中收集、分析、聚合以及可视化数据,SkyWalking 提供了一种简便的方式来清晰地观测分布式系统,甚至可以观测横跨不同云的系统,SkyWalking 更像是一种现代的应用程序性能监控(Application Performance Monitoring,即APM)工具,专为云原生,基于容器以及分布式系统而设计。
skywalking架构原理
在整个skywalking的系统中,有四个角色:
1.skywalking agent和业务系统关联在一起,负责收集各种监控数据;
2.oapservice是负责处理监控数据的,比如接受skywalking agent的监控数据,并存储在数据库中(例如elasticsearch、mysql中等);接受skywalking webapp的前端请求,从数据库查询数据,并返回数据给前端。,Skywalking oapservice通常以集群的形式存在;
3.skywalking webapp,前端界面,用于展示数据;
4.用于存储监控数据的数据库,比如mysql、elasticsearch等
skywalking 底层原理
1.springboot项目启动的时候 是不需要引入任何的jar包,
2.启动springboot项目被skywalking skywalking-agent.jar 拦截
3.将rpc请求数据 发送给我们的skywalking oapservice接口项目
4.连接到我们的skywalking webapp项目展示数据
5.数据最终是可以持久化存放在 db或者es中。
skywalking 环境安装
下载apache-skywalking-apm-6.5.0.tar安装包
\2. 进入到bin目录(直接双击启动startup.bat)
\3. 启动启动oapService和我们的webappService
\4. 查看管理界面http://127.0.0.1:8080/
agent 里面 skywalking-agent.jar 代理 springboot应用程序
springboot实现监控
创建一个springboot项目
\2. 将该springboot项目打成jar包 mvn package
\3. java -javaagent:skywalking-agent.jar路径 -jar springboot jar包
范例:
D:\path\cloud\apache-skywalking-apm-6.5.0\apache-skywalking-apm-bin\agent>java -javaagent:D:\path\cloud\apache-skywalking-apm-6.5.0\apache-skywalking-apm-bin\agent\skywalking-agent.jar -jar D:\path\cloud\apache-skywalking-apm-6.5.0\apache-skywalking-apm-bin\agent\mayikt-thymeleaf-1.0-SNAPSHOT.jar
访问测试springboot接口
skywalking页面最终显示
为了避免skywalking 展示数据延迟问题,建议 将自动刷新改为1-3s
大家在演示效果的过程中,如果没有任何数据 注意:手动点击
SkyWalking数据持久化
SkyWalking 默认是将数据存入在内存中,如果重启SkyWalking 数据则都会丢失。
我们可以选择将数据持久化存放在mysql、es中等。
1.数据可以持久化在mysql、es中等。
修改config下的application.yml
修改为mysql
selector: ${SW_STORAGE:mysql}
mysql:
properties:
jdbcUrl: ${SW_JDBC_URL:"jdbc:mysql://localhost:3306/skywalking?serverTimezone=UTC&characterEncoding=utf-8"}
dataSource.user: ${SW_DATA_SOURCE_USER:root}
dataSource.password: ${SW_DATA_SOURCE_PASSWORD:root}
dataSource.cachePrepStmts: ${SW_DATA_SOURCE_CACHE_PREP_STMTS:true}
dataSource.prepStmtCacheSize: ${SW_DATA_SOURCE_PREP_STMT_CACHE_SQL_SIZE:250}
dataSource.prepStmtCacheSqlLimit: ${SW_DATA_SOURCE_PREP_STMT_CACHE_SQL_LIMIT:2048}
dataSource.useServerPrepStmts: ${SW_DATA_SOURCE_USE_SERVER_PREP_STMTS:true}
metadataQueryMaxSize: ${SW_STORAGE_MYSQL_QUERY_MAX_SIZE:5000}
修改完毕创建skywalking数据库
2.需要在oap-libs/ 放入 mysql-connector-java-8.0.16.jar
3.重启SkyWalking
自动创建表