Sermant に基づくサービス管理プラグインの迅速な開発を説明する例

この記事は、Huawei Cloud オープンソースによる Huawei Cloud コミュニティ「Sermant Framework におけるサービス ガバナンス プラグインのクイック開発および使用ガイド」から共有されたものです。

Sermant は、Java バイトコード拡張テクノロジに基づいたクラウドネイティブのエージェントレス サービス メッシュであり、非侵入型でプラグイン可能であり、高性能です。Sermant コア フレームワークを通じて、ロード バランシング、フロー制御、ラベル ルーティング、ラベル トランスペアレント送信など、さまざまなサービス管理目的のプラグインを簡単に開発できます。この記事では、Sermant に基づいて通話時間をカウントするプラグインを開発し、本番環境にデプロイするために使用する方法をケースを使用して説明します。

1. プラグインの開発

この章では、Sermant が公式に提供するプラグイン開発テンプレートに基づいて、Sermant フレームワークを使用してサービス ガバナンス プラグインを開発するプロセスを完全に示します。

このテンプレート プラグインが実装する必要がある主なタスクは、ホスト アプリケーションのコントローラー インターフェイス メソッドをインターセプトして拡張し、メソッドの実行時間を計算することです。

次に、プラグイン開発のコードパスを開始しましょう。

Sermant はプラグイン開発用のテンプレート コードを公式に提供しており、次の Maven 命令を実行してプルします。

$ mvn Archetype:generate -DarchetypeGroupId=com.huaweicloud.sermant -DarchetypeArtifactId=sermant-template-archetype -DarchetypeVersion=1.2.0 -DgroupId=com.huaweicloud.sermant -Dversion=1.2.0 -Dpackage=com.huaweicloud -DartifactId=最初のプラグイン

cke_157.gif具体的な実装手順と詳細については、Sermant 公式 Web サイトを参照して最初のテンプレート コードによって、プラグイン開発用のプロジェクト構造と pom ファイル構成が事前に設計されているため、プラグイン機能の実装に集中できます。以下に示すコードは、このテンプレートに基づいて開発されました。開発したサンプル コードもSermant -example の first-plugin-demo で提供しています。

1.1 プラグインメインモジュールの開発

プラグインのメイン モジュールはプラグインの主要な実装であり、開発者はこのモジュールでプラグインの拡張ロジックを宣言する必要があります。

プラグインのメイン モジュールは、ホスト アプリケーションのどのクラスをインターセプトするかを決定する必要があります。この記事では、ホスト アプリケーションのインターセプトされたクラスは次のとおりです。

パッケージcom.huaweicloud.template;



@RestController

パブリック クラス コントローラー {

@RequestMapping("sayHello")

public void SayHello(文字列名) throws InterruptedException {

System.out.println("hello " + 名前);

Thread.sleep(5);

}

}

プラグインのメイン モジュールは、時間のかかるsayHello メソッドの実行を計算する拡張ロジックを完了する必要があるため、最初にController クラスのsayHello メソッドをインターセプトしてから、拡張前および拡張後の計算を実行する必要があります。インターセプターのメソッドについて。

template-plugin モジュールに com.huawei.sermant.template パッケージを作成します。このセクションで作成したクラスはすべてこのパッケージ内にあります。

1) com.huaweicloud.sermant.core.plugin.agent.declarer.AbstractPluginDeclarer クラスから継承する TemplateDeclarer クラスを作成します。親クラスの getClassMatcher メソッドと getInterceptDeclarers メソッドをオーバーライドする必要があります。バイトコード拡張インターセプトの宣言に使用されるクラス名とメソッド名、および対応するインターセプター。コード実装の詳細は次のとおりです。

public class TemplateDeclarer extends AbstractPluginDeclarer {

@オーバーライド

public ClassMatcher getClassMatcher() {

// インターセプトする必要があるクラスを照合します。照合メソッドは複数あります。ここでは、照合するクラスの完全修飾名を使用します。

return ClassMatcher.nameEquals("com.huaweicloud.template.Controller" );

}



@オーバーライド

public InterceptDeclarer[] getInterceptDeclarers(ClassLoader classLoader) {

// InterceptDeclarer 配列を返します。各 InterceptDeclarer は、インターセプトする必要があるメソッドとインターセプターを決定します。

新しい InterceptDeclarer[]{ を返します

// インターセプトする必要があるメソッドを照合します。照合メソッドは複数あります。ここではメソッド名を照合に使用します。

InterceptDeclarer.build(MethodMatcher.nameEquals("sayHello"), new TemplateInterceptor())

};

}

}

