29

中间件增强框架之InterceptFramework-wx5c2da66615f74的博客

 4 years ago
source link: https://blog.51cto.com/14159827/2430617
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

在智能运维中,应用服务所使用的组件及JAR包等相关信息非常重要,这些信息能够清晰地描绘一个应用服务的骨架,我们称这些信息为应用画像。在UAVStack中,中间件增强框架(MOF)下的InterceptFramework可以在应用启动过程中获取画像信息。本文主要介绍InterceptFramework的架构原理和在此基础上实现的应用画像数据采集与存储。

二、整体架构

中间件增强框架之InterceptFramework

2.1 关键技术

  • Javaassist

2.2 关键类及功能

  • Profile数据和客户端监控指标主要通过InterceptSupport和hookProxy机制捕获和监控。
  • Profile也会安装至DataObserver对象并暴露JMX/HTTP接口。

2.3 拦截之前的准备

  • 在应用启动的特定生命周期内改写字节码,植入特定的逻辑处理代码进行拦截。
  • 拦截框架对应的Supporter启动,从配置文件中获取应该装载的Listener,构建InterceptSupport实例,把Listener添加到InterceptSupport实例中。

2.4 具体的拦截逻辑

在应用启动过程中的特定生命周期,之前植入的代码拦截逻辑开始执行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类具体处理抓取的各类数据。

五、画像数据

画像数据即静态数据,是在进程启动时即可得到的数据,包括操作系统相关的信息、程序相关的信息、程序启动后相关的初始化信息。

中间件增强框架之InterceptFramework

画像数据主要包括服务画像、溯源感知画像和客户端画像三部分,如上图所示。以下分别从这三个方面介绍画像采集:

5.1 服务画像采集

中间件增强框架之InterceptFramework

服务画像描述了服务本体的信息,包括应用唯一标识(AppID)、服务名(Service ID)、服务实例的URI、服务接口的URI、服务接口的元数据(类、方法、入参出参、注解、部署描述符)。

以Tomcat为例,应用的启动过程需要经过StandardContext的start方法。我们可以在此方法的最后植入代码逻辑进行拦截,通过拦截可以获取到以下信息:

  • 应用名、webworkdir(工作目录)、servletcontext、contextpath、basepath(应用实际路径)等容器上下文信息;
  • 根据相应的技术规范(Servlet、JAXRS、JAXWS、Spring等)获取画像数据,主要包括:通过反射的方式获取类和方法名以及出参入参信息、扫描注解类、获取注解信息、解析部署描述符文件(web.xml等)信息。

服务画像除了获取以上信息外,还获取应用的日志路径和所用JAR包等信息。

5.2 溯源画像采集

中间件增强框架之InterceptFramework

溯源画像采集主要借助HTTP协议Header中的字段进行溯源,通过中间件劫持技术拦截Tomcat中StandardEngineValve的Invoke方法,获取溯源数据。

收集的数据有以下几种:

  • Client Address:直连客户端IP地址;
  • X-Forwarded-For:如果存在,则为代理路由地址链,则直连客户端为代理服务;
  • Host:表明远程主机甚至端口信息,如果直连客户端是代理服务,则Host为代理IP地址和端口;
  • User-Agent:代理描述,可用来区分浏览器还是程序客户端,还可以提取很多浏览器终端信息;
  • UAV-Client-Src:HTTP客户端劫持加入的Header字段,用于UAV应用之间调用的拟合。

5.3 客户端画像采集

中间件增强框架之InterceptFramework

客户端画像通过对一系列常用中间件客户端进行劫持实现,目前已支持同步/异步http、数据库jdbc、redis(jedis,aredis,lettuce)、mongodb、rocketmq/rabbitmq/Kafka、ESClient等。

劫持通过javaassist字节码改写、动态代理等AOP技术,在客户端调用代码中嵌入特定处理逻辑,获取调用相关的信息,如调用地址、调用协议、调用结果等。

画像数据基于调用地址、访问协议、调用结果的特征提取来确定目标服务。

1)调用地址:以类URI格式表示

  • http/https服务(业务/代理服务):http://
  • 关系型数据库(数据源服务):jdbc:
  • 非关系型数据库或缓存(数据源服务):
  • 消息队列(消息服务):mq:

2)访问协议:某种访问动作。例如HTTP的POST、SQL插入、发送/订阅消息、Redis的hgethashall、Mongo的Collection操作等。

3)访问结果特征:服务的基础栈类型、是否集群,例如Nginx、Tomcat、Apache等。

  • 以ESClient为例,我们可以劫持TransportService的sendRequest方法,植入我们的拦截代码逻辑。

与服务画像不同的是,客户端画像发生在具体客户端调用过程中,并非在应用的启动环节。

六、画像存储结构

画像存储按以下结构分层存储:

  • StandardProfileRespository存储某个应用的整个画像;
  • StandardProfileElement存储某类组件画像(服务端、客户端、日志、jar等);
  • ProfileElementInstance存储某类组件当中的某一个组件画像,以服务组件画像为例,如:如组件JAXRS、Servlets各为一个ProfileElementInstance,但它们同属于服务组件这一StandardProfileElement.

中间件增强框架之InterceptFramework

DataObserver提供了JMX和HTTP两种模式来暴露接口画像数据,这一点与实时数据类似,在我们MOF系列的兄弟篇《中间件增加框架之CaptureFramework》中已经详细介绍过,在此处不再赘述。

开源地址:开源地址:https://github.com/uavorg

作者:李兴胜

来源:宜信技术学院


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK