4. API 定義の作成 (RabbitMQ)

ここでは RabbtiMQ (AMQP) リクエストを Proxy するための定義の作成手順を説明します。

カスタム API 定義は Swagger 定義ファイルとして作成します。 Swagger 定義ファイルは YAML または JSON ファイルとして作成します。

以下に API 定義の例を示します。

swagger: '2.0'
basePath: /amqp
x-proxy:
  addrs:
    - rabbitmq1.example.com:5672
    - rabbitmq2.example.com:5672
  username: guest
  password: guest
  vhost: vhost1
paths:
  /publish/{id}:
    post:
      x-proxy:
        type: amqp-publish
        exchange: exchange1
        routingKey: ${request.pathParams.id}
        confirm: false
  /consume/{id}:
    get:
      x-proxy:
        type: amqp-consume
        queue: ${request.pathParams.id}
        timeout: 10000

basePath に指定した "/amqp" が API の識別子(API名)となります。

API内に任意の個数のオペレーションを定義することができます。 ここでは /publish サブパスに対して POST メソッドの API を、 /consume サブパスに対して GET メソッドの API を定義しています。

これは以下の REST API に対応します。 /api/1/{tenantId}/api までが固定パスで、これ以下の階層を自由に定義できます。

POST http://{servername}/api/1/{tenantId}/api/amqp/publish/{id}
GET http://{servername}/api/1/{tenantId}/api/amqp/consume/{id}

プロキシの定義は "x-proxy" に指定します。

x-proxy は 1)トップレベル、2)サブパスレベル、3)オペレーション、の3箇所に個別に記述できます(上記例では 1, 3 に記述)。複数指定した場合は値はマージされます。 同じ値が存在する場合は、深いレベルに指定した値が優先されます。

RabbitMQ 接続の場合、x-proxy には以下の値を記述します。

  • type (必須): 送信時は amqp-publish を、受信時は amqp-consume を指定します。
  • addrs (必須): RabbitMQ クラスタのホスト/ポート番号の組を指定します。
  • host (必須): RabbitMQ ホストを指定します。
  • port (必須): RabbitMQ ポート番号を指定します。
  • username (必須): RabbitMQ 認証ユーザ名を指定します。
  • password (必須): RabbitMQ 認証パスワードを指定します。
  • vhost (オプション): バーチャルホスト名を指定します。

上記のうち、addrs または host/port のいずれかのみ必須(もう一方はオプション)です。

  • addrs には ["ホスト名:ポート番号", "ホスト名:ポート番号"] のように,ホスト名とポートの組をリストで指定します.
  • addrs ではなく host, port を指定する場合はホストは1台しか指定できません。

送信時には以下の値を指定します。

  • exchange (必須): 送信先の Exchange 名を指定します。
  • routingKey (必須): Routing Key を指定します。
  • confirm (オプション): true を指定すると送信時 ack を待ちます。

受信時には以下の値を指定します。

  • queue (必須): キュー名を指定します。
  • timeout (オプション): タイムアウト時間をミリ秒で指定します。指定がない場合はポーリングになります。

REST API で、上記 /publish に POST で送信を行うと、指定された RabbitMQ サーバに対してメッセージが送信されます。なお、HTTPメッセージボディは無変換でそのまま RabbitMQ 側に送信されます。(メッセージ内容の変換は行いません)

また上記 /consume に GET リクエストを送信すると、RabbitMQ からメッセージを1件取得して返却します。データはそのままレスポンスボディに無変換で格納されます。