溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

中間件增強框架之InterceptFramework

發(fā)布時間:2020-07-07 01:48:54 來源:網(wǎng)絡(luò) 閱讀:4312 作者:宜信技術(shù) 欄目:軟件技術(shù)

一、前言

在智能運維中,應(yīng)用服務(wù)所使用的組件及JAR包等相關(guān)信息非常重要,這些信息能夠清晰地描繪一個應(yīng)用服務(wù)的骨架,我們稱這些信息為應(yīng)用畫像。在UAVStack中,中間件增強框架(MOF)下的InterceptFramework可以在應(yīng)用啟動過程中獲取畫像信息。本文主要介紹InterceptFramework的架構(gòu)原理和在此基礎(chǔ)上實現(xiàn)的應(yīng)用畫像數(shù)據(jù)采集與存儲。

二、整體架構(gòu)

中間件增強框架之InterceptFramework

2.1 關(guān)鍵技術(shù)

  • Javaassist
  • Hook

2.2 關(guān)鍵類及功能

  • Profile數(shù)據(jù)和客戶端監(jiān)控指標主要通過InterceptSupport和hookProxy機制捕獲和監(jiān)控。
  • Profile也會安裝至DataObserver對象并暴露JMX/HTTP接口。

2.3 攔截之前的準備

  • 在應(yīng)用啟動的特定生命周期內(nèi)改寫字節(jié)碼,植入特定的邏輯處理代碼進行攔截。
  • 攔截框架對應(yīng)的Supporter啟動,從配置文件中獲取應(yīng)該裝載的Listener,構(gòu)建InterceptSupport實例,把Listener添加到InterceptSupport實例中。

2.4 具體的攔截邏輯

在應(yīng)用啟動過程中的特定生命周期,之前植入的代碼攔截邏輯開始執(zhí)行InterceptSupport的doIntercept方法,遍歷已注冊的Listener監(jiān)聽器。每個監(jiān)聽器都繼承自InterceptEventListener類。不同的子Listener對相應(yīng)類型的畫像采集處理:AppProfilingListener負責(zé)監(jiān)聽所有服務(wù)畫像事件,AppFrkHookFactoryListener負責(zé)監(jiān)聽客戶端畫像事件。

三、架構(gòu)說明

  • InterceptSupport:單例作為統(tǒng)一的Profile/Client hook捕獲入口點
  • InterceptContext:捕獲上下文接口, 所有捕獲參數(shù)由Context封裝
  • InterceptEventListener:事件劫持監(jiān)聽器, 所有監(jiān)聽器需繼承并注冊監(jiān)聽
  • AppProfilingListener:服務(wù)畫像監(jiān)聽器, 監(jiān)聽所有服務(wù)畫像事件
  • AppFrkHookFactoryListener:客戶端畫像監(jiān)聽代理

四、關(guān)鍵類說明

  • StandardProfile:實現(xiàn)了Profile接口,是畫像數(shù)據(jù)抓取實現(xiàn)類,提供了doProfiling方法負責(zé)抓取行為和生成抓取結(jié)果;
  • ProfileHandler:不同的抓取邏輯和抓取點的共同接口,實現(xiàn)不同的抓取邏輯;提供了抓取行為的doProfiling方法;
  • StandardProfileRepository:存儲畫像數(shù)據(jù)抓取數(shù)據(jù)結(jié)構(gòu);
  • DataObserver:暴露了JMX/HTTP接口數(shù)據(jù);
  • Profile實時監(jiān)控在從AppProfilingListener類調(diào)用startProfiling時,將Profile對象安裝到DataObserver對象中;
  • DataObserver提供JMX/HTTP服務(wù),供后續(xù)抓取使用,其中Http服務(wù)注冊了HttpJEEProfileObserver,主要負責(zé)畫像數(shù)據(jù)的抓取服務(wù);
  • 各個Handler類具體處理抓取的各類數(shù)據(jù)。

五、畫像數(shù)據(jù)

畫像數(shù)據(jù)即靜態(tài)數(shù)據(jù),是在進程啟動時即可得到的數(shù)據(jù),包括操作系統(tǒng)相關(guān)的信息、程序相關(guān)的信息、程序啟動后相關(guān)的初始化信息。

中間件增強框架之InterceptFramework

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

5.1 服務(wù)畫像采集

中間件增強框架之InterceptFramework

服務(wù)畫像描述了服務(wù)本體的信息,包括應(yīng)用唯一標識(AppID)、服務(wù)名(Service ID)、服務(wù)實例的URI、服務(wù)接口的URI、服務(wù)接口的元數(shù)據(jù)(類、方法、入?yún)⒊鰠?、注解、部署描述符)?/p>

