微服务之分布式跟踪系统(springboot+pinpoint)

摘要:
背景随着项目中微服务的发展,微服务的数量逐渐增加,服务之间的调用变得越来越复杂。我们迫切需要一个APM工具来帮助我们监控每个服务的性能并跟踪服务之间的调用。在研究了几个开源APM工具之后,我们最终选择了pintpoint。简单效果实用集成包装项目使用了精确定位1.6.2,官方网站已经更新。目前,功能已经足够,没有计划进行更新。如果问题发生在精确定位中,则会影响应用程序。

这篇文章介绍一下在微服务(springboot开发)的项目中使用pintpoint监控的过程及效果展示。

背景

随着项目微服务的进行,微服务数量逐渐增加,服务间的调用也越来越复杂,我们急切需要一个APM工具帮我们监控各个服务的性能及对服务间的调用进行跟踪,而通过调研多个开源APM工具后,最终我们选择了pintpoint。github地址是:pinpoint, 选择它有4个方面原因:

  1. pinpoint是基于java开发的,利于项目后期对源代码的修改
  2. 集成pinpoint不需要修改一行代码
  3. pinpoint有非常直观的UI,符合项目的当前需求
  4. pinpoint的社区还是挺活跃,一般提问题第二天就有项目的committer回复

Pinpoint

简介

Pinpoint是一个开源的 APM (Application Performance Management/应用性能管理)工具,用于基于java的大规模分布式系统。在使用上力图简单高效,通过在启动时安装agent,不需要修改哪怕一行代码,最小化性能损失(3%).

微服务之分布式跟踪系统(springboot+pinpoint)第1张

盗用一张官网上的图,通过源码你也能发现,pinpoint包含3个主要的组件:

  • Collector, 收集应用中agent发送的数据并存储到Hbase中
  • Agent,  是和应用一起启动的和应用共享JVM,定时发送数据给Collector
  • Web UI, 从hbase中读取数据并展示给用户,之后会有demo展示其功能

支持的模块

  • JDK 6+
  • Tomcat 6/7/8, Jetty 8/9
  • Spring, Spring Boot
  • Apache HTTP Client 3.x/4.x, JDK HttpConnector, GoogleHttpClient, OkHttpClient, NingAsyncHttpClient
  • Thrift Client, Thrift Service
  • MySQL, Oracle, MSSQL, CUBRID, DBCP, POSTGRESQL
  • Arcus, Memcached, Redis
  • iBATIS, MyBatis
  • gson, Jackson, Json Lib
  • log4j, Logback

分布式追踪原理

pinpoint的实现是基于Google Dapper论文,Google dapper提出了一个简单的解决方案来解决分布式追踪的问题。这个解决方案通过在发送消息时添加应用级别的标签作为消息之间的关联。例如,在HTTP请求中的HTTP header中为消息添加一个标签信息并使用这个标签跟踪消息。

如下图所示,在微服务之间的一次请求过程,请求经过的每个节点时都会生成一组TxId,SpanId,pSpanId并发送到collector中,TxId体现了三次不同的RPC作为单个事务被相互关联,同时Pinpoint可以通过SpanId,pSpanId发现关联的n个Span,并将这n个span排列为继承树结构。

微服务之分布式跟踪系统(springboot+pinpoint)第2张

简单效果

微服务之分布式跟踪系统(springboot+pinpoint)第3张

实战集成

打包

项目使用的是pinpoint 1.6.2, 官网已经有更新了,目前功能够用,不打算更新。

  • 在打包之前你需要将jdk6,jdk7,jdk8在要打包的机器上装好,通过下面3个命令export出来,我也不知道为什么打包这个需要装3个版本的jdk, 确实有点反人类。

export JAVA_8_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_112.jdk/Contents/Home

export JAVA_6_HOME=/System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home

export JAVA_7_HOME=/Library/Java/JavaVirtualMachines/jdk1.7.0_80.jdk/Contents/Home

  • 将代码从github中clone下来,打开agent/src/main/resoucrs-local/pinpoint.config,修改如下几点,resource-release下的文件也是一样
  1. profiler.collector.ip=collector部署的机器ip
  2. profiler.sampling.rate=10 ## 按照10%概率抽样
  • 打开web/src/main/resources/hbase.properties, 修改hbase的连接地址:

hbase.client.host=hbase地址
hbase.client.port=hbase端口

  • 打开collector/src/main/resources/hbase.properties, 修改hbase的连接地址:

hbase.client.host=hbase地址
hbase.client.port=hbase端口

  • 在主目录下输入mvn package -DskipTests=true打包, 会生成下面3个重要的文件,留好它们后面需要用

web/target/pinpoint-web-1.6.2.war

collector/target/pinpoint-collector-1.6.2.war

agent/target/pinpoint-agent-1.6.2.tar.gz

部署collecor和web

下载最新的tomcat,解压缩将上面的war包部署到webapps目录下,如下是部署的例子,其中

  • portal部署文件: ROOT.war, 这个是由build打包过程中的web/target/pinpoint-web-1.6.2.war重命名而来
  • collector部署文件:collector.war这个是由build打包过程中的collector/target/pinpoint-collector-1.6.2.war重命名而来

