中間件加強框架之InterceptFramework

前言java

在智能運維中,應用服務所使用的組件及JAR包等相關信息很是重要,這些信息可以清晰地描繪一個應用服務的骨架,咱們稱這些信息爲應用畫像。在UAVStack中,中間件加強框架(MOF)下的InterceptFramework能夠在應用啓動過程當中獲取畫像信息。本文主要介紹InterceptFramework的架構原理和在此基礎上實現的應用畫像數據採集與存儲。git

總體架構github

關鍵技術web

  • Javaassistredis

  • Hookmongodb

關鍵類及功能數據庫

  • 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類具體處理抓取的各種數據。

畫像數據

畫像數據即靜態數據,是在進程啓動時便可獲得的數據,包括操做系統相關的信息、程序相關的信息、程序啓動後相關的初始化信息。

2
畫像數據主要包括服務畫像、溯源感知畫像和客戶端畫像三部分,如上圖所示。如下分別從這三個方面介紹畫像採集:

服務畫像採集

3

服務畫像描述了服務本體的信息,包括應用惟一標識(AppID)、服務名(Service ID)、服務實例的URI、服務接口的URI、服務接口的元數據(類、方法、入參出參、註解、部署描述符)。

以Tomcat爲例,應用的啓動過程須要通過StandardContext的start方法。咱們能夠在此方法的最後植入代碼邏輯進行攔截,經過攔截能夠獲取到如下信息:

  1. 應用名、webworkdir(工做目錄)、servletcontext、contextpath、basepath(應用實際路徑)等容器上下文信息;
  2. 根據相應的技術規範(Servlet、JAXRS、JAXWS、Spring等)獲取畫像數據,主要包括:經過反射的方式獲取類和方法名以及出參入參信息、掃描註解類、獲取註解信息、解析部署描述符文件(web.xml等)信息。

服務畫像除了獲取以上信息外,還獲取應用的日誌路徑和所用JAR包等信息。

溯源畫像採集

3
溯源畫像採集主要藉助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.

    3

DataObserver提供了JMX和HTTP兩種模式來暴露接口畫像數據,這一點與實時數據相似,在咱們MOF系列的兄弟篇《中間件增長框架之CaptureFramework》中已經詳細介紹過,在此處再也不贅述。


讀完這篇文章,相信你們對中間件增長框架InterceptFramwork和應用畫像實現過程有了必定的認識。後續咱們將繼續爲你們推送更多UAV技術乾貨,敬請期待!

官方網站

開源地址

UAVStack已在Github上開放源碼,並提供了安裝部署、架構說明和用戶指南等雙語文檔,歡迎訪問-給星-拉取~~~

掃一掃下方二維碼,關注一個不會讓你失望的公衆號

4
相關文章
相關標籤/搜索