本文分享自華為雲社群《Sermant自定義外掛開發上手體驗》,作者:華為雲開源。
一、研究緣由
由於目前我們所處的行業是汽車行業,專案上進行雲服務的遷移時使用到了Sermant中的相關外掛, 為了加深對Sermant開發和執行機制的瞭解,我們從零開始體驗Sermant自定義外掛的開發。
下面我們就Sermant-example中的first-plugin-demo來進行研究說明。
二、下載Sermant-example
首先我們下載sermant-example的demo:
下載完成之後,我們從最簡單的自定義外掛開始,也即first-plugin-demo。
三、執行打包
對first-plugin-demo執行打包,打完包的結構:
可以看到我們的專案和對應的外掛模板專案都在裡面了。
四、啟動專案
java -javaagent:sermant-agent.jar -jar Application.jar
然後訪問controller方法
從而可以看到攔截的效果:
可以看到啟動的過程中,完成了攔截的效果。
也即它走了攔截器的前置和後置方法。
五、動態配置驗證
配置的動態配置裡面配置的配置中心是zookeeper,因此我們在啟動專案前需要啟動一個zookeeper作為配置中心,同時開啟動態配置開關。
完成之後,我們需要在相應的監聽節點下建立一個配置項,來測試動態配置的功能:
再次進行訪問,可以在控制檯看到如下效果:
也即完成了動態配置的功能。而我們可以看到
其實質是建立了配置監聽器,實現了配置處理的process方法,其中DynamicConfigEvent就是監聽到的配置更改的事件,包含了配置的group,key,content等配置資訊。實現動態配置的相關實現是呼叫了自己實現的process方法,基於map對配置進行儲存和處理,從而實現配置切換。
六、全流程中的引數argsMap到底是什麼
之前一直很好奇配置裡面的資訊到底是什麼,最近debug之後有所發現。
我們可以看到載入的argMap裡面的相關引數:
我們可以看到argsMap裡面的引數基本上和上面的配置,同時會載入外掛裡面的配置資訊。完成這些操作之後,就可以在全流程中去完成對應資訊的載入了。
ConfigManager.initialize(argsMap) ,主要是解析一些配置,由於配置存在yaml和properties等不同的形式,因此這裡採用策略模式來進行解析。主要的相關配置資訊可以參考BaseConfig這個介面的實現。
七、外掛的載入是在plugins.yaml
外掛的載入是在plugins.yaml裡面配置的,比如我們自定義的外掛:
而實現外掛的關鍵在於plugins.yaml中配置了哪些外掛。因為這些外掛正是後續進行攔截的基礎。也即它告訴了程式,需要載入哪些外掛,不需要載入哪些外掛。有了這個基礎,才會進行後面精準的轉換、installOn操作。
八、攔截原理
我們可以看到上面控制檯列印的攔截資訊,那如何實現攔截的呢?
可以看到我們執行first-plugin-demo這個示例的時候:會發現我們執行業務方法的時候,它就會進行織入攔截器,執行對應的onMethodEnter和方法執行完後的onMethodExit方法。
這兩個方法和byte-buddy中的使用實現的功能是類似的。在需要攔截的方法中執行織入的邏輯。
同時可以從控制檯debug中的資訊可以看到呼叫的情況:
完成上面的呼叫之後,我們便可以看到控制檯輸出的資訊了。
這裡我們以進入方法為例,來進行說明:
可以看到進入對應的織入方法之後,最終會走到我們需要進行擴充套件的迭代器中,來實現迭代。
可以看到進入了first-plugin-demo中的外掛攔截:
完成攔截進入到業務方法中,實現攔截功能的織入。然後進入後置攔截,完成after的攔截邏輯。
參考:
倉庫地址:https://github.com/sermant-io/Sermant
Demo倉庫:https://github.com/sermant-io/Sermant-examples
點選關注,第一時間瞭解華為雲新鮮技術~