8.12. Service Call

概要

Camel 2.18 から利用可能です。

Service Call パターンにより、分散システムでリモートサービスを呼び出すことができます。呼び出すサービスは、Kubernetes、Consul、etcd、Zookeeper などのサービスレジストリーで検索されます。このパターンは、サービスレジストリーの設定とサービスの呼び出しを分離します。

Maven ユーザーは、使用するサービスレジストリーの依存関係を追加する必要があります。可能性としては、以下のようなものがあります。

  • camel-consul
  • camel-etcd
  • camel-kubenetes
  • camel-ribbon

サービスを呼び出すための構文

サービスを呼び出すには、以下のようにサービス名を参照してください。

from("direct:start")
    .serviceCall("foo")
    .to("mock:result");

以下の例は、XML DSL でサービスを呼び出す例を示しています。

<camelContext xmlns="http://camel.apache.org/schema/spring">
  <route>
    <from uri="direct:start"/>
    <serviceCall name="foo"/>
    <to uri="mock:result"/>
  </route>
</camelContext>

これらの例では、Camel はサービスレジストリーと統合されたコンポーネントを使用して、foo という名前でサービスを検索します。ルックアップは、リモートサービスをホストするアクティブなサーバーの一覧を参照する IP:PORT ペアのセットを返します。Camel はリストから使用するサーバーをランダムに選択し、選択した IP および PORT 番号で Camel URI をビルドします。

デフォルトでは、Camel は HTTP コンポーネントを使用します。上記の例では、以下のように動的 toD エンドポイントから呼び出される Camel URI で呼び出しが解決されています。

toD("http://IP:PORT")
<toD uri="http:IP:port"/>

beer=yes のような URI パラメーターを使用してサービスを呼び出すことができます。

serviceCall("foo?beer=yes")
<serviceCall name="foo?beer=yes"/>

コンテキストパスを指定することもできます。例を以下に示します。

serviceCall("foo/beverage?beer=yes")
<serviceCall name="foo/beverage?beer=yes"/>

サービス名の URI への変換

説明のとおり、サービス名は Camel エンドポイント URI に解決されます。以下にいくつかの例を示します。 は、Camel URI の解決策を示します。

serviceCall("myService") -> http://hostname:port
serviceCall("myService/foo") -> http://hostname:port/foo
serviceCall("http:myService/foo") -> http:hostname:port/foo
<serviceCall name="myService"/> -> http://hostname:port
<serviceCall name="myService/foo"/> -> http://hostname:port/foo
<serviceCall name="http:myService/foo"/> -> http:hostname:port/foo

解決された URI を完全に制御するには、希望の Camel URI を指定する追加の URI パラメーターを指定します。指定した URI で、IP:PORT に解決するサービス名を使用できます。以下に例を示します。

serviceCall("myService", "http:myService.host:myService.port/foo") -> http:hostname:port/foo
serviceCall("myService", "netty4:tcp:myService?connectTimeout=1000") -> netty:tcp:hostname:port?connectTimeout=1000
<serviceCall name="myService" uri="http:myService.host:myService.port/foo"/> -> http:hostname:port/foo
<serviceCall name="myService" uri="netty4:tcp:myService?connectTimeout=1000"/> -> netty:tcp:hostname:port?connectTimeout=1000

上記の例では、myService という名前のサービスを呼び出しています。2 番目のパラメーターは、解決した URI の値を制御します。最初の例では serviceName.hostserviceName.port を使い、IP または PORT のいずれかを参照している点に注意してください。serviceName のみを指定する場合、IP:PORT に解決されます。

サービスを呼び出すコンポーネントの設定

デフォルトでは、Camel は HTTP コンポーネントを使用してサービスを呼び出します。HTTP4 や Netty4 HTTP などの異なるコンポーネントを使用する場合、以下のように設定することができます。

KubernetesConfigurationDefinition config = new KubernetesConfigurationDefinition();
config.setComponent("netty4-http");

// Register the service call configuration:
context.setServiceCallConfiguration(config);

from("direct:start")
    .serviceCall("foo")
    .to("mock:result");

以下は、XML DSL の例になります。

&lt;camelContext xmlns="http://camel.apache.org/schema/spring">
  &lt;kubernetesConfiguration id="kubernetes" component="netty4-http"/>
  &lt;route>
    &lt;from uri="direct:start"/>
    &lt;serviceCall name="foo"/>
    &lt;to uri="mock:result"/>
  &lt;/route>
&lt;/camelContext>

すべての実装で共有されるオプション

各実装で以下のオプションを使用することができます。

オプション

デフォルト値

説明

clientProperty

 

使用するサービスコールの実装に固有のプロパティーを指定します。たとえば、ribbon 実装を使用している場合は、クライアントプロパティーが com.netflix.client.config.CommonClientConfigKey に定義されます。

component

http

リモートサービスを呼び出すために使用するデフォルトの Camel コンポーネントを設定します。netty4-http、jetty、restlet などのコンポーネントを設定できます。サービスが HTTP プロトコルを使用しない場合は、mqtt、jms、amqp などの別コンポーネントを使用する必要があります。サービスコールで URI パラメーターを指定すると、デフォルトではなく、このパラメーターで指定されたコンポーネントが使用されます。

loadBalancerRef

 

使用するカスタム org.apache.camel.spi.ServiceCallLoadBalancer への参照を設定します。

serverListStrategyRef

 

使用するカスタム org.apache.camel.spi.ServiceCallServerListStrategy への参照を設定します。

Kubernetes を使用する場合のサービスコールオプション

Kubernetes 実装では、以下のオプションがサポートされます。

オプション

デフォルト値

説明

apiVersion

 

クライアントルックアップを使用する場合の Kubernetes API バージョン。

caCertData

 

クライアントルックアップをする際に使用する認証局データを設定します。

caCertFile

 

クライアントルックアップをする際にファイルからロードされる認証局データを設定します。

clientCertData

 

クライアントルックアップをする際に使用するクライアント証明書データを設定します。

clientCertFile

 

クライアントルックアップをする際にファイルからロードされるクライアント証明書データを設定します。

clientKeyAlgo

 

クライアントルックアップをする際に使用する、RSA などのクライアントキーストアアルゴリズムを設定します。

clientKeyData

 

クライアントルックアップをする際に使用する、クライアントキーストアデータを設定します。

clientKeyFile

 

クライアントルックアップをする際にファイルからロードされるクライアントキーストアデータを設定します。

clientKeyPassphrase

 

クライアントルックアップをする際に使用する、クライアントキーストアパスフレーズを設定します。

dnsDomain

 

dns ルックアップに使用する DNS ドメインを設定します。

lookup

environment

サービスを検索するために使用されるストラテジーの選択。検索ストラテジーには以下が含まれます。

  • environment: 環境変数を使用します。
  • dns: DNS ドメイン名を使用します。
  • client: Java クライアントを使用して Kubernetes マスター API を呼び出し、サービスをアクティブにホストしているサーバーを照会します。

masterUrl

 

クライアントルックアップを使用する際の Kubernetes マスターの URL。

namespace

 

使用する Kubernetes の名前空間。デフォルトでは、namespace の名前は環境変数 KUBERNETES_MASTER から取得されます。

oauthToken

 

クライアントルックアップを使用する際に (ユーザー名/パスワードの代わりに) 認証用の OAUTH トークンを設定します。

password

 

クライアントルックアップを使用する際に使用する、認証パスワードを設定します。

trustCerts

false

クライアントルックアップを使用する際に使用する、トラスト証明書のチェックを有効にするかどうかを設定します。

username

 

クライアントルックアップを使用する際に使用する、認証ユーザー名を設定します。