ClassMatcher クラスと MethodMatcher クラスには複数の一致するメソッドがあり、Sermant 公式 Web サイトでバイトコード

2) TemplateInterceptor クラスを作成します。これは com.huaweicloud.sermant.core.plugin.agent.interceptor.Interceptor インターフェイスを実装する必要があり、インターフェイスの before、after、および onThrow メソッドを書き換えて、拡張前と拡張後を実現します。インターセプトポイントをそれぞれ設定し、拡張および例外処理コードロジックを設定します。コード実装の詳細は次のとおりです。

public class TemplateInterceptor はインターセプターを実装します {



プライベート静的最終文字列 START_TIME = "startTime";



@オーバーライド

public ExecuteContext before(ExecuteContext context) {

context.setLocalFieldValue(START_TIME, System.currentTimeMillis());

System.out.println("記録されたメソッドの実行が開始された時刻");

コンテキストを返します。

}



@オーバーライド

public ExecuteContext after(ExecuteContext context) {

long endTime = System.currentTimeMillis();

長い経過時間 = 終了時間 - (長い) context.getLocalFieldValue(START_TIME);

System.out.println("メソッドの消費時間: " + elapsedTime + "ミリ秒");

コンテキストを返します。

}



@オーバーライド

public ExecuteContext onThrow(ExecuteContext context) {

コンテキストを返します。

}

}

before メソッドでインターセプトされたメソッドの実行の開始時間を記録し、after メソッドでインターセプトされたメソッドの実行時間を計算して、コンソールに出力します。

3) 拡張宣言の SPI 構成を追加し、プロジェクトの template/template-plugin の下のリソース ディレクトリに META-INF/services ディレクトリを追加し、その中に com.huaweicloud.sermant.core.plugin という名前を作成します。 Agent.declaler .PluginDeclarer の SPI ファイルに、バイトコード拡張宣言クラスのクラス名を追加します。

com.huaweicloud.sermant.template.TemplateDeclarer

この時点で、プラグインのメイン モジュールのコード ロジックの開発は完了し、ターゲット クラスのインターセプトを実装し、インターセプトされたクラスのメソッドを拡張しました。

1.2 プラグインのパッケージ化と構造

テンプレート ディレクトリで maven コマンドを実行して、テンプレート プラグインをパッケージ化してビルドします。

mvnクリーンパッケージ

ビルドが完了すると、agent/ ディレクトリが生成されます。具体的なファイル構造は次のとおりです。



§── 共通

§── config Sermant 設定ファイル

§── コア

§── 神様

§── 実装する

§──Application.jar ホスト アプリケーション。独自に開発したアプリケーションと置き換えることができます。

§── sermant-agent.jar Sermant Agent 製品。ホスト アプリケーションによるマウントと使用に使用されます。

━── プラグインパッケージ

└── テンプレート

§── config プラグイン設定ファイル

§── プラグイン プラグイン メインモジュール

└── サービスプラグインサービスモジュール

インターセプトされたメソッドにかかる時間を計算できる簡単なプラグインが完成したので、プラグインの効果を示し始めます。

2. サーマントエージェントの使用

2.1 Sermantエージェントの起動

Sermant はデフォルトで動的構成サービスを有効にします。動的構成サービスをオフにするには、config ディレクトリー内の config.properties ファイルを変更します。

# サービススイッチを動的に構成する

Agent.service.dynamic.config.enable=false

第 1.2 章で構築された製品ディレクトリ「agent/」に入り、ホスト サービスの -javaagent ディレクティブを構成して Sermant Agent をプレメイン モードで起動します。

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

コンソールには次の出力が表示され、Servant Agent がプレメイン モードで正常に起動されたことが示されます。

[2023-1024T17:26:49.049] [情報] ゴッドライブラリを BootstrapClassLoader にロードしています。

[2023-10-24T17:26:49.153] [情報] エージェント引数による引数マップの構築。

[2023-10-24T17:26:49.161] [情報] コア ライブラリを SermantClassLoader にロードしています。

[2023-10-24T17:26:49.162] [情報] サーマント エージェントをロードしています。アーティファクトは次のとおりです: デフォルト

[2023-10-24T17:26:49.740] [情報] サーマントのロードが完了しました。アーティファクトはデフォルトです。

Sermant Agent は、ホスト アプリケーションの実行中に、agentmain メソッドを通じてマウントを実行することもできます。Sermant Agent の使用方法の詳細については、Servant 公式 Web サイトのSermant

2.2 検証

ホスト アプリケーションは Sermant Agent を正常にマウントしました。このセクションでは、プラグイン拡張ロジックが有効かどうかを確認します。

次のコマンドを実行して、ホスト アプリケーション インターフェイス サービスの取得リクエストを開始します。

カール http://127.0.0.1:8080/sayHello?name=lihua

ホスト アプリケーション コンソールによって出力される出力は次のとおりです。

メソッドの実行が開始された時刻が記録されます

こんにちは、リフア

メソッドの所要時間: 20 ミリ秒

エコー:ご冥福をお祈りします!

Sermant Agent がホスト アプリケーションのクラスを正常にインターセプトし、強化されたロジックを実行したことがわかります。

3.サーマントの先進機能

3.1 サーバントバックエンド

Sermant Backendには、Sermantの実行時可観測性機能を提供することを目的として、Sermantデータ処理バックエンドモジュールとフロントエンド情報表示モジュールが含まれており、現在は主にSermant Agentのハートビート情報、報告されたイベントの受信と表示、Webhookプッシュなどの機能が含まれています。

Sermant バックエンドは Sermant Agent と連携して動作します。Sermant Agent はホスト アプリケーションにマウントされ、データ送信側として現在の Sermant Agent のハートビート データ (サービス名、ホスト名、インスタンス ID、バージョン番号、IP、タイムスタンプ、プラグインのマウント情報) とイベントを定期的に送信できます。データ(Servant Agentの起動と停止、コアサービスの起動と停止、バイトコード拡張、ログデータなど)

バックエンドは必須コンポーネントではないため、ユーザーはオンデマンドでデプロイし、 Servant-1.2.0 のリリース パッケージをダウンロードすることでバックエンド コンポーネントを取得できます。リリース パッケージを解凍し、sermant-agent/server/sermant ディレクトリに入り、次のコマンドを実行して Sermant Backend を起動します。

java -jar sermant-backend-1.2.0.jar

ブラウザからアドレスhttp://127.0.0.1:8900/、以下のページが表示されれば Sermant Backend は正常に起動しています。

cke_158.png

Sermant Agent は、Backend を使用する場合、Agent のパラメータを設定する必要があります。エージェント (第 1 章で構築された製品ディレクトリ)/config ディレクトリ内の config.properties ファイルを変更します。

設定項目は次のように変更する必要があります。

# ハートビートサービススイッチをオンにする

Agent.service.heartbeat.enable=true

# ユニファイドゲートウェイサービススイッチをオンにする

Agent.service.gateway.enable=true

Sermant Agent を開始するには、セクション 2.1 を参照してください。開始された Sermant Agent とマウントされたテンプレート プラグインの情報は、バックエンド フロントエンド ページで確認できます。

cke_159.png

バックエンドの詳細については、Sermant 公式 Web サイトにあるSermant

3.2 ログ機能

ログはプログラム開発に欠かせない機能で、プログラムの実行状況や発生した問題などをすぐに知ることができます。

JavaAgent 製品はホスト アプリケーション クラスとの競合や、ログ クラスを使用する際のログ設定の競合が発生しやすいですが、Sermant が構築したログ システムはこの問題を解決します。Sermant ログ システムは、JUL&logback 上に構築されており、プラグイン開発のための完全で柔軟な構成とクラス競合回避ログ ツールを提供します。Servant が提供するログ システムは、構成から実行までホスト マイクロサービスから完全に分離できます。さらに、Sermant バックエンド コンポーネントと組み合わせると、Servant ログ システムは異常イベントの統一された収集とレポートを提供できます。

次に、インターセプトされたメソッドの実行時間をログに記録する必要があります。このセクションでは、Servant が提供するログ システムの使用方法を説明します。

3.2.1 ログの追加

プラグインのメイン モジュールの TemplateInterceptor クラスでプライベート静的定数 LOGGER を定義します。これは、このクラスでのログ構築に使用されます。

// サーマントログクラス

プライベート静的最終ロガー LOGGER = LoggerFactory.getLogger();

