從零開始帶你上手體驗Sermant自定義外掛開發

华为云开发者联盟發表於2024-07-03

本文分享自華為雲社群《Sermant自定義外掛開發上手體驗》,作者:華為雲開源。

一、研究緣由

由於目前我們所處的行業是汽車行業,專案上進行雲服務的遷移時使用到了Sermant中的相關外掛, 為了加深對Sermant開發和執行機制的瞭解,我們從零開始體驗Sermant自定義外掛的開發。

下面我們就Sermant-example中的first-plugin-demo來進行研究說明。

二、下載Sermant-example

首先我們下載sermant-example的demo:

從零開始帶你上手體驗Sermant自定義外掛開發

下載完成之後,我們從最簡單的自定義外掛開始,也即first-plugin-demo。

三、執行打包

對first-plugin-demo執行打包,打完包的結構:

從零開始帶你上手體驗Sermant自定義外掛開發

可以看到我們的專案和對應的外掛模板專案都在裡面了。

四、啟動專案

java -javaagent:sermant-agent.jar -jar Application.jar

然後訪問controller方法

從零開始帶你上手體驗Sermant自定義外掛開發

從而可以看到攔截的效果:

從零開始帶你上手體驗Sermant自定義外掛開發

可以看到啟動的過程中,完成了攔截的效果。

也即它走了攔截器的前置和後置方法。

從零開始帶你上手體驗Sermant自定義外掛開發

五、動態配置驗證

從零開始帶你上手體驗Sermant自定義外掛開發

配置的動態配置裡面配置的配置中心是zookeeper,因此我們在啟動專案前需要啟動一個zookeeper作為配置中心,同時開啟動態配置開關。

完成之後,我們需要在相應的監聽節點下建立一個配置項,來測試動態配置的功能:

從零開始帶你上手體驗Sermant自定義外掛開發

再次進行訪問,可以在控制檯看到如下效果:

從零開始帶你上手體驗Sermant自定義外掛開發

也即完成了動態配置的功能。而我們可以看到

從零開始帶你上手體驗Sermant自定義外掛開發

其實質是建立了配置監聽器,實現了配置處理的process方法,其中DynamicConfigEvent就是監聽到的配置更改的事件,包含了配置的group,key,content等配置資訊。實現動態配置的相關實現是呼叫了自己實現的process方法,基於map對配置進行儲存和處理,從而實現配置切換。

六、全流程中的引數argsMap到底是什麼

之前一直很好奇配置裡面的資訊到底是什麼,最近debug之後有所發現。

我們可以看到載入的argMap裡面的相關引數:

從零開始帶你上手體驗Sermant自定義外掛開發

我們可以看到argsMap裡面的引數基本上和上面的配置,同時會載入外掛裡面的配置資訊。完成這些操作之後,就可以在全流程中去完成對應資訊的載入了。

ConfigManager.initialize(argsMap) ,主要是解析一些配置,由於配置存在yaml和properties等不同的形式,因此這裡採用策略模式來進行解析。主要的相關配置資訊可以參考BaseConfig這個介面的實現。

七、外掛的載入是在plugins.yaml

外掛的載入是在plugins.yaml裡面配置的,比如我們自定義的外掛:

從零開始帶你上手體驗Sermant自定義外掛開發

而實現外掛的關鍵在於plugins.yaml中配置了哪些外掛。因為這些外掛正是後續進行攔截的基礎。也即它告訴了程式,需要載入哪些外掛,不需要載入哪些外掛。有了這個基礎,才會進行後面精準的轉換、installOn操作。

八、攔截原理

我們可以看到上面控制檯列印的攔截資訊,那如何實現攔截的呢?

可以看到我們執行first-plugin-demo這個示例的時候:會發現我們執行業務方法的時候,它就會進行織入攔截器,執行對應的onMethodEnter和方法執行完後的onMethodExit方法。

從零開始帶你上手體驗Sermant自定義外掛開發

這兩個方法和byte-buddy中的使用實現的功能是類似的。在需要攔截的方法中執行織入的邏輯。

同時可以從控制檯debug中的資訊可以看到呼叫的情況:

從零開始帶你上手體驗Sermant自定義外掛開發

完成上面的呼叫之後,我們便可以看到控制檯輸出的資訊了。

這裡我們以進入方法為例,來進行說明:

從零開始帶你上手體驗Sermant自定義外掛開發

可以看到進入對應的織入方法之後,最終會走到我們需要進行擴充套件的迭代器中,來實現迭代。

從零開始帶你上手體驗Sermant自定義外掛開發

可以看到進入了first-plugin-demo中的外掛攔截:

從零開始帶你上手體驗Sermant自定義外掛開發

完成攔截進入到業務方法中,實現攔截功能的織入。然後進入後置攔截,完成after的攔截邏輯。

參考:

官網:https://sermant.io

倉庫地址:https://github.com/sermant-io/Sermant

Demo倉庫:https://github.com/sermant-io/Sermant-examples

點選關注,第一時間瞭解華為雲新鮮技術~

相關文章