2019.04.09

【MuleSoftクイックスタートガイド】最初のMuleアプリケーションの開発

  • このエントリーをはてなブックマークに追加
  • follow us in feedly
gettyimages (10455)

※この記事は、下記Mulesoftの記事を、許可を得ていち早く翻訳したものです。 https://developer.mulesoft.com/guides/quick-start/developing-your-first-mule-application

このガイドでは以下の理由で前回のガイドで使用したAPI仕様を使用してMuleアプリケーションを構築します。

  • 時間節約のために事前に指定したモジュールとフローを利用してAPIの実装の枠組みを作成します。
  • メタデータを提供して目的の応答に一致するようにデータ処理を単純化および迅速化します。
  • テストを実行するための要求要件を参照できます。

なぜAnypoint platformで開発するのか

Anypoint platform上で定義されたAPI仕様は、さまざまな方法でシンプルかつ効率よく利用することが可能となります。Anypoint Platformを使ってMuleアプリケーションを生成することのその他の利点は以下があげられます。

  • メッセージ/データの変換、ルーティング、集約、および並べ替えを簡単に指定できます。
  • プロトコルやシステム間での広範な接続性を確保するために、すぐに使える多数のコネクタが存在します。
  • 軽量で高性能なランタイム環境が利用できます。

前提

  • 前回のガイドで作成したAPI仕様がExchangeに公開されていること。
    オプション:前のガイドをスキップした場合は、Exchangeから公開されているAPI仕様をダウンロードしてください。
  • Anypoint Studio 7がローカル環境にインストールされていること。

Anypoint Studioによる最初のアプリケーションの開発

Anypoint studioを利用してアプリケーションを実装すると、API仕様を元にしたHTTPのエンドポイントの枠組みを作成するだけではなく、仕様で定義されたデータ構造を構築するためにエンドポイントのレスポンスを視覚的にマッピングすることができます。

APIkitによるフローの枠組みの生成

Anypoint Studioを起動し、以下の手順で新しいMuleプロジェクトを作成します

  1. FileNewMule Project
  2. 「Project Name」に任意の名前を入力してください。
  3. API Implementationの「Specify API definition file location or URL」にチェックを入れます。
    Exchangeで公開されているAPI仕様を元にAPIkitを使用してプロジェクトの枠組みを生成するための指定となります。
  4. Location入力ボックスの横の「…」ボタンを押下する。
  5. 「Design Center…」を選択する。
  6. ガイド1で作成した「QuickStart-Store」RAMLファイルを選択する
    オプション:ガイド1が完了していない場合は、こちらからRAMLファイルをダウンロードし、ステップ5の代わりに「browse files…」を選択してダウンロードしたファイルを指定してください。
    ここでRAMLファイルを指定することによりAIP仕様をからエンドポイント、データ型、エラーなどをフローの枠組みを生成します。
  7. 「Finish」ボタンを押下します。 代替テキスト

作成されたプロジェクトには、get:\products{productid}用のフローなど、キャンバスにモジュールが追加された複数のフローが含まれています。

HTTPリスナーの設定

Muleフローはイベントドリブンのイベントプロセッサであるため、一番上のフローのメッセージソースはHTTPリスナーです。これはリクエストをリスニングしてAPIkitルーターに渡します。APIkitルーターはリクエストを対応するエンドポイントとメソッドのあるフローにルーティングし、レスポンスを受け取ります。

