现在系统基本都是微服务架构,对于复杂微服务链路调用如下问题如何解决?
为了解决分布式应用、微服务系统面临的这些挑战,APM系统(Application Performance Management,即应用性能管理,简单来说就是应用监控)为之诞生,核心满足微服务系统监控的三要素如下:
早在在 2010 年 4 月谷歌发表了一篇论文《Dapper, a Large-Scale Distributed Systems TracingInfrastructure》阐述分布式追踪的概念,OpenTracing用于分布式跟踪和上下文传播的一致的、表达的、提供了一个标准的与供应商无关的api框架,这意味着如果开发者想要尝试一种不同的分布式追踪系统,开发者只需要简单地修改Tracer配置即可,而不需要替换整个分布式追踪系统;OpenTracing API目前也支持众多语言。了解OpenTracing API可以有利于更好学习本篇的主角SkyWalking。
OpenTracing GitHub地址 https://github.com/opentracing
OpenTracing 官方地址 https://opentracing.io/
目前市面上开源的APM系统主要有CAT、Zipkin、Pinpoint,大都是参考Google的Dapper实现的
Apache SkyWalking 官网地址 https://skywalking.apache.org/ 最新版本9.1.0
Apache SkyWalking 文档地址 https://skywalking.apache.org/docs/
Apache SkyWalking v9.1.0文档地址 https://skywalking.apache.org/docs/main/v9.1.0/readme/
Apache SkyWalking GitHub源码地址 https://github.com/apache/skywalking
Apache SkyWalking用于分布式系统的应用程序性能监控工具,特别为微服务、云本地和基于容器(Kubernetes)架构设计。Service Mesh和FaaS已就绪,内置服务网格和FaaS可观察性,收集和分析Istio + Envoy Service Mesh和OpenFunction作为FaaS平台的数据。
SkyWalking基本可以满足对于分布式系统APM的所有需要的功能,功能非常强大、性能表现优秀、对业务代码无侵入, 增长势头强劲,社区活跃,中文文档齐全,支持多语言探针, SkyWalking 支持Dubbo、gRPC、SOFARPC 等很多框架,包含了云原生架构下的分布式系统的监控、跟踪、诊断、日志记录功能,可以在浏览器上观察分布式系统应用程序发生的一切。
核心功能
特点
SkyWalking是一个开源的可观测平台的APM系统,用于收集、分析、聚合和可视化来自服务和云原生基础设施的数据。SkyWalking提供了一种简单的方式来维护分布式系统的清晰视图,甚至跨云。它是一个现代化的APM,专门为本地云、基于容器的分布式系统设计。
SkyWalking涵盖了所有3个可观察性领域,包括跟踪、指标和日志:
使用skywalk,用户可以了解服务和端点之间的拓扑关系,查看每个服务/服务实例/端点的指标,设置告警规则。SkyWalking逻辑上分为四个部分:探针、平台后端、存储和UI。
# 官网下载最新版本9.1.0
wget https://dlcdn.apache.org/skywalking/9.1.0/apache-skywalking-apm-9.1.0.tar.gz
# 接下文件
tar -xvf apache-skywalking-apm-9.1.0.tar.gz
# 进入目录
cd apache-skywalking-apm-bin/
持久化存储我们选择ES,由于前面有两篇文章都讲过ES部署,一篇使用docker部署,一篇使用二进制文件部署,有兴趣可以前往去看。这里我们就直接使用
SkyWalk部署很简单,部署方式有很多,官方提供二进制、Docker、K8S的部署指引,Docker和K8s部署详细可以查阅官网
# oap-server
docker run --name oap --restart always -d -e SW_STORAGE=elasticsearch -e SW_STORAGE_ES_CLUSTER_NODES=elasticsearch:9200 apache/skywalking-oap-server:9.1.0
# UI
docker run --name oap --restart always -d -e SW_OAP_ADDRESS=http://oap:12800 apache/skywalking-ui:9.1.0
学习则选择二进制部署方式,默认配置可以直接运行,但使用的存储是H2内存数据库,重启后数据丢失,修改oap-server配置文件中存储模式即可, vi config/application.yml
SkyWalk的webapp也即是UI默认的8080端口,这里就不修改
# 启动
sh ./bin/startup.sh
# 启动后skywalking-oap-server会先判断是否有相应的表,没有则创建,创建的表也比较多,需要稍等一会,下面日志已经使用elasticsearch做持久化存储
2022-07-23 10:46:17,966 - org.apache.skywalking.oap.server.starter.config.ApplicationConfigLoader - 118 [main] INFO [] - Provider=elasticsearch config=clusterNodes has been set as 192.168.5.52:9200
访问http://192.168.5.52:8080/ ,出现UI界面,当然9.x比8.x多出很多功能,包括服务网格、函数,可视化能力也是越来越强
# 选择目前最新版本8.11.0
wget https://dlcdn.apache.org/skywalking/java-agent/8.11.0/apache-skywalking-java-agent-8.11.0.tgz
# 解压后skywalk-agent.jar在根目录下,agent.config在config目录下
Agent包目录如下:
使用前面的库存微服务和订单微服务模块,将agent.config 拷贝到两个项目的resources目录下
库存微服务修改agent.config下面两个配置
agent.service_name=${SW_AGENT_NAME:ecom-storage-service}
# Backend service addresses.
collector.backend_service=${SW_AGENT_COLLECTOR_BACKEND_SERVICES:192.168.5.52:11800}
启动jvm参数增加
-javaagent:F:\commoms\skywalking-agent\skywalking-agent.jar
-Dskywalking_config=F:\dev\simple-ecommerce\ecom-storage-service\src\main\resources\agent.config
订单微服务修改agent.config下面两个配置
agent.service_name=${SW_AGENT_NAME:ecom-order-service}
# Backend service addresses.
collector.backend_service=${SW_AGENT_COLLECTOR_BACKEND_SERVICES:192.168.5.52:11800}
启动jvm参数增加
-javaagent:F:\commoms\skywalking-agent\skywalking-agent.jar
-Dskywalking_config=F:\dev\simple-ecommerce\ecom-order-service\src\main\resources\agent.config
启动库存微服务和订单微服务,启动日志中加载agent.config和使用skywalk-agent.jar
访问订单接口,http://localhost:4070/order/create/1000/1001/2 ,访问库存接口http://localhost:4080/list ,在普通服务的Service 页面中查看到两个微服务
在Topology查看微服务之间拓扑关系,可以设置查询的深度
在跟Trace查看跟踪列表信息,选择查询条件,可以切换树结构、表格、统计
点进列表的记录后还可以查看到详细信息,包括使用那个组件都有,但识别不一定很准确
普通服务的Service 页面选择服务如订单服务,显示订单服务的各项概览信息,可切换到实例、断点、拓扑、追踪、性能分析、日志等功能页面
如果想要对项目里的业务方法实现链路追踪,方便排查问题,做法如下,先引入依赖
<dependency>
<groupId>org.apache.skywalking</groupId>
<artifactId>apm-toolkit-trace</artifactId>
<version>8.11.0</version>
</dependency>
然后在业务方法加上@Trace+@Tags注解,如果只需要一个Tag也可以直接@Trace+@Tag
@Override
@GlobalTransactional
@Trace
@Tags({@Tag(key = "order",value = "returnedObj"),
@Tag(key = "param1", value = "arg[0]"),
@Tag(key = "param2", value = "arg[1]")})
public Order create(String userId, String commodityCode, int orderCount) {
String xid = RootContext.getXID();
log.info("order xid:{}",xid);
storageFeignService.deduct(commodityCode,orderCount);
// int i = 1/0;
Order order = new Order();
order.setUserId(userId);
order.setCommodityCode(commodityCode);
order.setCount(orderCount);
order.setMoney(orderCount*10);
orderMapper.insert(order);
return order;
}
重新启动库存和订单微服务,再次访问订单接口,http://localhost:4070/order/create/1000/1001/2
选择服务后再选择相应的功能页面
点击查询详细,这时候就可以查看业务方法的参数值和返回值信息
**本人博客网站 **IT小神 www.itxiaoshen.com