内容简介:本周我们为大家带来中间件增强框架专题(MOF)的最后一篇文章,为大家讲解MOF中的InterceptFramework框架。该框架可以在应用启动过程中获取画像信息,实现应用画像数据采集和存储。在智能运维中,应用服务所使用的组件及JAR包等相关信息非常重要,这些信息能够清晰地描绘一个应用服务的骨架,我们称这些信息为应用画像。在UAVStack中,中间件增强框架(MOF)下的
本周我们为大家带来中间件增强框架专题(MOF)的最后一篇文章,为大家讲解MOF中的InterceptFramework框架。该框架可以在应用启动过程中获取画像信息,实现应用画像数据采集和存储。
前言
在智能运维中,应用服务所使用的组件及JAR包等相关信息非常重要,这些信息能够清晰地描绘一个应用服务的骨架,我们称这些信息为应用画像。在UAVStack中,中间件增强框架(MOF)下的 InterceptFramework 可以在应用启动过程中获取画像信息。本文主要介绍InterceptFramework的架构原理和在此基础上实现的应用画像数据采集与存储。
整体架构
关键技术
- Javaassist
- Hook
关键类及功能
- Profile数据和客户端监控指标主要通过 InterceptSupport 和 hookProxy 机制捕获和监控。
- Profile也会安装至 DataObserver 对象并暴露JMX/HTTP接口。
拦截之前的准备
1.在应用启动的特定生命周期内改写字节码,植入特定的逻辑处理代码进行拦截。
2.拦截框架对应的 Supporter 启动,从配置文件中获取应该装载的 Listener ,构建 InterceptSupport实例 ,把Listener添加到InterceptSupport实例中。
具体的拦截逻辑
在应用启动过程中的特定生命周期,之前植入的代码拦截逻辑开始执行InterceptSupport的 doIntercept 方法,遍历已注册的 Listener 监听器。每个监听器都继承自 InterceptEventListener类 。不同的子Listener对相应类型的画像采集处理: AppProfilingListener 负责监听所有服务画像事件, AppFrkHookFactoryListener 负责监听客户端画像事件。
架构说明
- InterceptSupport: 单例作为统一的Profile/Client hook捕获入口点
- InterceptContext: 捕获上下文接口, 所有捕获参数由Context封装
- InterceptEventListener: 事件劫持监听器, 所有监听器需继承并注册监听
- AppProfilingListener: 服务画像监听器, 监听所有服务画像事件
- AppFrkHookFactoryListener: 客户端画像监听代理
关键类说明
- StandardProfile: 实现了Profile接口,是画像数据抓取实现类,提供了doProfiling方法负责抓取行为和生成抓取结果;
- ProfileHandler: 不同的抓取逻辑和抓取点的共同接口,实现不同的抓取逻辑;提供了抓取行为的doProfiling方法;
- StandardProfileRepository: 存储画像数据抓取数据结构;
- DataObserver: 暴露了JMX/HTTP接口数据;
- Profile实时监控 在从AppProfilingListener类调用startProfiling时,将Profile对象安装到DataObserver对象中;
- DataObserver 提供JMX/HTTP服务,供后续抓取使用,其中Http服务注册了 HttpJEEProfileObserver ,主要负责画像数据的抓取服务;
- 各个 Handler 类具体处理抓取的各类数据。
画像数据
画像数据即静态数据,是在进程启动时即可得到的数据,包括操作系统相关的信息、程序相关的信息、程序启动后相关的初始化信息。
画像数据主要包括服务画像、溯源感知画像和客户端画像三部分,如上图所示。以下分别从这三个方面介绍画像采集:
服务画像采集
服务画像描述了服务本体的信息,包括应用唯一标识(AppID)、服务名(Service ID)、服务实例的URI、服务接口的URI、服务接口的元数据(类、方法、入参出参、注解、部署描述符)。
以Tomcat为例,应用的启动过程需要经过StandardContext的start方法。我们可以在此方法的最后植入代码逻辑进行拦截,通过拦截可以获取到以下信息:
- 应用名、webworkdir(工作目录)、servletcontext、contextpath、basepath(应用实际路径)等容器上下文信息;
- 根据相应的技术规范(Servlet、JAXRS、JAXWS、Spring等)获取画像数据,主要包括:通过反射的方式获取类和方法名以及出参入参信息、扫描注解类、获取注解信息、解析部署描述符文件(web.xml等)信息。
服务画像除了获取以上信息外,还获取应用的日志路径和所用JAR包等信息。
溯源画像采集
溯源画像采集主要借助HTTP协议Header中的字段进行溯源,通过中间件劫持技术拦截Tomcat中StandardEngineValve的Invoke方法,获取溯源数据。
收集的数据有以下几种:
- Client Address: 直连客户端IP地址;
- X-Forwarded-For: 如果存在,则为代理路由地址链,则直连客户端为代理服务;
- Host: 表明远程主机甚至端口信息,如果直连客户端是代理服务,则Host为代理IP地址和端口;
- User-Agent: 代理描述,可用来区分浏览器还是程序客户端,还可以提取很多浏览器终端信息;
- UAV-Client-Src: HTTP客户端劫持加入的Header字段,用于UAV应用之间调用的拟合。
客户端画像采集
客户端画像通过对一系列常用中间件客户端进行劫持实现,目前已支持同步/异步http、数据库jdbc、redis(jedis,aredis,lettuce)、 mongodb 、rocketmq/rabbitmq/Kafka、ESClient等。
劫持通过javaassist字节码改写、动态代理等AOP技术,在客户端调用代码中嵌入特定处理逻辑,获取调用相关的信息,如调用地址、调用协议、调用结果等。
画像数据基于调用地址、访问协议、调用结果的特征提取来确定目标服务。
调用地址: 以类URI格式表示
- http/https服务(业务/代理服务):http://
: / - 关系型数据库(数据源服务):jdbc:<数据库类型>://
: , : /<数据库名> - 非关系型数据库或缓存(数据源服务):<数据源类型>://
: , : /<数据库集合名> - 消息队列(消息服务):mq:<消息中间件类型>://
: /<队列名>
访问协议: 某种访问动作。例如HTTP的POST、 SQL 插入、发送/订阅消息、 Redis 的hgethashall、Mongo的Collection操作等。
访问结果特征: 服务的基础栈类型、是否集群,例如Nginx、Tomcat、Apache等。
以ESClient为例,我们可以劫持TransportService的sendRequest方法,植入我们的拦截代码逻辑。
与服务画像不同的是,客户端画像发生在具体客户端调用过程中,并非在应用的启动环节。
画像存储结构
画像存储按以下结构分层存储:
- StandardProfileRespository存储某个应用的整个画像;
- StandardProfileElement存储某类组件画像(服务端、客户端、日志、jar等);
- ProfileElementInstance存储某类组件当中的某一个组件画像,以服务组件画像为例,如:如组件JAXRS、Servlets各为一个ProfileElementInstance,但它们同属于服务组件这一StandardProfileElement.
DataObserver提供了JMX和HTTP两种模式来暴露接口画像数据,这一点与实时数据类似,在我们MOF系列的兄弟篇《中间件增加框架之CaptureFramework》中已经详细介绍过,在此处不再赘述。
读完这篇文章,相信大家对中间件增加框架InterceptFramwork和应用画像实现过程有了一定的认识。后续我们将继续为大家推送更多UAV技术干货,敬请期待!
以上所述就是小编给大家介绍的《中间件增强框架之InterceptFramework》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- 理解 Koa 框架中间件原理
- golang框架gin中间件的写法
- Koa框架实践与中间件原理剖析
- 【02-中间件】构建go web框架
- Gin 框架系列(三):换个姿势理解中间件
- Gin框架系列03:换个姿势理解中间件
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
精通Spring 4.x
陈雄华、林开雄、文建国 / 电子工业出版社 / 2017-1-1 / CNY 128.00
Spring 4.0是Spring在积蓄4年后,隆重推出的一个重大升级版本,进一步加强了Spring作为Java领域第一开源平台的翘楚地位。Spring 4.0引入了众多Java开发者翘首以盼的基于Groovy Bean的配置、HTML 5/WebSocket支持等新功能,全面支持Java 8.0,最低要求是Java 6.0。这些新功能实用性强、易用性高,可大幅降低Java应用,特别是Java W......一起来看看 《精通Spring 4.x》 这本书的介绍吧!