中介軟體增強框架之InterceptFramework
一、前言
在智慧運維中,應用服務所使用的元件及JAR包等相關資訊非常重要,這些資訊能夠清晰地描繪一個應用服務的骨架,我們稱這些資訊為應用畫像。在UAVStack中,中介軟體增強框架(MOF)下的InterceptFramework可以在應用啟動過程中獲取畫像資訊。本文主要介紹InterceptFramework的架構原理和在此基礎上實現的應用畫像資料採集與儲存。
二、整體架構
2.1 關鍵技術
- Javaassist
- Hook
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類具體處理抓取的各類資料。
五、畫像資料
畫像資料即靜態資料,是在程式啟動時即可得到的資料,包括作業系統相關的資訊、程式相關的資訊、程式啟動後相關的初始化資訊。
畫像資料主要包括服務畫像、溯源感知畫像和客戶端畫像三部分,如上圖所示。以下分別從這三個方面介紹畫像採集:
5.1 服務畫像採集
服務畫像描述了服務本體的資訊,包括應用唯一標識(AppID)、服務名(Service ID)、服務例項的URI、服務介面的URI、服務介面的後設資料(類、方法、入參出參、註解、部署描述符)。
以Tomcat為例,應用的啟動過程需要經過StandardContext的start方法。我們可以在此方法的最後植入程式碼邏輯進行攔截,透過攔截可以獲取到以下資訊:
- 應用名、webworkdir(工作目錄)、servletcontext、contextpath、basepath(應用實際路徑)等容器上下文資訊;
- 根據相應的技術規範(Servlet、JAXRS、JAXWS、Spring等)獲取畫像資料,主要包括:透過反射的方式獲取類和方法名以及出參入參資訊、掃描註解類、獲取註解資訊、解析部署描述符檔案(web.xml等)資訊。
服務畫像除了獲取以上資訊外,還獲取應用的日誌路徑和所用JAR包等資訊。
5.2 溯源畫像採集
溯源畫像採集主要藉助HTTP協議Header中的欄位進行溯源,透過中介軟體劫持技術攔截Tomcat中StandardEngineValve的Invoke方法,獲取溯源資料。
收集的資料有以下幾種:
- Client Address:直連客戶端IP地址;
- X-Forwarded-For:如果存在,則為代理路由地址鏈,則直連客戶端為代理服務;
- Host:表明遠端主機甚至埠資訊,如果直連客戶端是代理服務,則Host為代理IP地址和埠;
- User-Agent:代理描述,可用來區分瀏覽器還是程式客戶端,還可以提取很多瀏覽器終端資訊;
- UAV-Client-Src:HTTP客戶端劫持加入的Header欄位,用於UAV應用之間呼叫的擬合。
5.3 客戶端畫像採集
客戶端畫像透過對一系列常用中介軟體客戶端進行劫持實現,目前已支援同步/非同步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.
DataObserver提供了JMX和HTTP兩種模式來暴露介面畫像資料,這一點與實時資料類似,在我們MOF系列的兄弟篇《中介軟體增加框架之CaptureFramework》中已經詳細介紹過,在此處不再贅述。
開源地址:開源地址:
作者:李興勝
來源:宜信技術學院
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69918724/viewspace-2654091/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 中介軟體增強框架之-CaptureFramework框架框架APTFramework
- 中介軟體之訊息中介軟體-pulsar
- Express框架(二)—— 中介軟體Express框架
- Django框架之中介軟體引入Django框架
- Django框架之中介軟體思想Django框架
- PHP 框架中介軟體實現PHP框架
- MySQL中介軟體之ProxySQLMySql
- 訊息中介軟體之ActiveMQMQ
- Koajs中介軟體之next(二)JS
- Koajs中介軟體之context(三)JSContext
- Mac滑鼠增強軟體:BettertouchtoolMac
- Bettertouchtool for Mac(滑鼠增強軟體)Mac
- Redis中介軟體與Web中介軟體RedisWeb
- 如何開發一個框架或中介軟體框架
- 學習Node須知——中介軟體框架Connect框架
- 解析訊息中介軟體之RabbitMQMQ
- redux中介軟體之redux-thunkRedux
- go的web框架gin的使用(八):中介軟體GoWeb框架
- 常見訊息中介軟體之RocketMQMQ
- 常見訊息中介軟體之ActiveMQMQ
- 「Go框架」深入理解web框架的中介軟體執行機制Go框架Web
- Smooze for Mac滑鼠增強輔助軟體Mac
- 初識NodeJS-使用Express框架路由和中介軟體NodeJSExpress框架路由
- 中介軟體漏洞
- 中介軟體-NginxNginx
- ThinkPHP 中介軟體PHP
- MySQL中介軟體MySql
- django中介軟體Django
- golang 中介軟體Golang
- 中介軟體整理
- redux中介軟體Redux
- Laravel 中介軟體Laravel
- 中介軟體(middleware)
- Django——中介軟體Django
- 訊息型中介軟體之RabbitMQ叢集MQ
- MySQL中介軟體之ProxySQL(14):ProxySQL+PXCMySql
- 什麼是中介軟體?Linux常用中介軟體都有哪些?Linux
- 觸控板增強軟體哪款好用?