我们知道,微服务不是独立的存在,否则就不需要微服务这个架构了,那么当发起一次请求,如何知道这次请求的轨迹,或者说遇到响应缓慢、请求出错的情况,我们该如何定位呢? 这就涉及到APM(Application Performance Management)组件了,主流的选型有Zipkin、Pinpoint、Jaeger、Skywalking,我在VehicleAdmin项目中试用了Dubbo+Zipkin组合,但发现当服务既是生产者又是消费者时有不兼容问题,于是我在此做了个Dubbo+ Skywalking的演示版本,仅供参考。
准备:
Idea2019.03/Gradle6.0.1/Maven3.6.3/JDK11.0.4/Lombok0.28/SpringBoot2.2.4RELEASE/mybatisPlus3.3.0/Soul2.1.2/Dubbo2.7.5/Druid1.2.21/Zookeeper3.5.5/Mysql8.0.11/Redis5.0.5/Skywalking7.0.0
难度: 新手--战士--老兵--大师
目标:
1、 Skywalking做微服务链路监控;
步骤:
为了遇见各种问题,同时保持时效性,我尽量使用最新的软件版本。源码地址:https://github.com/xiexiaobiao/vehicle-shop-admin
1 原理
JavaAgent开启java探针(使用ASM字节码技术开发的工具),即运行在main方法之前的拦截器,简单讲就是动态代理和方法拦截器的组合,拦截并分析请求/响应的信息。更多关于java探针的内容,在此不展开,略!
2 步骤
2.1 下载
下载Skywalking,略!7.0.0版本之后编译好的二进制文件就是一个Window/Linux通用的包了,直接解压即可。
2.2 开发环境使用
IDE开发环境Idea下的使用举例,JVM参数行添加:
-javaagent:C:\apache-skywalking-apm-bin-7.0\agent\skywalking-agent.jar -DSW_AGENT_NAME=authority-service -Dskywalking.collector.servers=localhost:10800
以上javaagent地址为skywalking-agent.jar地址,可以为相对/绝对路径:
然后其他每个服务都类似操作,修改DSW_AGENT_NAM内容为具体的服务名。
如果服务打包成Jar文件,启动时加参数即可,这里给个实例:
java -jar -javaagent:$AGENT_PATH/skywalking-agent.jar -Dskywalking.agent.application_code=dubbo-consumer -Dskywalking.collector.servers=localhost:10800 authority-1.0-SNAPSHOT.jar
服务名称也可以在config文件中配置,但只能配一个!!感觉这配置就是个鸡肋。
2.3 运行Skywalking
如果没有在apache-skywalking-apm-bin-7.0\webapp\webapp.yml中对 server: port: 8080 修改端口号,运行解压包下的 bin/startup 文件,即可启动 Skywalking Server 端,打开浏览器地址即可:http://localhost:8080/
2.4 运行项目
启动vehicleadmin项目,顺序:souladmin—>soulbootstrap—>redis—>authority—>customer—>stock—>order —>business, 进入WEBUI仪表盘总览:
服务拓扑图,可以展示服务、DB、缓存、网关信息,可以独立出单个服务显示:
调用链追踪,可以树形、表格、列表方式展示,比如显示 /order/list的跨度(span)信息和调用链信息,可以了解链路总耗时和span耗时:
点击一个链对象后展示的span信息,以下为一个dubbo调用实例:
2.5 日志接入
如果需要在日志中打印,即手动埋点,也可以使用API,对任何需要追踪的方法,使用 @Trace
标注,则此方法会被加入到追踪链中,通过TraceContext.traceId() 在应用任意位置获取traceId,还可以通过ActiveSpan.tag() 自定义标签,例如我在com.biao.shop.authority.controller.SystemUserController中:
输出示例:
另外,还可以结合Logback进行日志处理,例如我在vehicle-shop-admin\authority\src\main\resources\config\logback-dev.xml中添加一个appender专用于skywalking:
总结:
Skywalking链路监控已为Apache顶级项目,UI界面丰富,监控范围广、维度多,对代码零侵入
,系统性能损失低
,还支持接入 ELK 进行存储展示,喜欢的就赶紧拿去用吧。
全文完!