次に、このクラスの after メソッドでログを使用して、インターセプトされたメソッドの実行時間を記録します。このログのレベルは INFO です。

LOGGER.info("時間のかかるメソッド: " + elapsedTime);

cke_160.gifSermant ログ システムは、さまざまなレベル (TRACE、DEBUG、INFO、WARN、ERROR) のログを記録して、プログラム動作のさまざまなレベルの監視を実現できます。

詳細については、Sermant の公式 Web サイトにあるログ

3.2.2 ログのデモ

Sermant を起動し、第 2 章の方法に従ってホスト アプリケーションのインターフェイスを呼び出します。

カール http://127.0.0.1:8080/sayHello?name=lihua

logs/sermant/core/app/xxxx-xx-xx ディレクトリに移動して Sermant ログを表示します。「xxxx-xx-xx」はログが記録された時刻です。メソッドの消費時間がログ ファイルに正常に記録されていることがわかります。

[情報] [com.huaweicloud.sermant.template.TemplateInterceptor] [後:45] [http-nio-8080-exec-1] メソッド時間: 20

3.2.3 異常ログの報告

Sermant ログ システムによって均一に収集された警告およびエラー レベルのログは、監視のために Sermant バックエンドにアップロードできます。例外ログを手動で出力し、バックエンドを通じて観察します。

プラグインのメイン モジュールの TemplateInterceptor クラスの before メソッドで警告レベルのログを出力し、after メソッドでエラー レベルのログを出力します。

LOGGER.warning("警告メッセージ");

LOGGER.severe("エラーメッセージ");

config ディレクトリ内の config.properties ファイルを変更して、イベント レポート関連の設定を有効にします。

#イベント系スイッチ

イベント.有効=true

# 警告レベルのログイベント報告スイッチ

イベント.offerWarnLog=true

# エラーレベルログイベント報告スイッチ

イベント.offerErrorLog=true

Sermant を起動し、第 2 章の方法に従ってホスト アプリケーションのインターフェイスを呼び出します。

カール http://127.0.0.1:8080/sayHello?name=lihua

Sermant Backend フロントエンド ページに移動して、報告された例外情報を確認します。

cke_161.png

3.3 動的構成

3.3.1 動的構成の追加

Sermant は動的構成機能を提供し、現在 Zookeeper、Nacos、および Kie を構成センターとしてサポートしています。動的構成機能により、Sermant は動的構成センターによって発行された構成に対して構成管理および監視操作を実行し、豊富で多様なサービス ガバナンス機能を実現できます。このセクションでは、Zookeeper を例として、Servant の動的構成サービスを使用して、拡張ロジックを実行するためのスイッチをこのプラグインに追加する方法を説明します。

まず、プラグインのメイン モジュールの TemplateInterceptor クラスに Map フィールドを追加して、スイッチの状態をシミュレートします。ENABLE_KEY はスイッチの名前であり、スイッチのデフォルトの状態を true に設定します。

private static Final Map<String, Boolean> CONFIG_MAP = new HashMap<>();



プライベート静的最終文字列 ENABLE_KEY = "有効";

{

// スイッチのデフォルト状態は true です

CONFIG_MAP.put(ENABLE_KEY, true);

}

次に、 before メソッドと after メソッドにスイッチを追加します。

if (!CONFIG_MAP.get(ENABLE_KEY)) {

System.out.println("拡張ロジックを実行しない");

コンテキストを返します。

}

次に、スイッチのステータスを動的に変更し、動的構成サービス フィールドを追加し、動的構成サービス クラス インスタンスを取得して、Zookeeper で対応するノードの変更を監視するためのリスナーを登録する必要があります。

// 動的構成サービスクラスのインスタンスを取得します

privatefinalDynamicConfigServicedynamicConfigService=ServiceManager.getService(DynamicConfigService.class);



// Sermant フレームワークによって提供される yaml パーサーを取得します

プライベート最終 YamlConverter コンバーター = OperationManager.getOperation(YamlConverter.class);



{

DynamicConfigService.addConfigListener("テンプレート構成", "サーバント/テンプレートプラグイン",

new DynamicConfigListener() {

@オーバーライド

public void process(DynamicConfigEvent イベント) {

// yaml ファイルを解析してマップに変換します

Optional<Map<String, Object>> ConvertOptional = Converter.convert(event.getContent(), Map.class);

if (convertOptional.isPresent()) {

//スイッチのステータスを変更する

CONFIG_MAP.put(ENABLE_KEY, (boolean) ConvertOptional.get().get(ENABLE_KEY));

}

System.out.println("プラグインの設定項目が変更されました。設定項目の値は次のとおりです: " +event.getContent());

}

});

}

動的構成を使用するには、動的構成サービス スイッチをオンにし、config ディレクトリ内の config.properties ファイルを変更する必要があります。

# サービススイッチを動的に構成する

Agent.service.dynamic.config.enable=true

3.3.2 動的構成のデモ

動的構成サービスを有効にするには、zookeeper をローカルで開始する必要があります。ホスト アプリケーションを起動して Sermant Agent をマウントし、ホスト アプリケーション インターフェイス サービスへの呼び出しを開始します。

カール http://127.0.0.1:8080/sayHello?name=lihua

このとき、スイッチはデフォルトでオンになっており、コンソール出力は次のようになります。

メソッドの実行が開始された時刻が記録されます

こんにちは、リフア

メソッドの所要時間: 23 ミリ秒

動的構成の配信を開始し、/sermant/template-plugin/template-config ノードを作成し、ノードの値を「enable: false」に設定します。

/サーマントを作成する

/sermant/template-plugin を作成する

/sermant/template-plugin/template-config を作成して有効にします: false

ホスト アプリケーション コンソールは次の出力を出力します。

プラグインの設定項目が変更され、設定項目の値はenable: falseとなります。

ホスト アプリケーション インターフェイス サービスを再度呼び出します。

カール http://127.0.0.1:8080/sayHello?name=lihua

拡張ロジックが実行されていないという内容がコンソールに出力され、動的構成が正常に配信されたことがわかります。

拡張ロジックは実行されません

こんにちは、リフア

拡張ロジックは実行されません

動的コンフィグレーションのデモはここで終了ですが、動的コンフィグレーションの詳細については、サーマント公式サイトの動的

4. この章の概要

この記事では、Servant フレームワークに基づいてサービス ガバナンス プラグインを迅速に開発するプロセスと、Servant Agent 製品の使用方法を紹介します。Sermant の基盤となるフレームワークが提供する機能により、独自のニーズを満たすプラグインを簡単に開発できると同時に、Servant のログ システム、動的構成、バックエンド コンポーネントと組み合わせることで、機能を強化できることがわかります。サービス管理プラグインをより正確かつ柔軟な方法で利用できるようになります。Sermant は、Java バイトコード拡張テクノロジをベースにしたエージェントレス サービス グリッドです。非侵入型で、プラグイン可能で、高性能です。この記事が、Sermant 製品を使用したい開発者にとって役立つことを願っています。

サービス ガバナンスの分野に焦点を当てたバイトコード拡張フレームワークとして、Sermant は、高パフォーマンス、スケーラブル、アクセスしやすく、機能が豊富なサービス ガバナンス エクスペリエンスを提供することに尽力し、パフォーマンス、機能、エクスペリエンスに配慮します。各バージョンにありますので、どなたでも広くご参加いただけます。

  • サーマント公式サイト:https: //sermant.io
  • GitHub ウェアハウスのアドレス: https://github.com/huaweicloud/Sermant

クリックしてフォローし、できるだけ早くHuawei Cloudの新しいテクノロジーについて学びましょう~

Microsoft、新しい「Windowsアプリ」を発表 Xiaomi、Xiaomi Velaが完全オープンソース、基盤となるカーネルはNuttX Vite 5 であることを正式発表 Alibaba Cloud 11.12が正式リリース 障害の原因が判明:アクセスキーサービス(アクセスキー)の異常 GitHub レポート: TypeScript が Java に代わって 3 番目に人気になる 言語オペレータの奇跡的な操作 : バックグラウンドでネットワークを切断し、ブロードバンド アカウントを無効にし、ユーザーに光モデムの変更を強制する ByteDance: AI を使用して Linux カーネル パラメータを自動的に調整する Microsoft オープン ソースTerminal Chat Spring Framework 6.1 が正式に GA OpenAI の元 CEO 兼社長の Sam Altman 氏と Greg Brockman 氏が Microsoft に入社
{{名前}}
{{名前}}

おすすめ

転載: my.oschina.net/u/4526289/blog/10150067