リスナーのプロパティ画面 → Base Settings → Connector configurationの入力ボックスの横にある「+」ボタンからHTTP Listenerの新しい設定を追加することができます。このアプリケーションはポート8081でIPv4アドレスをリッスンします。ルートパスは「/api/*」です。

  • Hosts: 0.0.0.0
  • Port: 8081 代替テキスト これで0.0.0.0:8081/api/*からすべてのリソースにアクセスできるようになりました。

Databaseコネクタを使用してMySQLに接続する

Exchangeにはすぐに使用できるコネクタがいくつかありますが、すばやく簡単に統合できるように、さらに多くのコネクタをExchangeに公開できます。利用可能なコネクタの1つが、さまざまなSQLデータベースへの接続を可能にするDatabaseコネクタです。

コネクタをフローに追加する

Databaseコネクタを含むすべてのMuleコンポーネントはMuleパレットからキャンバスに追加することができます。Databaseコネクタがプロジェクトのパレットで利用できない場合、「Seach in Exxhange…」をクリック → 「Database」で検索 → 「Database Connector」選択して「Add」→「Finish」ボタンで追加してください。

Databaseコネクタを追加したら、パレットから「select」をドラッグして「get:\products{productId}」フローに追加してください。 代替テキスト

Databaseコネクターの設定

このガイドでは、3つのテーブルを持つAmazon RDSインスタンスでホストされているMySQLデータベースにアクセスします。 データベース全体とすべてのテーブルのExcelエクスポートをダウンロードしてください。 congoStore.xlsx

HTTPリスナーで設定したのと同様に、最初のステップは「+」ボタンをクリックして再利用可能なグローバル設定を追加することです。以下のように設定します。

  • Name: Products_Config
  • Connection: MySQL Connection
  • Host: congo.devrel.mulesoft.com
  • Port: 3306
  • User: mulesoft
  • Password: mulesoft
  • Database: products?useSSL=false&autoReconenct=true

※ required Librariesで「Please add the required driver.」となる場合は横の「configure」ボタン→「Add recomended libraries」→「OK」でmysql用のJDBCドライバーを追加してください。

「Test Connection…」ボタンで接続を確認し、問題がないようでしたら「OK」ボタンで設定を完了してください。

すべてのフィールドの入力に問題がないにもかかわらず、データベースに接続ができない場合は、マシンまたはネットワークのファイアウォールがポート3306のトラフィックをブロックしていないことを確認してください。

つづいて、Selectコネクタ自身の設定を行います。まず、Display Nameをユニークで分かりやすい名前として「Select Product by Id.」とします。次にInput Parametersに以下を指定します。

{'id' : attributes.uriParams.productId}
Input Parameterの指定

SQLインジェクションの危険性を軽減するため、この指定でローカル変数「id」にリクエストURIのパラメータ「productId」を割り当てます。この変数は「:」で参照ができるようになっています。ここでは2つのテーブルを結合して、URIパラメータの値を指定された「:id」でフィルターする以下のSQLクエリで使用します。

SELECT 
product.*,
CONCAT('["', (GROUP_CONCAT(variant.picture SEPARATOR '", "')),'"]') AS pictures,
CONCAT('[', GROUP_CONCAT('{"',variant.identifierType, '":"', variant.identifier, '"}'),']') AS identifiers
FROM product
INNER JOIN variant ON product.uuid = variant.productUUID
WHERE product.uuid = :id;
プロダクト情報を取得するSQL

DataWeaveによるデータ変換

レスポンスが有効なリクエストに対するAPI仕様の規約と確実に一致するようにするには、データベースからの結果を操作し、定義された構造とMIMEタイプに一致するように変換する必要があります。そのためには、DataWeaveという強力な機能的データ変換言語を使用します。DataweaveコネクタがラベルTransform Messageでフローに配置されていることがわかります。このコネクタの設定ビューには、次に示すように複数の領域があります。 代替テキスト 各入力パラメータはキーを対応する出力にドラッグすることによって視覚的にマッピングできます。この演習の便宜上、以下のコードをコピーしてDataWeaveコードセクションに貼り付けてください。

%dw 2.0 // The version
output application/json // The mime-type of the output
var product = payload[0] // Setting a variable called product with a value of the first item of query's payload
---
{
        identifier: product.uuid,
        identifiers: read(product.identifiers default "[]","application/json"), // Parsing this string to a JSON object. If null, defaults to empty array to avoid a null exception.
        price: {
                amount: {
                        currencyValue: product.currencyValue,
                        name: product.currencyName default "Amount", // Setting a default value if value is null
                        currency: product.currency
                },
                salesUnit: {
                        code: product.salesUnitCode,
                        name: product.salesUnitName
                }
        },
        description: product.description,
        model: product.model,
        brand: product.brand,
        pictures: read(product.pictures default "[]","application/json") // Parsing this string to a JSON object. If null, defaults to empty array to avoid a null exception.
}
DataWeaveによるデータ変換

このDataWeaveの変換処理は、MySQLクエリから返されたJavaオブジェクトを受け取り、配列内の最初の項目(一意のIdなので1つだけ)を 「product」というローカル変数に変換し、その値を出力オブジェクトにマッピングします。

ここで使用するMySQLはv5.6以降なのでJSONオブジェクトをサポートします。DataWeaveのread()関数を使用して、文字列をJSONに解析することができます。また、DataWeaveは 「//」でコメントを記述することも可能です。

テスト

キャンバスの空白部分を右クリックして「Run project <プロジェクト名>」を選択するだけで、アプリケーションを起動することができます。 正常に起動されることを「console」タブで確認してください。 代替テキスト

次のCURLコマンドを実行して、このデプロイ済みアプリケーションに対してテストできます。

curl -X GET 0.0.0.0:8081/api/products/1295527d-d3c7-11e7-9c84-06bf056d193e
テスト用curlコマンド

仕様で指定した出力形式と一致する200の応答が表示されることを確認してください。

次のステップは

おめでとうございます。これでアプリケーションの構築が完了しデプロイする準備が整いました。 次のガイドではAnypoint Platform内でクラウドへのデプロイ、インスタンスの監視、およびアプリケーションのInsightおよびLogsの取得方法を紹介します。

32 件
     
  • banner
  • banner

関連する記事