跟我学SpringCloud | 第十六篇:微服务利剑之APM平台(二)Pinpoint

SpringCloud系列教程 | 第十六篇:微服务利剑之APM平台(二)Pinpoint
Springboot: 2.1.7.RELEASE
SpringCloud: Greenwich.SR2
1. Pinpoint概述
Pinpoint是一个由韩国人编写的为大型分布式系统服务的链路跟踪平台,并提供大量链路跟踪数据分析汇总解决方案。自2012年7月开始开发,与2015年1月做为一个开源项目推出。
2. Pinpoint主要特性
- 分布式事务跟踪,跟踪跨分布式应用的消息。
- 自动检测应用拓扑,帮助你搞清楚应用的架构。
- 水平扩展以便支持大规模服务器集群。
- 提供代码级别的可见性以便轻松定位失败点和瓶颈。
- 使用字节码增强技术,添加新功能而无需修改代码。
3. Pinpoint优势
- 无入侵:采用字节码增强技术,新增功能无需修改代码。
- 性能高:对性能的影响非常小(资源使用量最小仅增加3%),异步数据传输,采用UDP协议让出网络连接优先级。
4. Pinpoint架构简介
先看一下官方提供的架构图,如图:

Pinpoint主要包含了4个组件:
- Pinpoint Agent:探针,附加到用于分析的Java服务
- Pinpoint Collector:数据收集组件,部署在Web容器上
- Pinpoint Web UI:数据展示组件,部署在Web容器上
- HBase Storage:数据存储组件
架构图从上往下看,首先是通过Agent组件收集需要的数据,通过UPD/TCP的方式将数据发送给Collector,由Collector将数据分析整理过后存入HBase,通过Web UI组件将分析好的数据从HBase中读出,展示在现代化的UI界面上。
5. Pinpoint数据结构简介
Pinpoint中,核心数据结构由Span, Trace, 和 TraceId组成。
- Span: RPC (远程过程调用/remote procedure call)跟踪的基本单元; 当一个RPC调用到达时指示工作已经处理完成并包含跟踪数据。为了确保代码级别的可见性,Span拥有带SpanEvent标签的子结构作为数据结构。每个Span包含一个TraceId。
- Trace: 多个Span的集合; 由关联的RPC (Spans)组成. 在同一个trace中的span共享相同的TransactionId。Trace通过SpanId和ParentSpanId整理为继承树结构.
- TraceId: 由 TransactionId, SpanId, 和 ParentSpanId 组成的key的集合. TransactionId 指明消息ID,而SpanId 和 ParentSpanId 表示RPC的父-子关系。
- TransactionId (TxId): 在分布式系统间单个事务发送/接收的消息的ID; 必须跨整个服务器集群做到全局唯一.
- SpanId: 当收到RPC消息时处理的工作的ID; 在RPC请求到达节点时生成。
- ParentSpanId (pSpanId): 发起RPC调用的父span的SpanId. 如果节点是事务的起点,这里将没有父span - 对于这种情况, 使用值-1来表示这个span是事务的根span。
6. Pinpoint版本依赖
- Pinpoint所需要的Java版本兼容:
| Pinpoint Version | Agent | Collector | Web |
|---|---|---|---|
| 1.0.x | 6-8 | 6-8 | 6-8 |
| 1.1.x | 6-8 | 7-8 | 7-8 |
| 1.5.x | 6-8 | 7-8 | 7-8 |
| 1.6.x | 6-8 | 7-8 | 7-8 |
| 1.7.x | 6-8 | 8 | 8 |
| 1.8.0 | 6-10 | 8 | 8 |
| 1.8.1+ | 6-11 | 8 | 8 |
- HBase所需要的版本兼容
| Pinpoint Version | HBase 0.94.x | HBase 0.98.x | HBase 1.0.x | HBase 1.2.x | HBase 2.0.x |
|---|---|---|---|---|---|
| 1.0.x | yes | no | no | no | no |
| 1.1.x | no | not tested | yes | not tested | no |
| 1.5.x | no | not tested | yes | not tested | no |
| 1.6.x | no | not tested | not tested | yes | no |
| 1.7.x | no | not tested | not tested | yes | no |
| 1.8.x | no | not tested | not tested | yes | no |
| Pinpoint Version | HBase 0.94.x | HBase 0.98.x | HBase 1.0.x | HBase 1.2.x | HBase 2.0.x |
- Agent - Collector所需要的版本兼容
| Agent Version | Collector 1.0.x | Collector 1.1.x | Collector 1.5.x | Collector 1.6.x | Collector 1.7.x | Collector 1.8.x |
|---|---|---|---|---|---|---|
| 1.0.x | yes | yes | yes | yes | yes | yes |
| 1.1.x | not tested | yes | yes | yes | yes | yes |
| 1.5.x | no | no | yes | yes | yes | yes |
| 1.6.x | no | no | not tested | yes | yes | yes |
| 1.7.x | no | no | no | no | yes | yes |
| 1.8.x | no | no | no | no | no | yes |
| Agent Version | Collector 1.0.x | Collector 1.1.x | Collector 1.5.x | Collector 1.6.x | Collector 1.7.x | Collector 1.8.x |
- Flink所需要的版本兼容
| Pinpoint Version | flink 1.3.X | flink 1.4.X | flink 1.5.X | flink 1.6.X | flink 1.7.X | Pinpoint Version |
|---|---|---|---|---|---|---|
| 1.7.x | yes | yes | no | no | no | 1.7.x |
| 1.8.x | yes | yes | no | no | no | 1.8.x |
| 1.9.x | yes | yes | yes | yes | yes | 1.9.x |
| Pinpoint Version | flink 1.3.X | flink 1.4.X | flink 1.5.X | flink 1.6.X | flink 1.7.X | Pinpoint Version |
| 1.7.x | yes | yes | no | no | no | 1.7.x |
| 1.8.x | yes | yes | no | no | no | 1.8.x |
| 1.9.x | yes | yes | yes | yes | yes | 1.9.x |
7. Spring Cloud与Pinpoint实战
在介绍实战之前,我们先介绍一下Pinpoint部署构建。
笔者构建的一些前置条件:
java:1.8
CentOS:7.6
- HBase部署
存储方式需要使用HBase1.2.x的版本,笔者这里选择的是HBase1.2.6,下载地址为Apache官网,推荐使用有端点续传功能的下载器下载(实在是有点慢),HBase全版本下载地址:http://archive.apache.org/dist/hbase/ ,各位读者选择自己喜欢的版本下载。
下载完成后,将HBase1.2.6放入CentOS的opt目录中,执行如下命令:
tar -xvzf hbase-1.2.6-bin.tar.gz
mv hbase-1.2.6/ /data/service/hbase/
修改hbase中config目录中的JAVA_HOME,将这里的JAVA_HOME修改为自己本地的路径,笔者这里修改如下:
export JAVA_HOME=/opt/jdk1.8.0_221
修改完成后就可以进入hbase的bin目录,启动hbase了,执行如下语句:
./start-hbase.sh
启动成功后,可以执行jps,如果看到有HMaster,可有证明启动成功,如下:
19263 HMaster
也可以打开浏览器访问:http://ip:16010/master-status ,结果如图:

接下来我们先把Pinpoint的HBase的构建脚本导入,进入HBase的bin目录下执行如下语句:
./hbase shell /opt/hbase-create.hbase
数据导入成功我们在HBase的UI界面上可以看到,如图:

后面的目录是笔者用来存放HBase初始化脚本的路径,各位读者可根据情况自行替换,至此,HBase环境准备完成,接下来开始部署Collector和Web UI。
- Collector和Web UI部署
出于简单方便考虑,不推荐初学者自行编译代码进行部署,可以直接使用官方提供的发行版本进行部署。
浏览器访问链接:https://github.com/naver/pinpoint/releases/ ,直接下载当前最新Release版本即可,笔者现在看到的最新版本是1.8.4,如图,需要下载的内容有pinpoint-agent-1.8.4.tar.gz、pinpoint-collector-1.8.4.war和pinpoint-web-1.8.4.war。

首先需要准备两个tomcat,笔者这里下载的tomcat8,解压两份后并重命名为apache-tomcat-pinpoint-collector和apache-tomcat-pinpoint-web。
将apache-tomcat-pinpoint-collector中的config中的server.xml进行修改。
将8005改成18005,8080改成18080,8443改为18443,8009改为18009。
同样也将apache-tomcat-pinpoint-web中的config中的server.xml进行修改。
将8005改成28005,8080改成28080,8443改为28443,8009改为28009。
将apache-tomcat-pinpoint-collector中的webapp/ROOT清空,将pinpoint-collector-1.8.4.war放入并解压。解压完成后就可以进入bin目录使用./startup.sh启动tomcat了,并且使用命令tail -f ../logs/catalina.out观察启动日志是否启动成功。
同样,将apache-tomcat-pinpoint-web中的webapp/ROOT清空,将pinpoint-web-1.8.4.war放入并解压。解压完成后就可以进入bin目录使用./startup.sh启动tomcat了,并且使用命令tail -f ../logs/catalina.out观察启动日志是否启动成功。
当Collector和Web UI都启动成功后,就可以使用打开浏览器访问:http://ip:28080/#/main ,初次访问如图:

- Agent启用
实战案例,本实战案例和上一篇实战案例保持一致,同样是4个服务,包括Zuul-Service、Eureka-Service、Consumer-Service和Provider-Service。具体实现代码本章不再列出,各位读者可以参考上一篇或者Github仓库(https://github.com/meteor1993/SpringCloudLearning/tree/master/chapter15),下面我们介绍Spring Cloud是如何与Pinpoint整合使用的。
接入方式和上一篇的Skywalking是一致的,都是使用探针技术接入应用程序,java -jar的方式来加载Agent探针。
首先在工程的跟目录中执行mvn install,而后在CentOS的opt中新建4个目录,分别存放4个打好包的工程。笔者这里创建的4个目录分别为/opt/project/consumer_service,/opt/project/eureka_service,/opt/project/provider_service和/opt/project/zuul_service,将4个jar包分别放入对应的目录中,并解压刚才我们下载好的pinpoint-agent-1.8.4.tar.gz探针,我们将解压后的探针放在/opt的目录中,接下来,我们使用如下命令,顺次启动4个jar包:
java -javaagent:/opt/pinpoint-bootstrap-1.8.4.jar -Dpinpoint.agentId=consumer-service -Dpinpoint.applicationName=consumer-server -jar /opt/project/consumer_service/consumer-0.0.1-SNAPSHOT.jar
java -javaagent:/opt/pinpoint-bootstrap-1.8.4.jar -Dpinpoint.agentId=eureka-service -Dpinpoint.applicationName=eureka-server -jar /opt/project/eureka_service/eureka-0.0.1-SNAPSHOT.jar
java -javaagent:/opt/pinpoint-bootstrap-1.8.4.jar -Dpinpoint.agentId=provider-service -Dpinpoint.applicationName=provider-server -jar /opt/project/provider_service/provider-0.0.1-SNAPSHOT.jar
java -javaagent:/opt/pinpoint-bootstrap-1.8.4.jar -Dpinpoint.agentId=zuul-service -Dpinpoint.applicationName=zuul-server -jar /opt/project/zuul_service/zuul-0.0.1-SNAPSHOT.jar
上述命令执行完成之后,再打开Web UI查看显示情况。
首先打开浏览器访问:http://192.168.44.129:8080/client/hello?name=spring ,页面正常显示Hello, name is spring,查看Pinpoint的Web UI,如图:

图清楚的显示了我们当前系统的拓扑结构,横线上面的数字代表了调用次数,右边部分,最上面显示的是成功和失败的情况,中间部分显示的是响应时间,下面显示的是加载所使用的时间。
检查器(Inspector):这里已Zuul-Service为例,Timeline显示的是请求的时间段,Information显示的是节点的一些当前信息,包含Application Name、Agent Id、Agent版本、JVM信息、开始时间等。
Heap信息的使用情况,如图:

系统CPU、活动线程、响应时间等信息如图:

更多Pinpoint的信息,读者可以通过官方Demo(http://125.209.240.10:10123/#/main )或者自行构建试验来查看结果,这里不再一一赘述。至此,Spring Cloud和Pinpoint的使用介绍也就完成了。更多有关Pinpoint的信息各位读者可以前往Github的官网进行查阅,地址为:https://github.com/naver/pinpoint 。
8. 小结
这里总结一下整个案例的启动顺序:
- 启动HBase
- 启动collector
- 启动Web-UI
- 启动Agent(Eureka、provider、consumer、zuul)
- 应用调用
- 访问Web-UI查看统计信息
同Skywalking一样,以上启动顺序供各位读者参考,请各位读者最好按照以上顺序启动,因为不同的组件之前其实是有相互依赖关系的,如果随意更改启动顺序可能会造成某些未知问题。至此,Spring Cloud和APM的相关操作就告一段落了。APM可以很好的帮我们理解系统行为,也是分析系统性能的工具,更是发生问题故障的时候利器,可以帮我们快速的定位查找问题。
跟我学SpringCloud | 第十六篇:微服务利剑之APM平台(二)Pinpoint的更多相关文章
- 跟我学SpringCloud | 第十五篇:微服务利剑之APM平台(一)Skywalking
目录 SpringCloud系列教程 | 第十五篇:微服务利剑之APM平台(一)Skywalking 1. Skywalking概述 2. Skywalking主要功能 3. Skywalking主要 ...
- 跟我学SpringCloud | 第十四篇:Spring Cloud Gateway高级应用
SpringCloud系列教程 | 第十四篇:Spring Cloud Gateway高级应用 Springboot: 2.1.6.RELEASE SpringCloud: Greenwich.SR1 ...
- SpringCloud之旅第一篇-微服务概念
一.单体架构的问题 微服务为什么会出现?在学习Springboot的时候知道Springboot极大的简化了我们的开发,我们可以快速的进行业务开发,Springboot单体应用在项目的开发初期能够满足 ...
- Flask最强攻略 - 跟DragonFire学Flask - 第十六篇 Flask-Migrate
终于到了Flask-Migrate,之前在学习Flask-SQLAlchemy的时候,有的同学就提过类似的问题,Flask支持 makemigration / migrate 吗? 答案在这里该诉你, ...
- 跟我学SpringCloud | 第十八篇:微服务 Docker 化之基础环境
1. 容器化 Docker 的横空出世,给了容器技术带来了质的飞跃,Docker 标准化了服务的基础设施,统一了应用的打包分发,部署以及操作系统相关类库等,解决了测试生产部署时环境差异的问题.对于运维 ...
- springcloud(十六):服务网关 zuul 快速入门
服务网关是微服务架构中一个不可或缺的部分.通过服务网关统一向外系统提供REST API的过程中,除了具备服务路由.均衡负载功能之外,它还具备了权限控制等功能.Spring Cloud Netflix中 ...
- 跟我学SpringCloud | 第十九章:Spring Cloud 组件 Docker 化
前面的文章<跟我学SpringCloud | 第十八篇:微服务 Docker 化之基础环境>我们介绍了基础环境系统和 JRE 的容器化,这一节我们介绍 Spring Cloud 组件的容器 ...
- 解剖SQLSERVER 第十六篇 OrcaMDF RawDatabase --MDF文件的瑞士军刀(译)
解剖SQLSERVER 第十六篇 OrcaMDF RawDatabase --MDF文件的瑞士军刀(译) http://improve.dk/orcamdf-rawdatabase-a-swiss-a ...
- Python之路【第十六篇】:Django【基础篇】
Python之路[第十六篇]:Django[基础篇] Python的WEB框架有Django.Tornado.Flask 等多种,Django相较与其他WEB框架其优势为:大而全,框架本身集成了O ...
随机推荐
- C#8.0 中使用默认接口成员更新接口
连载目录 [已更新最新开发文章,点击查看详细] 从 .NET Core 3.0 上的 C# 8.0 开始,可以在声明接口成员时定义实现. 最常见的方案是安全地将成员添加到已经由无数客户端发布并使 ...
- MySQL 5.7和8.0性能测试
目录 背景 前提 环境 测试 双1模式下 0 2 模式下 结论 背景 测试mysql5.7和mysql8.0 分别在读写.只读.只写模式下不同并发时的性能(tps,qps) 前提 测试使用版本为mys ...
- C#中Tuple的使用
鉴于MSDN上面的机器翻译实在太烂,还是自己翻译吧,虽然麻烦了点(-_-). 定义:元组是具有 特定数量和序列 的元素 的数据结构 (注意断句哈!) 元组通常有四种使用方式︰ 一.表示一组数据 例如 ...
- Linux文件系统损坏导致无法正常启动与fsck修复工具
今天在打开自己的虚拟机学习的时候,发现在文件系统检查过程中出现以下的报错: /dev/mapper/VolGroup-lv_root:UNEXPECTED INCONSISTENCY;RUN fsck ...
- Hadoop自学系列集(一) ---- 使用VMware安装CentOS
1.概述 笔者的学习环境--在VMware虚拟机下安装四个CentOS系统(搭建Hadoop集群用),其中一个为Master,三个为Slave,Master作为Hadoop集群中的NameNode, ...
- Codis与RedisCluster的原理详解
背景介绍 我们先来看一下为什么要做集群,如果我们要部署一个单节点Redis,很明显会遇到单点故障的问题. 首先能想到解决单点故障的方法,就是做主从,但是当有海量存储需求时,单一的主从结构就会出问题,说 ...
- Git 学习笔记之(一) 使用 git gui 从github上下载代码
背景: 目前一些开源代码均在 GitHub上管理的,包括自己写的代码也可以放在上面进行管理.但问题是,当你换一台电脑,想要将你自己放在 GitHub 上的代码工程下载下来的时候,会遇到各种问题,目前可 ...
- spring boot 学习笔记(一)之前端文件配置
一.叙述 spring boot 由于是内置的tomcat ,因此其在独立运行的时候,是不需要单独安装 tomcat,这使其前端文件(CSS.JS.html)等放置的位置与war中的不同. 二.常见配 ...
- 【POJ - 2456】Aggressive cows(二分)
Aggressive cows 直接上中文了 Descriptions 农夫 John 建造了一座很长的畜栏,它包括N (2 <= N <= 100,000)个隔间,这些小隔间依次编号为x ...
- kubeadm源码分析
k8s离线安装包 三步安装,简单到难以置信 kubeadm源码分析 说句实在话,kubeadm的代码写的真心一般,质量不是很高. 几个关键点来先说一下kubeadm干的几个核心的事: kubeadm ...