ShardingSphereソース・マイクロカーネルアーキテクチャを解析(上)

前回の記事我々はSQLParserEntry、インターフェースは工学のorg.apache.shardingsphere.sql.parser.spiパッケージshardingsphere-SQLパーサ-SPIの場所に位置していることをコアインターフェイスを導入しました。我々はまた、複数のSQLParserEntry ShardingSphereがあることに言及し、各データベースは、特定のSQLParserEntryの入手方法のようSQLParserEntry実現を持ち、ShardingSphereはマイクロカーネル(MicroKernelは)アーキテクチャを使用して、今日の話題は、マイクロカーネルアーキテクチャの基本原則を議論することですそしてShardingSphereの応用。

1.なぜマイクロカーネルアーキテクチャを使うのか?

アーキテクチャの設計では、スケーラビリティは、ソフトウェア設計の永遠のテーマです。コールバック、モジュラー、パイプのフィルターを備えた拡張性の高いシステムを実現するために多くの方法があります。スケーラビリティの観点を達成するための戦略からは、プラグインシステムは、目標の追求です。私たちは、発信者が動的に任意のプラグインを入手することができ、それがベースのプラグイン機構を介して設定望んでいる、システムを構築したいと考えています。

我々は、動的ローディング機構とその多くのプログラミング言語を知っています。動的ローディング機構のプログラミング言語に基づいて、我々は、構成時に、プラグインシステム、接続タイプではなく、コンパイル時間を達成することができます。同時に、思考の工場のモデルおよび構成の導入により、我々は、動的ローディング機構のより完全なカスタムパッケージを実現することができます。ここで、我々は、プラグインのマイクロカーネル・モードのシステム・アーキテクチャ・モデルに基づいて実装されるように、アプリケーションアーキテクチャパターンに焦点を当てます。

2.マイクロカーネル・モードとは何ですか?

アプリケーションによってコアプラグに追加機能を追加するために、時には、プラグインアーキテクチャモデル(プラグインアーキテクチャパターン)と称する、以下に示すマイクロカーネル(マイクロカーネル)アーキテクチャパターン構造は、独立した別個の機能を実現することができます。

マイクロカーネルアーキテクチャは、アセンブリすなわちコアシステム(コアシステム)とプラグ(プラグインコンポーネント)は、2つの部分を含みます。マイクロカーネルカーネル・システムは、典型的には、システムの動作に必要な機能の最小セットを提供し、インサートは、強化またはカーネルシステムに余分なトラフィックを展開し、特定のプロセス、追加機能およびカスタム・コードを含む、別個の構成要素です。

マイクロカーネルは、カーネルの合理化バージョンです。コアは通常、層が分離されているシステムサービスと統合され、そのためには、デマンドオプションにスケーラビリティと、より効果的なアプリケーション環境を提供することが可能となる追加されます。マイクロカーネルの設計の使用は、システムが明らかにちょうど新しいモジュールと古いモジュールを交換し、アップグレードされ、あなたは、システム全体のアーキテクチャを変更する必要はありません。

だから何のプラグインですか?プラグは、一般的に以下の成分からなる:(一般にAPIコールと呼ばれる)が露出プラグインターフェースは、内部インサート、プラグ及びプラグ拡張ポイントの構成を実現します。ここで、プラグイン拡張ポイントは、我々は、一般的にSPI(サービスプロバイダインターフェース、サービス・プロバイダ・インタフェース)として設計されました。

マイクロカーネル・モードの性質は、プラグインの管理と調整との間の呼です。それ自体はプラグインの偉大な拡張ポイントのサイズで、全体を交換することができます。プラグインは、あなた自身の小さな粒子サイズの拡張ポイントを提供することができるが。このように、システム全体は、マイクロカーネルに加えて、プラグインの多くは非常に強力なシステムのスケーラビリティを持っています。

3.基本的にはマイクロカーネル・モード:JavaのSPIメカニズム

広く通信フレームワークミナ、網状及びグリズリーを含む、分散サービスフレームワークダボポピュラーに使用されるマイクロカーネルアーキテクチャ、シリアライゼーションヘッション、JSON、トランスポートプロトコル等ダボ、RMIは、式の建築様式です。ShardingSphere内で1 SQLParserEntryを解析SQLについて述べ、そしてシリーズは、データ脱感作ShardingEncryptorための分散プライマリ・キーを生成するための本ShardingKeyGeneratorに後で導入される分散トランザクションShardingTransactionManager用およびデータベースインタフェースRegistryCenterガバナンスのレジストリは、マイクロカーネル・アーキテクチャを使用していました。

マイクロカーネルベースのアーキテクチャは、簡単な構成によって豊かなランタイム環境を構成するこれらの特定の順列と組み合わせを達成することができるようになります。マイクロカーネル・アーキテクチャ・スタイルは、スケーラビリティの問題に対する解決策を提供するために思ったが、またこのアイデアのJDKの実装、すなわちSPI(サービスプロバイダインタフェース)のメカニズムを提供しています。

SPIは、システムは、新しいAPIの実装を提供する必要がある場合、サービス・プロバイダとの使用に開発するためのフレームワークの拡張機能へのインタフェースを提供し、コードをパッケージ化され、その後、我々は、SPIによってJARパッケージまたはフレーム機構を変更せずにAPIを提供することができます新しい実装では、これはメインシナリオのSPI、だけでなく、プラグインのコアの問題に対処する必要があります。

コンテンツファイルのファイル名の完全修飾名を作成することに同意したSPIインタフェースは、APIの実装クラスのMETA-INF /サービス/ディレクトリの完全修飾名です。場合は、プロバイダのサービスのサービス・インターフェースを実装した後、サービス・インターフェースは、同時にジャーパッケージMETA-INF /サービス/ディレクトリ、サービス・インターフェースを実装する具象実装クラスのファイル構成という名前のファイルを作成します。そして、特定の実装クラスは、引数なしのコンストラクタを持たなければなりません。SPI機構の構造を以下に示します。 

そして時に外部プログラムモジュール組立、設定ファイルの読み込みインスタンス化し、完全な注入モジュール内のjarパッケージのMETA-INF /サービス/の名前で特定のカテゴリを検索することができます。あなたは、コードを指定するには、ハードコーディングされたを必要とせずに、実装は、サービス・インターフェースは、契約に基づいていることは良いクラスを見つけることができるようになります。JDKは、クラスjava.util.ServiceLoaderサービスの実装は、SPIメカニズムを実装しようとしているツールを提供しています。

次に、実施例は、Java SPIのプロセスベースの実装を実証します。この例は非常に簡単で、我々は起動するIHelloインターフェースで起動します。

パブリック インターフェース IHello {

    のsayHello();

}

その後、我々は、このインターフェイス上の2つの単純な実装クラスを重視し、以下に示すように、Hello1 Hello2です。

パブリック クラス Hello1 実装 IHello {

  @オーバーライド

  公共 のボイドのsayHello(){

     システム。ERR .println("Hello Worldの--- 1" );

  }

}

パブリック クラス Hello2 実装 IHello {

  @オーバーライド

  公共 のボイドのsayHello(){

     システム。ERR .println("Hello Worldの--- 2" );

  }

}

コードは非常に簡単です、私たちは、プロジェクトのクラスパスがcom.tianyalan.spiであると仮定すると、SPIProviderと呼ばれるプロジェクトでそれらを置きます。サービスの提供者として、私たちはクラスパスの規則に基づいて、META-INF /サービス/フォルダ内のサービス定義ファイルを、提供する必要があり、この時間は、ファイルにのみcom.tianyalan.spi.IHello名前を付けることができます。実証するために、のはHello1は、この文書、すなわちcom.tianyalan.spi.Hello1で先に定義された完全なクラスパスを書いてみましょう。その後、我々は予備のjarパッケージとしてエクスポートプロジェクトを置きます。

行うには、次のものが別の新しい建設コードで、コードの作品は上記で生成され、以下のように主な機能を完了したjarパッケージを参照する必要があります。

パブリック クラスメイン{

    パブリック 静的 ボイドメイン(文字列[] 引数){      

       ServiceLoader <IHello> ローダー= ServiceLoader。負荷(IHello。クラス);      

       (IHello ハローローダ{)

           システム。アウト .println(ハロー.getClass());

           ハロー(.sayHello)。

       }

    }

}

さて、このプロジェクトの役割は、ユーザーのSPIサービスがServiceLoader JDKがすべてIHello実装クラスを取得するためのツールを提供し、ここで使用されていることです。私たちは、この時間ので、我々は唯一のHello1を実現するために取得することができ、唯一のcom.tianyalan.spi.Hello1クラス定義はMETA-INFのjarパッケージ/サービス/ com.tianyalan.spi.IHelloファイルに今あることを知っています。この機能の主な実装は以下のように、我々は出力が得られます。

クラスcom.test.Hello1

こんにちは、世界--- 1

その後、我々はSPIサービス用のMETA-INF /サービス/ com.tianyalan.spi.IHelloファイル、書き込みcom.tianyalan.spi.Hello1とcom.tianyalan.spi.Hello2、および再標識のjarパッケージの内容を調整しますユーザーが参照されています。主な機能が再び実行され、あなたは出力で取得できます。

クラスcom.test.Hello1

こんにちは、世界--- 1

クラスcom.test.Hello2

---世界ハロー2

これまでのところ、SPIプロバイダおよびプレゼンテーションの完成実施のユーザー。この例は非常に単純ですが、それはShardingSphereは、マイクロカーネル・アーキテクチャを実現する基礎です。次に、私たちはトピックがShardingSphere、特定の適用方法ShardingSphere SPIメカニズムを見に切り替え入れましょう。これは、我々は次の議論になるものです。

建築家のプログラマーの移行:私はより多くの公共の数字を集中することができます。

公開された93元の記事 ウォンの賞賛9 ビュー110 000 +

おすすめ

転載: blog.csdn.net/lantian08251/article/details/104494303