微服务之分布式跟踪系统(springboot+pinpoint)第4张

  • 启动tomcat, 检查一下tomcat的log没有错误.

访问tomcat的地址,如果部署正常,则能看见UI,只是目前没有数据

部署agent

由于项目是springboot开发,采用内嵌的tomcat容器,打成jar包后,启动的时候采用如下脚本:

export APPLICATION_NAME=TEST

tar xvf pinpoint-agent.tar.gz

exec java -jar -Xms768m -Xmx768m -javaagent:./pinpoint-bootstrap-1.6.2.jar -Dspring.profiles.active=dev -Dpinpoint.agentId=myvm -Dpinpoint.applicationName=$APPLICATION_NAME xxx.jar

启动后再刷新一下web ui的界面,会发现已经有一个应用的数据显示的。

功能展示

服务响应时间的分布:

微服务之分布式跟踪系统(springboot+pinpoint)第5张

研究特定请求的调用栈:

微服务之分布式跟踪系统(springboot+pinpoint)第6张

优缺点总结

优点:

  • 使用字节码增强(字节码增强和AOP)使得pinpoint不需要现有代码的修改,可以随时切换。
  • 直观的图形化的界面,支持分布式的集群监控,能够对同一个服务不同instance同时记录。
  • 提供报警机制,可以自由定制。
  • 可开发插件定制需要的指标,例如rabbitmq插件。

缺点:

  • 字节码增强技术让应用容易造成风险。如果问题发生在pinpoint中,它会影响应用。
  • 文档目前比较少,社区还没有很活跃。

总结

目前中文文档较少,github上有中文翻译:

https://github.com/naver/pinpoint/wiki#video-clips

https://www.gitbook.com/book/skyao/leaning-pinpoint/details 

点击右上方pdf下载,其中有很好的中文翻译

笔者注:

如何实现追踪?

答:RPC靠字节码增强,增加追踪id

性能损耗是否很大?

答:官网上说损耗在百分之几,可能是一般情况,系统压力不大的情况下。

我们在压力测试环境上使用了pinpont,使用前后的性能损失能达到30%~50%之间,redis的查询增加到几百毫秒。

转载:https://blog.csdn.net/toxie6415176/article/details/80271370

免责声明:文章转载自《微服务之分布式跟踪系统(springboot+pinpoint)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇ACM一些题目经验分享:程序员如何快速定位问题(BUG)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

大型网站技术架构

一、使用缓存减轻数据库的压力,提升网站性能。二八定律,80%的业务访问集中在20%的数据上。 1.缓存在应用服务器上的本地缓存。(Session) 2.缓存在专门的分布式缓存服务器上的远程缓存。可以采用集群的方式,理论上可以做到无限扩充。(Redis、memcached等) 二、使用服务器集群改善网站的并发处理能力。 1.单一服务器无法满足需求时,不要企...

Spring Boot 项目实战(六)集成 Apollo

一、前言 上篇介绍了 Spring Boot 集成 Dubbo,使我们的系统打下了分布式的基础。随着程序功能的日益复杂,程序的配置日益增多:各种功能开关、参数配置、服务器地址等;对程序配置的期望值也越来越高:配置修改后实时生效,灰度发布,分环境、分集群管理配置,完善的权限、审核机制等;在这样的大环境下,传统的通过配置文件、数据库等方式已经越来越无法满足开发...

fastdfs分布式文件系统部署

前言 传统web站点部署大部分都是基于动静分离的方式,静态图片存放于一台nfs存储。但是这种架构有一个问题就是nfs存储是单点,而且如果图片量过大的时候,则nfs会成为性能短板。基于此可以采用分布式存储的替代方案来替代nfs。 fastdfs不但可以存储图片,还可以存储其他非结构化数据,其特性是可以存放海量的中小容量文件,而且性能和容量也不会成为瓶颈。 f...

【学习】026 Zookeeper

什么Zookeeper Zookeeper是一个分布式开源框架,提供了协调分布式应用的基本服务,它向外部应用暴露一组通用服务——分布式同步(Distributed Synchronization)、命名服务(Naming Service)、集群维护(Group Maintenance)等,简化分布式应用协调及其管理的难度,提供高性能的分布式服务。ZooKe...

深度分析:高并发系统架构设计原理,史上最全系列!

架构设计是一系列相关的抽象模式,是人们对一个结构内的元素及元素间关系的一种主观映射的产物。 一、计算机网络基础 A. OSI模型 OSIOpen System Interconnection,简称OSI模型或七层模型。开放系统互连参考模型,是国际标准化组织(ISO)和国际电报电话咨询委员会(CCITT)联合制定的开放系统互连参考模型,为开放式互连信息系统...

Linux下Jmeter分布式部署

一.JDK安装和环境变量配置 1.准备JDk包,或者直接通过wget安装   wget --no-check-certificate --no-cookies --header “Cookie: oraclelicense=accept- securebackup-cookie” https://download.oracle.com/otn/java/j...