以Tomcat為例,應(yīng)用的啟動過程需要經(jīng)過StandardContext的start方法。我們可以在此方法的最后植入代碼邏輯進行攔截,通過攔截可以獲取到以下信息:

  • 應(yīng)用名、webworkdir(工作目錄)、servletcontext、contextpath、basepath(應(yīng)用實際路徑)等容器上下文信息;
  • 根據(jù)相應(yīng)的技術(shù)規(guī)范(Servlet、JAXRS、JAXWS、Spring等)獲取畫像數(shù)據(jù),主要包括:通過反射的方式獲取類和方法名以及出參入?yún)⑿畔ⅰ呙枳⒔忸?、獲取注解信息、解析部署描述符文件(web.xml等)信息。

服務(wù)畫像除了獲取以上信息外,還獲取應(yīng)用的日志路徑和所用JAR包等信息。

5.2 溯源畫像采集

中間件增強框架之InterceptFramework

溯源畫像采集主要借助HTTP協(xié)議Header中的字段進行溯源,通過中間件劫持技術(shù)攔截Tomcat中StandardEngineValve的Invoke方法,獲取溯源數(shù)據(jù)。

收集的數(shù)據(jù)有以下幾種:

  • Client Address:直連客戶端IP地址;
  • X-Forwarded-For:如果存在,則為代理路由地址鏈,則直連客戶端為代理服務(wù);
  • Host:表明遠程主機甚至端口信息,如果直連客戶端是代理服務(wù),則Host為代理IP地址和端口;
  • User-Agent:代理描述,可用來區(qū)分瀏覽器還是程序客戶端,還可以提取很多瀏覽器終端信息;
  • UAV-Client-Src:HTTP客戶端劫持加入的Header字段,用于UAV應(yīng)用之間調(diào)用的擬合。

5.3 客戶端畫像采集

中間件增強框架之InterceptFramework

客戶端畫像通過對一系列常用中間件客戶端進行劫持實現(xiàn),目前已支持同步/異步http、數(shù)據(jù)庫jdbc、redis(jedis,aredis,lettuce)、mongodb、rocketmq/rabbitmq/Kafka、ESClient等。

劫持通過javaassist字節(jié)碼改寫、動態(tài)代理等AOP技術(shù),在客戶端調(diào)用代碼中嵌入特定處理邏輯,獲取調(diào)用相關(guān)的信息,如調(diào)用地址、調(diào)用協(xié)議、調(diào)用結(jié)果等。

畫像數(shù)據(jù)基于調(diào)用地址、訪問協(xié)議、調(diào)用結(jié)果的特征提取來確定目標服務(wù)。

1)調(diào)用地址:以類URI格式表示

  • http/https服務(wù)(業(yè)務(wù)/代理服務(wù)):http://
  • 關(guān)系型數(shù)據(jù)庫(數(shù)據(jù)源服務(wù)):jdbc:
  • 非關(guān)系型數(shù)據(jù)庫或緩存(數(shù)據(jù)源服務(wù)):
  • 消息隊列(消息服務(wù)):mq:

2)訪問協(xié)議:某種訪問動作。例如HTTP的POST、SQL插入、發(fā)送/訂閱消息、Redis的hgethashall、Mongo的Collection操作等。

3)訪問結(jié)果特征:服務(wù)的基礎(chǔ)棧類型、是否集群,例如Nginx、Tomcat、Apache等。

  • 以ESClient為例,我們可以劫持TransportService的sendRequest方法,植入我們的攔截代碼邏輯。

與服務(wù)畫像不同的是,客戶端畫像發(fā)生在具體客戶端調(diào)用過程中,并非在應(yīng)用的啟動環(huán)節(jié)。

六、畫像存儲結(jié)構(gòu)

畫像存儲按以下結(jié)構(gòu)分層存儲:

  • StandardProfileRespository存儲某個應(yīng)用的整個畫像;
  • StandardProfileElement存儲某類組件畫像(服務(wù)端、客戶端、日志、jar等);
  • ProfileElementInstance存儲某類組件當中的某一個組件畫像,以服務(wù)組件畫像為例,如:如組件JAXRS、Servlets各為一個ProfileElementInstance,但它們同屬于服務(wù)組件這一StandardProfileElement.

中間件增強框架之InterceptFramework

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

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

作者:李興勝

來源:宜信技術(shù)學(xué)院

向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI