第47章 ファブリックコンポーネント


概要

Fabric コンポーネントは、Apache Camel エンドポイントの場所検出メカニズムを実装します。このメカニズムを使用して、エンドポイントのクラスター上で負荷分散を提供することもできます。クライアント側(プロデューサーエンドポイント)では、エンドポイントは抽象 ID で表され、実行時に ID は特定のエンドポイント URI に解決されます。URI は(Fuse Fabric によって提供される)分散レジストリーに格納されるため、デプロイ時にトポロジーを動的に指定できる柔軟なアプリケーションを作成できます。

Dependencies

Fabric コンポーネントは、ファブリックが有効な Red Hat JBoss Fuse コンテナーのコンテキストでのみ使用できます。fabric-camel 機能がインストールされていることを確認する必要があります。Fabric のコンテキストでは、該当するプロファイルに追加して機能をインストールします。たとえば、my-master-profile というプロファイルを使用している場合は、以下のコンソールコマンドを入力して fabric-camel 機能を追加します。
karaf@root> fabric:profile-edit --features fabric-camel my-master-profile
Copy to Clipboard Toggle word wrap
注記
fabric コンポーネントを適切に使用するには、fabric-zookeeperfabric-commands などのプロファイルを追加してください。ただし、jetty エンドポイントを使用している場合は、camel-jetty 機能を含めます。

URI 形式

ファブリックエンドポイントには、以下の URI 形式があります。
fabric:ClusterID[:PublishedURI[?Options]]
Copy to Clipboard Toggle word wrap
URI の形式は、コンシューマーエンドポイントまたはプロデューサーエンドポイントを指定するために使用されるかどうかによって異なります。
Fabric コンシューマーエンドポイント の場合、URI 形式は次のとおりです。
fabric:ClusterID:PublishedURI[?Options]
Copy to Clipboard Toggle word wrap
指定した URI PublishedURI がファブリックレジストリーに公開され、ClusterId クラスターに関連付けられます。オプション Options はコンシューマーエンドポイントインスタンスの作成時に使用されますが、オプションはファブリックレジストリーの PublishedURI で公開され ません
Fabric プロデューサーエンドポイント の場合、URI 形式は次のとおりです。
fabric:ClusterID
Copy to Clipboard Toggle word wrap
クライアントはファブリックレジストリーで ID ClusterId を検索し、接続する URI を検出します。

URI オプション

Fabric コンポーネント自体は URI オプションをサポートし ません。ただし、公開された URI にオプションを指定することもできます。これらのオプションは URI の一部としてファブリックレジストリーに保存され、以下のように使用されます。
  • サーバーに のみ適用されるサーバーのみのオプション- オプションは、実行時にサーバーエンドポイント(コンシューマーエンドポイント)に適用されます。
  • クライアントに のみ適用されるクライアントのみのオプション- オプションは、実行時にクライアントエンドポイント(プロデューサーエンドポイント)に適用されます。
  • クライアントとサーバーに共通する一般的 なオプション- クライアントとサーバーの両方に適用されます。

ファブリックエンドポイントのユースケース

Fabric エンドポイントは基本的に Apache Camel エンドポイントの検出メカニズムを提供します。たとえば、以下の基本的なユースケースをサポートします。

ロケーションの検出

図47.1「Fabric によるロケーションの検出」 では、Fabric エンドポイントが実行時にロケーションの検出を有効にする方法の概要を説明します。

図47.1 Fabric によるロケーションの検出

このアプリケーションのサーバー側は、Fabric エンドポイントで始まるルートによって定義され、Fabric エンドポイントは URI jetty:http://0.0.0.0:9090 を公開します。このルートが起動すると、クラスター ID foo の下にある fabric レジストリーの Jetty URI が自動的に登録されます。
アプリケーションのクライアント側は、Fabric エンドポイント fabric:foo で終わるルートによって定義されます。クライアントルートが起動すると、ファブリックレジストリーで ID foo が自動的に検索され、関連付けられた Jetty エンドポイント URI が取得されるようになりました。その後、クライアントは検出された Jetty URI を使用してプロデューサーエンドポイントを作成し、対応するサーバーポートに接続します。

Load-balancing クラスター

図47.2「Fabric による負荷分散」 では、Fabric エンドポイントが負荷分散クラスターを作成できる方法の概要を説明します。

図47.2 Fabric による負荷分散

この場合、URI ( jetty:http://0.0.0.0:9090 )および jetty:http://0.0.0.0:9191 で 2 つの Jetty サーバーが作成されます。これらの公開された URI には fabric:foo: の接頭辞が付けられるため、両方の Jetty URI はファブリックレジストリーの 同じ クラスター ID foo の下に登録されます。
クライアントルートが起動すると、ファブリックレジストリーで ID foo が自動的に検索されるようになりました。foo ID は複数のエンドポイント URI に関連付けられているため、ファブリックはランダム負荷分散アルゴリズムを実装し、利用可能な URI のいずれかを選択します。その後、クライアントは選択した URI を使用してプロデューサーエンドポイントを作成します。

自動再接続機能

fabric エンドポイントは自動再接続をサポートします。そのため、クライアントエンドポイント(producer エンドポイント)がそのサーバーエンドポイントへの接続を失うと、自動的にファブリックレジストリーに戻り、別の URI を要求してから、新しい URI に接続します。

エンドポイント URI の公開

ファブリックレジストリーでエンドポイント URI PublishedURI を公開するには、パブリッシャー構文 FabricScheme:ClusterID:PublishedURI で fabric エンドポイントを定義します。この構文は、コンシューマーエンドポイント(つまり、from DSL コマンドに表示されるエンドポイント)でのみ使用できることに注意してください。
例47.1「URI の公開 」 は Jetty HTTP サーバーを実装するルートを示しています。ここでは、Jetty URI は ID cluster の下のファブリックレジストリーに公開されます。ルートは、HTTP 応答の本文で定数メッセージ Response from Zookeeper agent を返す単純な HTTP サーバーです。

例47.1 URI の公開

<?xml version="1.0" encoding="UTF-8"?>
<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="
           http://www.osgi.org/xmlns/blueprint/v1.0.0
           https://www.osgi.org/xmlns/blueprint/v1.0.0/blueprint.xsd">

 <bean id="fabric-camel" class="io.fabric8.camel.FabricComponent"/>

    <camelContext id="camel" trace="false" xmlns="http://camel.apache.org/schema/blueprint">
        <route id="fabric-server">
            <from uri="fabric-camel:cluster:jetty:http://0.0.0.0:9090/fabric"/>
            <log message="Request received : ${body}"/>
            <setHeader headerName="karaf.name">
                <simple>${sys.karaf.name}</simple>
            </setHeader>
            <transform>
                <simple>Response from Zookeeper agent</simple>
            </transform>
        </route>
    </camelContext>

</blueprint>
Copy to Clipboard Toggle word wrap
前述の例について、以下の点に注意してください。
  • Fabric コンポーネントは、CuratorFramework オブジェクトを使用して ZooKeeper サーバー(Fabric レジストリー)に接続します。ここで、CuratorFramework オブジェクトへの参照が自動的に提供されます。
  • from DSL コマンドは、ファブリック URI fabric-camel:cluster:jetty:http://0.0.0.0:9090/fabric を定義します。ランタイム時に、以下の 2 つのことが発生します。
    • 指定された jetty URI はクラスター ID cluster の下のファブリックレジストリーに公開されます。
    • Jetty エンドポイントはアクティベートされ、ルートのコンシューマーエンドポイントとして使用されます( fabric-camel:cluster: 接頭辞なしで指定された場合のみ)。
ルートは Blueprint XML に実装されているため、通常、このコードを含むファイルを Maven プロジェクトの src/main/resources/OSGI-INF/blueprint ディレクトリーに追加します。

エンドポイント URI の検索

fabric レジストリーで URI を検索する場合は、FabricScheme:ClusterID の形式で、ID で fabric エンドポイント URI を指定するだけです。この構文は、プロデューサーエンドポイントで使用されます(例: to DSL コマンドに表示されるエンドポイント)。
例47.2「URI の検索」 は、ファブリックレジストリーで指定された ID cluster を検索して、実行時に HTTP エンドポイントが動的に検出される HTTP クライアントを実装するルートを示しています。

例47.2 URI の検索

<?xml version="1.0" encoding="UTF-8"?>
<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="
           http://www.osgi.org/xmlns/blueprint/v1.0.0
           https://www.osgi.org/xmlns/blueprint/v1.0.0/blueprint.xsd">

 <bean id="fabric-camel" class="io.fabric8.camel.FabricComponent"/>

  <camelContext id="camel" trace="false" xmlns="http://camel.apache.org/schema/blueprint">

    <route id="fabric-client">
      <from uri="timer://foo?fixedRate=true&amp;period=10000"/>
      <setBody>
          <simple>Hello from Zookeeper server</simple>
      </setBody>
      <to uri="fabric-camel:cluster"/>
      <log message=">>> ${body} : ${header.karaf.name}"/>
    </route>

  </camelContext>

  <reference interface="org.apache.camel.spi.ComponentResolver"
              filter="(component=jetty)"/>

</blueprint>
Copy to Clipboard Toggle word wrap
ルートは Blueprint XML に実装されているため、通常、このコードを含むファイルを Maven プロジェクトの src/main/resources/OSGI-INF/blueprint ディレクトリーに追加します。

負荷分散の例

基本的には、ファブリックエンドポイントを使用すると、負荷分散の実装が簡単になります。必要なのは、同じ クラスター ID の下に複数のエンドポイント URI を公開することだけです。クライアントがそのクラスター ID を検索すると、利用可能なエンドポイント URI の一覧からランダムに選択できるようになりました。
負荷分散クラスターのサーバーはほぼ同じ設定になります。基本的に、これら間の唯一の違いは、異なるホスト名や IP ポートを使用してエンドポイント URI を公開することです。ただし、負荷分散クラスター内の各サーバーに個別の OSGi バンドルを作成する代わりに、設定変数を使用してホストまたはポートを指定できるようにするテンプレートを定義することが推奨されます。
例47.3「ロードバランシングクラスターのサーバーテンプレート」 は、負荷分散クラスターでサーバーを定義するテンプレートアプローチを示しています。

例47.3 ロードバランシングクラスターのサーバーテンプレート

<?xml version="1.0" encoding="UTF-8"?>
<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xmlns:cm="http://aries.apache.org/blueprint/xmlns/blueprint-cm/v1.0.0"
           xsi:schemaLocation="
           http://www.osgi.org/xmlns/blueprint/v1.0.0
           https://www.osgi.org/xmlns/blueprint/v1.0.0/blueprint.xsd">

    <!-- osgi blueprint property placeholder -->
    <cm:property-placeholder
        id="myConfig"
        persistent-id="io.fabric8.examples.camel.loadbalancing.server"/>

    <bean id="fabric-camel" class="io.fabric8.camel.FabricComponent"/>

    <camelContext id="camel" trace="false" xmlns="http://camel.apache.org/schema/blueprint">
        <!-- using Camel properties component and refer
             to the blueprint property placeholder by its id -->
        <propertyPlaceholder id="properties"
                             location="blueprint:myConfig"
                             prefixToken="[[" suffixToken="]]"/>

        <route id="fabric-server">
            <from uri="fabric-camel:cluster:jetty:http://0.0.0.0:[[portNumber]]/fabric"/>
            <log message="Request received : ${body}"/>
            <setHeader headerName="karaf.name">
                <simple>${sys.karaf.name}</simple>
            </setHeader>
            <transform>
                <simple>Response from Zookeeper agent</simple>
            </transform>
        </route>
    </camelContext>

</blueprint>
Copy to Clipboard Toggle word wrap
まず、OSGi Blueprint プロパティープレースホルダーを初期化する必要があります。プロパティープレースホルダーのメカニズムを使用すると、OSGi Config Admin サービスからプロパティー設定を読み取り、Blueprint 設定ファイルのプロパティーを置き換えることができます。この例では、プロパティープレースホルダーは io.fabric8.examples.camel.loadbalancing.server 永続 ID からプロパティーにアクセスします。OSGi Config Admin サービスの永続 ID は、関連するプロパティー設定のコレクションを識別します。プロパティープレースホルダーの初期化後に、構文を使用して永続 ID から任意のプロパティー値( [[PropName]] )にアクセスできます。
Fabric endpont URI はプロパティープレースホルダーのメカニズムを利用して、実行時に Jetty ポート [[portNumber]] の値を置き換えます。デプロイ時に、portName プロパティーの値を指定できます。たとえば、カスタム機能を使用する場合は、機能定義で プロパティーを指定できます ( Add OSGi configurations to the featureを参照してください)。または、Fuse Management Console でデプロイメントプロファイルを定義するときに設定プロパティーを指定することもできます。

OSGi バンドルプラグインの設定

Fabric エンドポイントを使用する OSGi バンドルを定義する場合は、以下の Java パッケージをインポートするように Import-Package バンドルヘッダーを設定する必要があります。
io.fabric8.zookeeper
Copy to Clipboard Toggle word wrap
たとえば、Maven を使用してアプリケーションをビルドする場合、例47.4「Maven バンドルプラグインの設定」 は、必要なパッケージをインポートするように Maven バンドルプラグインを設定する方法を示しています。

例47.4 Maven バンドルプラグインの設定

<project ... >
  ...
  <build>
    <defaultGoal>install</defaultGoal>
    <plugins>
      ...
      <plugin>
        <groupId>org.apache.felix</groupId>
        <artifactId>maven-bundle-plugin</artifactId>
        <extensions>true</extensions>
        <configuration>
          <instructions>
            <Bundle-SymbolicName>${project.groupId}.${project.artifactId}</Bundle-SymbolicName>
            <Import-Package>
              io.fabric8.zookeeper,
              *
            </Import-Package>
          </instructions>
        </configuration>
      </plugin>
    </plugins>
  </build>
  ...
</project>
Copy to Clipboard Toggle word wrap
トップに戻る
Red Hat logoGithubredditYoutubeTwitter

詳細情報

試用、購入および販売

コミュニティー

Red Hat ドキュメントについて

Red Hat をお使いのお客様が、信頼できるコンテンツが含まれている製品やサービスを活用することで、イノベーションを行い、目標を達成できるようにします。 最新の更新を見る.

多様性を受け入れるオープンソースの強化

Red Hat では、コード、ドキュメント、Web プロパティーにおける配慮に欠ける用語の置き換えに取り組んでいます。このような変更は、段階的に実施される予定です。詳細情報: Red Hat ブログ.

会社概要

Red Hat は、企業がコアとなるデータセンターからネットワークエッジに至るまで、各種プラットフォームや環境全体で作業を簡素化できるように、強化されたソリューションを提供しています。

Theme

© 2025 Red Hat