7 サンプル・アプリケーションのデプロイ

サンプル・アプリケーションのコードは、マイクロサービス対応トランザクション・マネージャ(MicroTx)のインストール・バンドルに含まれています。サンプルを使用することは、MicroTxをよく理解するための最速の方法です。

installation_directory/otmm-RELEASE/samplesフォルダには、各トランザクション・プロトコル(XALRAおよびTCC)のためのサブフォルダが含まれています。各サブフォルダには、サンプル・アプリケーションのソース・コードとHelmで必要なファイルが含まれています。

サンプル・アプリケーションは、MicroTxを使用して様々なトランザクション・プロトコルに参加するためのサービスを開発する方法を示すマイクロサービスです。サンプルアプリケーションのコードには、MicroTxライブラリが含まれています。アプリケーションでMicroTxライブラリを使用する際に、サンプル・アプリケーションを参照として使用できます。

サンプル・マイクロサービスのデプロイメントの詳細

マイクロサービスの開発、テストおよびデプロイを個別に行います。アプリケーションはACID要件を満たす必要があります。

サンプル・マイクロサービスを、MicroTxをインストールしたのと同じネームスペースにデプロイします。

共通のアイデンティティ・プロバイダを使用することで、すべてのマイクロサービスを単一のアイデンティティ・ドメインに関連付けてユーザー定義および認証を共有します。

MicroTxは、データ・ストアを使用してグローバル・トランザクションおよびトランザクション・ログに関するデータを保守します。

XAサンプル・アプリケーションの場合、参加側マイクロサービスはリソース・マネージャに接続しますが、これは参加側マイクロサービスの外部にあるサービスです。

7.1 XAサンプル・アプリケーションのデプロイ

MicroTxが、XAトランザクション・プロトコルを使用するアプリケーションのトランザクションをどのように管理するかについて、サンプルXAアプリケーションを使用して説明します。

XAサンプル・アプリケーションは、インストール・バンドルのinstallation_directory/otmm-<version>/samples/xaフォルダにあります。このフォルダには、JavaおよびNode.jsのサンプル・アプリケーションのための、3つのマイクロサービスのコード、YAMLファイル、Helmチャートが含まれています。サンプル・アプリケーション・コードは、MicroTxライブラリを使用するようにすでに構成されています。

7.1.1 XAサンプル・アプリケーションを実行するワークフロー

次のワークフローをガイドとして使用し、XAサンプル・アプリケーションを実行します。

タスク 説明 詳細
アクセス・トークンを作成します インストール・バンドルをダウンロードし、トランザクション・ストアおよびアイデンティティ・プロバイダを設定します。 準備
MicroTxをインストールします このガイドでは、KubernetesクラスタまたはDocker SwarmにMicroTxをインストールする手順について説明します。 次のいずれかの環境にMicroTxをインストールします:
サンプルXAアプリケーションのコンポーネントについて学習します サンプル・アプリケーションを使用して様々なユースケースを試すことができます。実行するサンプル・アプリケーションを特定し、そのサンプル・アプリケーションのソース・コードの場所を書き留めます。 XAサンプル・アプリケーションについて
試してみるXAサンプル・アプリケーションを特定します サンプル・アプリケーションを使用して様々なユースケースを試すことができます。実行するサンプル・アプリケーションを特定し、そのサンプル・アプリケーションのソース・コードの場所を書き留めます。 実行するサンプル・アプリケーションの特定
トランザクション参加側アプリケーションのリソース・マネージャを設定します XA準拠またはXA非準拠など、使用するリソース・マネージャのタイプを特定します。 サンプル・アプリケーションのリソース・マネージャの設定
サンプル・アプリケーションのビルド、インストールおよび実行を行います このガイドでは、KubernetesクラスタまたはDocker Swarmでサンプル・アプリケーションを実行する手順について説明します。 次のいずれかの環境でサンプル・アプリケーションを実行します:

7.1.2 XAサンプル・アプリケーションについて

サンプルのXAアプリケーションでは、振込アプリケーションがXAトランザクションを作成して部門から部門への送金を開始するシナリオを実装しています。組織内の2つの部門は、部門1 (Dept 1)と部門2 (Dept 2)です。

MicroTxによってXAトランザクションが実装されます。XAトランザクション内では、すべてのアクション(引出しや預入れなど)が成功するか、いずれか1つ以上のアクションが失敗した場合にはすべてがロールバックされます。

次の図は、多言語参加側マイクロサービスで構成されるサンプルXAアプリケーション・デプロイメントを示しています。

サンプルXAアプリケーションのコンポーネント
  • MicroTxコーディネータは、参加側サービス間のトランザクションを管理します。
  • 振込マイクロサービスはトランザクションを開始するため、XAトランザクション・イニシエータ・サービスと呼ばれます。ユーザーは、このマイクロサービスとやり取りして、ある金額を部門1と部門2の間で送金します。新しいリクエストが作成されると、MicroTxライブラリで公開されるヘルパー・メソッドは、XAトランザクションに対してbegin()メソッドを実行して、振込マイクロサービスでXAトランザクションを開始します。このマイクロサービスには、XAのコミット・コールおよびロールバック・コールを発行するビジネス・ロジックも含まれます。
  • 部門1と部門2はトランザクションに参加するため、XA参加側サービスと呼ばれます。MicroTxライブラリには、参加側サービスがトランザクションに自動的に登録できるようにするヘッダーが含まれています。これらのマイクロサービスは、REST APIを公開して、口座残高を取得し、指定された口座で引出しまたは預入れを行います。また、リソース・マネージャのリソースも使用します。

リソース・マネージャは、データベース、キューイング・システム、メッセージング・システム、キャッシュなどのステートフル・リソースを管理します。

サービスはACID要件を満たす必要があるため、XAトランザクションが開始され、このトランザクションのコンテキストで引出しと預入れの両方が呼び出されます。

次のトピックでは、XAトランザクションにおいてマイクロサービスとMicroTxがどのように通信するかについて説明します。

7.1.2.1 シナリオ: 一定金額の引出しおよび預入れ

次のステップでは、サンプル・アプリケーションを実行するときの、XAトランザクションの正常なパスのシーケンス例を示します。ここでは、部門1から一定金額を引き出して、その金額を部門2に預け入れするようにユーザーがリクエストするシナリオについて考えてみます。エラー時には、起動側アプリケーションがコミットのかわりにロールバックをコールします。

部門1と部門2はXA準拠のリソース・マネージャを使用すると仮定します。
  1. ユーザーが、部門1から部門2に一定金額を送金するリクエストを行います。
  2. ユーザーが部門1からの一定金額の引出しをリクエストすると、振込サービスがトランザクションを開始します。トランザクション・イニシエータ・サービスである振込は、XAトランザクションを開始するためにMicroTxをコールします。

    MicroTxは、トランザクションを追跡するための新しいグローバル・トランザクションID (GTRID)を作成し、GTRIDをデータ・ストアに書き込み、GTRIDをトランザクション・イニシエータ・サービスに返します。

  3. 振込が、一定金額を引き出すリクエストを部門1に送信します。
  4. トランザクション参加側サービスである部門1は、同じGTRIDを使用してMicroTxに登録します。トランザクションを正常に完了するには、MicroTxが複数の参加側サービスと対話する必要がある場合があります。MicroTxは、各参加側サービスに一意のブランチIDも作成します。XIDにはGTRIDとブランチIDの両方が含まれているため、XIDは参加側サービスごとに一意です。
  5. XAプロトコルでは、MicroTxが、参加側マイクロサービス(部門1など)とリソース・マネージャの間の通信を管理します。部門1は、MicroTxクライアント・ライブラリを使用する必要があります。これが、コールバックを登録して、リソース・マネージャのためにコールバックの実装を提供します。
  6. 部門1がDML操作を実行して一定金額を引き出し、レスポンスを返します。
  7. 振込サービスは、一定金額を部門2に預け入れする別のリクエストを開始します。
  8. トランザクション参加側サービスである部門2は、同じGTRIDを使用してMicroTxに登録します。MicroTxコーディネータは、部門2に固有のブランチIDを作成します。
  9. 部門2が、統合されたMicroTxライブラリを使用してリソース・マネージャと通信します。
  10. 部門2がDML操作を実行して一定金額を預け入れ、レスポンスを返します。
  11. 振込サービスがトランザクションをコミットするのは、部門1へのリクエストと部門2へのリクエストの両方が正常に実行された場合のみです。何らかのエラーが発生すると、振込サービスはコミットではなくロールバックをコールします。振込は、部門1と部門2によって使用されたのと同じGTRIDを使用してトランザクションをコミットします。
  12. MicroTxコーディネータは、参加側サービスである部門1がトランザクションをコミットするための準備を行います。
  13. MicroTxコーディネータが部門1をコールします。これに対して、参加側マイクロサービスは、統合されたMicroTxライブラリを使用して、リソース・マネージャを準備するリクエストを送信します。
  14. MicroTxコーディネータは、参加側サービスである部門2がトランザクションをコミットするための準備を行います。
  15. コーディネータが部門2にリクエストを送信します。これに対して、参加側マイクロサービスは、統合されたMicroTxライブラリを使用して、リソース・マネージャを準備するリクエストを送信します。
  16. 準備フェーズが正常に完了すると、コーディネータが参加側にコミット・リクエストを送信します。これに対して、参加側サービス2が、統合されたMicroTxライブラリを使用してリソース・マネージャにリクエストを送信します。コーディネータがレスポンスを振込サービスに返し、トランザクションが完了します。

7.1.3 実行するサンプル・アプリケーションの特定

サンプル・アプリケーションのコード・ファイルは、MicroTxクライアント・ライブラリを使用するようにすでに更新されています。これらのファイルは、MicroTxライブラリ・コードをご自身のカスタム・アプリケーションと統合するときに参照として使用できます。

次の表に、様々なシナリオを試すために使用できるXAサンプル・アプリケーションの組合せを示します。この情報は、サンプル・マイクロサービスのイメージを構築して構成するときに必要になります。この表では、installation_directory/otmm-<version>/samples/xaフォルダ内のサンプルXAアプリケーションの相対パスを示しています(..はこのフォルダを表します)。試してみたいシナリオを特定してから、そのサンプル・アプリケーションのソース・コードの場所を書き留めます。

振込サービスは、トランザクション・イニシエータ・サービスです。部門1サービスおよび部門2サービスはトランザクション参加側サービスです。すべてのトランザクション参加側サービスに対してリソース・マネージャを設定する必要があります。詳細は、「XAサンプル・アプリケーションについて」を参照してください。

シナリオ サンプル・コードの場所 備考
XA準拠リソース・マネージャのみを使用して、Javaサンプル・アプリケーションを実行します。振込サービスは、トランザクションを開始するだけで、トランザクションに参加しないため、リソース・マネージャは必要ありません。

イニシエータ・アプリケーション: ../java/teller

部門1: ../java/department-helidon

部門2: ../java/department-spring

部門1および部門2のXA準拠リソース・マネージャを設定します。XA準拠リソース・マネージャの設定を参照してください。
XA準拠リソース・マネージャのみを使用して、Javaサンプル・アプリケーションを実行します。振込サービスは、トランザクションを開始してからトランザクションに参加するため、リソース・マネージャも必要です。

イニシエータ・アプリケーション: ../java/teller-as-participant

部門1: ../java/department-helidon

部門2: ../java/department-spring

振込、部門1、部門2の各サービスのXA準拠リソース・マネージャを設定します。XA準拠リソース・マネージャの設定を参照してください。
XA準拠リソース・マネージャのみを使用して、Node.jsサンプル・アプリケーションを実行します。振込アプリケーションは、トランザクションを開始するだけで、トランザクションに参加しないため、リソース・マネージャは必要ありません。

イニシエータ・アプリケーション: ../nodejs/teller

部門1: ../java/department-helidon

部門2: ../nodejs/department

部門1および部門2のXA準拠リソース・マネージャを設定します。XA準拠リソース・マネージャの設定を参照してください。
部門1でXA準拠リソース・マネージャ、部門2でXAとJDBCをサポートしないリソースを使用し、Javaサンプル・アプリケーションを実行します。振込サービスは、トランザクションを開始するだけであり、リソース・マネージャは必要ありません。

イニシエータ・アプリケーション: ../java/teller

部門1: ../java/department-helidon

部門2: ../java/department-nonxa-ds

MySQLは、XAに準拠していないJDBCリソースです。ロギング・ラスト・リソース(LLR)の最適化を使用して、MySQLが分散トランザクションに参加できるようにします。部門2のリソース・マネージャとしてMySQLを設定します。「サンプル参加側サービスのMySQLの設定」を参照してください。
部門1でXA準拠リソース・マネージャ、部門2でMongoDBまたはMySQLをリソース・マネージャとして使用し、Javaサンプル・アプリケーションを実行します。振込サービスは、トランザクションを開始するだけであり、リソース・マネージャは必要ありません。

イニシエータ・アプリケーション: ../java/teller

部門1: ../java/department-helidon

部門2: ../java/department-nonxa

Mongo DBは非XAかつ非JDBCのリソースです。「リソース・マネージャとしてのMongoDBの設定」を参照してください。MySQLは、XAに準拠していないJDBCリソースです。「サンプル参加側サービスのMySQLの設定」を参照してください。LLRまたはLRCの最適化を使用して、MongoDBまたはMySQLが分散トランザクションに参加できるようにします。
部門1サービスと部門2サービスでXA準拠リソース・マネージャを使用し、Javaサンプル・アプリケーションを実行します。振込サービスは、トランザクションを開始してからトランザクションに参加します。このため、振込サービスにもリソース・マネージャを設定する必要があります。

イニシエータ・アプリケーション: ../java/teller-as-participant-nonxa-ds

部門1: ../java/department-helidon

部門2: ../java/department-spring

MySQLは、XAに準拠していないJDBCリソースです。LLRの最適化を使用して、MySQLが分散トランザクションに参加できるようにします。振込サービスのリソース・マネージャとしてMySQLを設定します。「振込サービスのMySQLの設定」を参照してください。
部門1でXA準拠リソース・マネージャ、部門2でMySQLをリソース・マネージャとして使用し、Javaサンプル・アプリケーションを実行します。振込サービスは、トランザクションを開始するだけであり、リソース・マネージャは必要ありません。

イニシエータ・アプリケーション: ../java/teller

部門1: ../java/department-helidon

部門2: ../java/department-nonxa-lrc-ds

MySQLは、XAに準拠していないJDBCリソースです。ラスト・リソース・コミット(LRC)の最適化を使用して、MySQLが分散トランザクションに参加できるようにします。部門2のリソース・マネージャとしてMySQLを設定します。「サンプル参加側サービスのMySQLの設定」を参照してください。
部門1でXA準拠リソース・マネージャ、部門2でMongoDBをリソース・マネージャとして使用し、Javaサンプル・アプリケーションを実行します。振込サービスは、トランザクションを開始するだけであり、リソース・マネージャは必要ありません。

イニシエータ・アプリケーション: ../java/teller

部門1: ../java/department-helidon

部門2: ../java/department-nonxa-lrc

Mongo DBは非XAかつ非JDBCのリソースです。LRCの最適化を使用して、MongoDBが分散トランザクションに参加できるようにします。「リソース・マネージャとしてのMongoDBの設定」を参照してください。
部門1でXA準拠リソース・マネージャ、部門2で複数のリソース・マネージャを使用し、Helidonサンプル・アプリケーションを実行します。振込サービスは、トランザクションを開始するだけであり、リソース・マネージャは必要ありません。

イニシエータ・アプリケーション: ../java/teller

部門1: ../java/department-helidon

部門2: ../java/department-helidon-mixed-multiplerm

部門2について、リソース・マネージャの1つとしてOracle Database、もう1つとしてMySQLを設定します。複数のリソース・マネージャの設定の詳細は、../java/department-helidon-mixed-multiplermにあるreadme.txtファイルを参照してください。
部門1でXA準拠リソース・マネージャ、部門2で複数のリソース・マネージャを使用し、Javaサンプル・アプリケーションを実行します。振込サービスは、トランザクションを開始するだけであり、リソース・マネージャは必要ありません。

イニシエータ・アプリケーション: ../java/teller

部門1: ../java/department-helidon-oracle-postgress-multiplerm

部門2: ../java/department-spring-jpa-multiplerm-postgres

部門1はHelidonアプリケーションです。部門2はSpring Bootアプリケーションです。部門2について、リソース・マネージャの1つとしてOracle Database、もう1つとしてPostgreSQLを設定します。複数のリソース・マネージャの設定の詳細は、../java/department-spring-jpa-multiplerm-postgresにあるreadme.txtファイルを参照してください。

7.1.4 サンプル・アプリケーションのリソース・マネージャの設定

サンプルXAアプリケーションで、部門1と部門2のリソース・マネージャを設定します。

部門1では、任意のXA準拠データベースをリソース・マネージャとして使用できます。たとえば、Oracle CloudのAutonomous Transaction Processing (ATP)データベース・インスタンスです。

部門2では、実装するユースケースに基づいて、次のいずれかをリソース・マネージャとして設定します:

  • XA準拠データベース
  • 非XA準拠のデータ・ストア(MongoDBやMySQLなど)
  • PostgreSQL (データベースとして)

振込サービスが、トランザクションを開始してからトランザクションに参加するユースケースでは、振込サービスにもリソース・マネージャを設定する必要があります。

7.1.4.1 XA準拠リソース・マネージャの設定

サンプルXAアプリケーションのXA準拠リソース・マネージャを設定してから、サンプル値を含む表を作成します。

任意のOracle Databaseを使用できます。たとえば、Oracle CloudのAutonomous Transaction Processing (ATP)データベース・インスタンス、Kubernetesクラスタ内で実行されているOracle Database、またはオンプレミス・データベースなどです。MicroTxおよびアプリケーション(アプリケーションをデプロイした時点で)がデータベースにアクセスできることを確認します。

Autonomous Databaseインスタンスを使用する場合のみ、次のステップを実行してOracleクライアント資格証明(ウォレット・ファイル)を取得します:
  1. Autonomous Databaseインスタンスからウォレットをダウンロードします。共有ExadataインフラストラクチャでのOracle Autonomous Databaseの使用クライアント資格証明(ウォレット)のダウンロードに関する項を参照してください。

    ZIPファイルがローカル・マシンにダウンロードされます。ウォレット・ファイルの名前がWallet_database.zipであるとします。

  2. ウォレット・ファイルを解凍します。
    unzip Wallet_database.zip

    ファイルが1つのフォルダに抽出されます。このフォルダの名前を書き留めます。

  3. ウォレット・ファイルを、参加側アプリケーションのソース・コードを含む次のフォルダにコピーします。
    • installation_directory/otmm-RELEASE/samples/xa/java/department-helidon/Database_Wallet
    • installation_directory/otmm-RELEASE/samples/xa/java/department-spring/Database_Wallet

データベースとサンプル値を含む表の作成

サンプルXAアプリケーションをテストするには、データベースと、両方の部門アプリケーションのサンプル値を含む表を作成します。MicroTxインストール・バンドルには、必要な表を作成するために実行できるSQLスクリプト・ファイルが含まれています。データベースに接続するクライアント・ツールを使用してSQLスクリプトを実行します。データベースとの接続を確立し、SQLスクリプトを実行するには、データベース資格証明を指定する必要があります。

SQLスクリプトを使用して、データベースと表を作成し、サンプル値を移入するには:

  1. SQL DeveloperまたはSQL Plusを使用して、Oracle Databaseに接続し、<installation_directory/otmm-RELEASE/samples/xa/java/department-helidon/department.sqlファイルを実行します。

    これにより、department_helidonという名前のデータベースと、accountsという名前の表が作成されます。また、accounts表にサンプル値が移入されます。

  2. SQL DeveloperまたはSQL Plusを使用して、Oracle Databaseに接続し、<installation_directory/otmm-RELEASE/samples/xa/java/department-spring/department.sqlファイルを実行します。

    これにより、department_springという名前のデータベースと、accountsという名前の表が作成されます。また、次の表に示すサンプル値がaccounts表に移入されます。

    Account_ID Amount
    account1 1000
    account2 2000
    account3 3000
    account4 4000
    account5 5000
7.1.4.2 リソース・マネージャとしてのMongoDBの設定

MicroTxは、リソース・マネージャとしてMongoDB 4.1以降をサポートしています。Mongo DBは非XAかつ非JDBCのリソースです。ロギング・ラスト・リソース(LLR)またはラスト・リソース・コミット(LRC)の最適化を使用して、MongoDBが分散トランザクションに参加できるようにします。

  1. トランザクション機能を含むようにMongoDBを設定します。トランザクションをサポートするには、MongoDBレプリケーションを設定する必要があります。https://www.mongodb.com/docs/manual/replication/#transactionsを参照してください。
  2. 次のコマンドを実行して、サンプルXAアプリケーションのシード・データを含む表をMongoDBに作成します。
    db.createCollection("accounts")
    db.accounts.insertMany([{"accountId":"111", "name":"account1", "amount":1000.00},{"accountId":"222", "name":"account2", "amount":2000.00},{"accountId":"333", "name":"account3", "amount":3000.00}])
  3. コミットされたレコードを格納するためのcommitRecordsコレクションを作成します。
    db.createCollection("commitRecords")

    ラスト・リソース・コミット(LRC)の最適化でサンプル・アプリケーションを実行している場合は、このステップをスキップします。

  4. 参加側サービスのセッション・アフィニティまたはスティッキー・セッションを有効にします。「XA参加側のセッション・アフィニティの有効化」を参照してください。
7.1.4.3 振込サービスのMySQLの設定

MySQLは、XAに準拠していないJDBCリソースです。ロギング・ラスト・リソース(LLR)またはラスト・リソース・コミット(LRC)の最適化を使用して、MySQLが、振込サービス(トランザクション・イニシエータ・サービス)のデータ・ストアとして分散トランザクションに参加できるようにします。

このシナリオでは、トランザクション・イニシエータおよび参加側アプリケーションはJavaアプリケーションです。部門1および部門2アプリケーションでXA準拠リソース・マネージャを使用します。振込アプリケーションのリソース・マネージャとしてMySQLを設定します。

振込アプリケーションのリソース・マネージャを設定するのは、イニシエータ・アプリケーションを参加側としても使用するシナリオを試す場合のみです。銀行振込アプリケーションによって、ある部門から別の部門に送金します。振込アプリケーションは、トランザクションごとに手数料として一定金額を請求します。この場合、振込アプリケーションはトランザクションを開始して参加します。データベース・インスタンスは、トランザクション情報を保存するために振込アプリケーションにアタッチされる必要があります。

次のステップを実行して、振込アプリケーションのリソース・マネージャを設定します:
  1. MySQLを設定します。インストールおよび構成の詳細は、MySQLのドキュメントを参照してください。
  2. 次のサンプル・コマンドを実行して、サンプルXAアプリケーションのシード・データを含む表をMySQLに作成します。fee表を使用して、振込アプリケーションによって請求される手数料を示します。
    create database transfer_fee;
    use transfer_fee;
    create table fee
    (
        account_id VARCHAR(10) not null,
        amount decimal(10,2) not null,
        PRIMARY KEY (account_id)
    );
    insert into fee values('account1', 10.00);
    insert into fee values('account2', 20.00);
    insert into fee values('account3', 30.00);
    insert into fee values('account4', 40.00);
    insert into fee values('account5', 50.00);
  3. コミットされたレコードを格納する表を作成します。
    CREATE TABLE LLR_COMMIT_RECORD (
        GTRID varchar(255) NOT NULL,
        DATE_COMMITED TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
        RECORDSTR text,
        PRIMARY KEY (GTRID)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    

    ラスト・リソース・コミット(LRC)の最適化でサンプル・アプリケーションを実行している場合は、このステップをスキップします。

  4. 参加側サービスのセッション・アフィニティまたはスティッキー・セッションを有効にします。「XA参加側のセッション・アフィニティの有効化」を参照してください。
7.1.4.4 サンプル参加側サービスのMySQLの設定

MySQLは、XAに準拠していないJDBCリソースです。ロギング・ラスト・リソース(LLR)またはラスト・リソース・コミット(LRC)の最適化を使用して、MySQLが分散トランザクションに参加できるようにします。

  1. MySQLを設定します。インストールおよび構成の詳細は、MySQLのドキュメントを参照してください。
  2. 次のコマンドを実行して、サンプルXAアプリケーションのシード・データを含む表をMySQLに作成します。
    create database department_nonxa_ds;
    use department_nonxa_ds;
    create table accounts
    (
        account_id VARCHAR(10) not null,
        name VARCHAR(60) not null,
        amount decimal(10,2) not null,
        PRIMARY KEY (account_id)
    );
    insert into accounts values('account1', 'account1', 1000.00);
    insert into accounts values('account2', 'account2', 2000.00);
    insert into accounts values('account3', 'account3', 3000.00);
    insert into accounts values('account4', 'account4', 4000.00);
    insert into accounts values('account5', 'account5', 5000.00);
  3. コミットされたレコードを格納する表を作成します。
    CREATE TABLE LLR_COMMIT_RECORD (
        GTRID varchar(255) NOT NULL,
        DATE_COMMITED TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
        RECORDSTR text,
        PRIMARY KEY (GTRID)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    

    ラスト・リソース・コミット(LRC)の最適化でサンプル・アプリケーションを実行している場合は、このステップをスキップします。

  4. 参加側サービスのセッション・アフィニティまたはスティッキー・セッションを有効にします。「XA参加側のセッション・アフィニティの有効化」を参照してください。
7.1.4.5 リソース・マネージャとしてのPostgreSQLの構成

XAサンプル・アプリケーションで部門2のリソース・マネージャとしてPostgreSQLを使用するには、アプリケーションのYAMLファイルにいくつかの詳細情報を指定して、セッション・アフィニティを有効にする必要があります。

PostgreSQLをリソース・マネージャとして使用しない場合は、この項をスキップします。
PostgreSQLをリソース・マネージャとして構成するには:
  1. リソース・マネージャとしてPostgreSQLを使用するトランザクション参加側サービスのセッション・アフィニティまたはスティッキー・セッションを有効にします。セッション・アフィニティを有効にすると、一意のトランザクションまたはセッションに対するすべてのリクエストは、最初のリクエストを処理した参加側サービスの同じエンドポイントまたはレプリカにルーティングされます。「XA参加側のセッション・アフィニティの有効化」を参照してください。
  2. アプリケーションのYAMLファイルで、PostgreSQLインスタンスに接続するためのユーザー名、パスワードおよびURLを指定します。詳細を指定するための形式については、readmeファイルを参照してください。
7.1.4.6 XA参加側のセッション・アフィニティの有効化

参加側サービスのレプリカが複数ある場合、リクエストは1つのトランザクションで異なるレプリカに向けられることがあります。参加側サービスのセッション・アフィニティを有効にすると、一意のトランザクションまたはセッションに対するすべてのリクエストは、最初のリクエストを処理した参加側サービスの同じエンドポイントまたはレプリカにルーティングされます。

次のシナリオで、トランザクション参加側サービスのセッション・アフィニティまたはスティッキー・セッションを有効にする必要があります:
  • 参加側サービスがリソース・マネージャとしてPostgreSQLを使用する場合。
  • 参加側サービスがリソース・マネージャとして非XAリソースを使用する場合。
参加側サービスのセッション・アフィニティを有効にするには:
  1. サービスをデプロイしたネームスペースで参加側サービスのネットワーキング・ルールを作成します。トラフィック・ポリシーでは、HTTPリクエスト・ヘッダーoracle-tmm-txn-idを使用するコンシステント・ハッシュを用いるロード・バランサを使用する必要があります。
  2. installation_directory/otmm-RELEASE/samples/xa/helmcharts/sampleapps/templatesフォルダにあるnetworking.yamlファイルを更新します。IstioのDestinationRuleリソースでoracle-tmm-txn-id HTTPヘッダーを指定して、セッション・アフィニティを有効にするか、スティッキー・セッションを作成します。コンシステント・ハッシュに基づくロード・バランサを使用して、oracle-tmm-txn-id HTTPヘッダーに基づくセッション・アフィニティを提供します。
    apiVersion: networking.istio.io/v1alpha3
    kind: DestinationRule
    spec:
        host: {{$val.host}}
        trafficPolicy:
          loadBalancer:
            consistentHash:
              httpHeaderName: oracle-tmm-txn-id

    説明

    • host: Kubernetesクラスタ内のアプリケーションの完全修飾名を指定します。たとえば、dept1.otmm.svc.cluster.localです。

  3. 任意のコード・エディタで、installation_directory/otmm-RELEASE/samples/xa/helmcharts/sampleappsフォルダにあるvalues.yamlファイルを開きます。
  4. values.yamlファイルのDept2で、sessionAffinityプロパティを検索し、値をtrueに設定します。
    sessionAffinity: true

7.1.5 KubernetesでのサンプルXAアプリケーションの実行

7.1.5.1 サンプルXAアプリケーションのDockerイメージの構築

Dockerイメージを構築する前に、次のタスクを完了したことを確認します。

  1. MicroTxをインストールしました。
  2. 試してみるサンプル・アプリケーションを特定し、そのコード・ファイルの場所を書き留めました。「実行するサンプル・アプリケーションの特定」を参照してください。
  3. 参加者側サービスのリソース・マネージャを設定しました。リソース・マネージャとしてAutonomous Databaseインスタンスを使用する場合は、ウォレット・ファイルをサンプル・アプリケーション・フォルダにコピーしました。

次の手順のコード・サンプルでは、Javaサンプル・アプリケーション(XA準拠のリソース・マネージャを使用)の場所を使用します。試すシナリオに基づいて、サンプル・アプリケーションのコード・ファイルのパスを更新します。

次のステップを実行して、サンプル内の各マイクロサービスのDockerイメージを構築します:

  1. 次のコマンドを実行して、振込アプリケーションのDockerイメージを構築します。

    サンプル・コマンド

    cd installation_directory/otmm-<version>/samples/xa/java/teller
    docker image build -t teller:1.0 .
  2. 次のコマンドを実行して、部門1アプリケーションのDockerイメージを構築します。

    サンプル・コマンド

    cd installation_directory/otmm-<version>/samples/xa/java/department-helidon
    docker image build -t department-helidon:1.0 .
  3. 次のコマンドを実行して、部門2アプリケーションのDockerイメージを構築します。

    サンプル・コマンド

    cd installation_directory/otmm-<version>/samples/xa/java/department-spring
    docker image build -t department-spring:1.0 .
作成したDockerイメージは、ローカルのDockerコンテナ・レジストリで使用可能になります。この情報を次のステップで指定するため、イメージの名前を書き留めます。
7.1.5.2 XAサンプル・アプリケーション・イメージのプッシュ

サンプル・アプリケーションの構築したDockerイメージをリモート・リポジトリにプッシュします。

構築したコンテナ・イメージは、ローカル・リポジトリで使用することができます。このイメージをリモート・リポジトリにプッシュする必要があります。Helmを使用してこのイメージにアクセスできるようにするためです。後で、Helmを使用してサンプル・アプリケーションをインストールします。

  1. イメージのプッシュ先のリモート・プライベート・リポジトリにログインするための資格証明を指定します。
    docker login <repo>

    使用しているKubernetesプラットフォームに基づいてログイン資格証明を指定します。

  2. 次のコマンドを使用して、リモートDockerリポジトリにプッシュするイメージの一意のタグを指定します。

    構文

    docker tag local_image[:tag] remote_image[:tag]

    説明

    • local_image[:tag]は、イメージがローカル・リポジトリ内で識別されるタグです。
    • remote_image[:tag]は、リモートDockerリポジトリ内でイメージを識別するためのタグです。

    サンプル・コマンド

    次のサンプル・コマンドによって、振込、部門1、および部門2のXAアプリケーションのイメージにタグが付けられます。ご自身の環境に応じてイメージ名を指定します。

    サンプル・コード

    docker tag teller:1.0 <region-key>.ocir.io/otmmrepo/teller:1.0
    docker tag dept1:1.0 <region-key>.ocir.io/otmmrepo/dept1:1.0 
    docker tag dept2:1.0 <region-key>.ocir.io/otmmrepo/dept2:1.0

    ここで、<region-key>.ocir.io/otmmrepoは、イメージ・ファイルのプッシュ先のOracle Cloud Infrastructure Registryです。他のKubernetesプラットフォームを使用している場合は、ご使用の環境に基づいて詳細を指定します。

  3. ローカル・リポジトリからリモートDockerリポジトリにDockerイメージをプッシュします。

    構文

    docker push remote_image[:tag]

    サンプル・コマンド

    次のサンプル・コマンドによって、振込、部門1、および部門2のアプリケーションのタグ付けされたイメージがプッシュされます。ご自身の環境に応じてイメージ名を指定します。

    サンプル・コード

    docker push <region-key>.ocir.io/otmmrepo/teller:1.0
    docker push <region-key>.ocir.io/otmmrepo/dept1:1.0
    docker push <region-key>.ocir.io/otmmrepo/dept2:1.0

リモートDockerリポジトリのDockerイメージのタグを書き留めます。リモートDockerリポジトリからイメージをプルする際に、このタグを入力する必要があります。

7.1.5.3 XAサンプル・アプリケーションのためのvalues.yamlファイルの更新

サンプル・アプリケーション・ファイルには、values.yamlファイル(サンプル・アプリケーションのマニフェスト・ファイル)も含まれ、これには、XAサンプル・アプリケーションのデプロイメント構成の詳細が含まれています。

サンプル・アプリケーションをKubernetesクラスタにデプロイするとき、HelmがリモートDockerレジストリからサンプル・アプリケーション・イメージをプルします。サンプル・アプリケーションのvalues.yamlファイルに、プルするイメージと、イメージのプル時に使用する資格証明を指定します。リソース・マネージャにアクセスするための詳細も指定します。

values.yamlファイルに構成および環境の詳細を指定するには:

  1. 任意のコード・エディタで、installation_directory/otmm-<version>/samples/xa/java/helmcharts/transferフォルダにあるvalues.yamlファイルを開きます。
    このファイルにはサンプル値が含まれています。このファイルを参照として使用して、Kubernetesでのマイクロサービスの実行と管理を行うためにご自身のYAMLファイルを作成してください。
  2. 部門1および部門2のマイクロサービスのリソース・マネージャにアクセスするための詳細を指定します。
    • connectString: データベースにアクセスするためのパブリックURLを入力します。データベース・ノードのパブリックIPアドレスまたはクラスタのIPアドレスを指定できます。
      • 非自律型Oracle Database (資格証明ウォレットを使用しないデータベース)を使用している場合は、次の形式を使用して接続文字列を入力します:
        jdbc:oracle:thin:@<publicIP>:<portNumber>/<database unique name>.<host domain name>
        たとえば:
        jdbc:oracle:thin:@123.213.85.123:1521/CustDB_iad1vm.sub05031027070.customervcnwith.oraclevcn.com
      • Oracle Database Cloud ServiceとOracle Cloud Infrastructureを一緒に使用している場合は、『Oracle Blockchain Platformの使用』Oracle Database Classic Cloud Service接続文字列の作成を参照してください。
      • Oracle Autonomous Transaction Processingを使用している場合は、次の形式を使用して接続文字列を入力します:
        jdbc:oracle:thin:@tcps://<host>:<port>/<service_name>?wallet_location=<wallet_dir>

        必要な詳細(ホスト、ポート、サービス名など)は、ウォレットを抽出したフォルダにあるtnsnames.oraファイルで確認できます。

        たとえば:

        jdbc:oracle:thin:@tcps://adb.us-phoenix-1.oraclecloud.com:7777/unique_connection_string_low.adb.oraclecloud.com?wallet_location=Database_Wallet
    • databaseUser: データベースにアクセスするためのユーザー名(SYSなど)を入力します。
    • databasePassword: その特定のユーザーがデータベースにアクセスするためのパスワードを入力します。
  3. dockerコンテナにアップロードしたすべてのサンプル・アプリケーション・イメージの詳細を指定します。たとえば、iad.ocir.io/mytenancy/xa/teller:1.0です。
  4. 変更内容を保存します。
7.1.5.4 XAサンプル・アプリケーションのインストール

MicroTxをインストールしたKubernetesクラスタにXAサンプル・アプリケーションをインストールします。

  1. Helmチャートを含むフォルダに移動します。試してみるサンプル・アプリケーションのパスを指定します。

    サンプル・コード

    cd installation_directory/otmm-<version>/otmm/samples/xa/helmcharts
    
  2. 次のコマンドを実行して、XAサンプル・アプリケーションをインストールします。
    helm install sample-xa-app --namespace otmm transfer/ \
    --values transfer/values.yaml

    ここで、sample-xa-appはインストールされるアプリケーションの名前です。

  3. ポッドやサービスなど、すべてのリソースの準備ができていることを確認します。次のコマンドを使用して、ネームスペースotmm内のリソースのリストとそれらのステータスを取得します。
    kubectl get all -n otmm
  4. アプリケーションがインストールされたことを確認します。
    helm list --namespace otmm
7.1.5.5 XAトランザクションの実行

トランザクションを開始する前に、アクセス・トークンを作成し、MicroTxライブラリ・ファイルをインストールして、Istioイングレス・ゲートウェイの外部IPアドレスを書き留める必要があります。

  1. トランザクションを開始する前に、次のコマンドを実行して、部門1と部門2の残高を確認します。
    curl --location --request GET -H "Authorization:Bearer $TOKEN" 'http://$CLUSTER_IPADDR/dept1/account1' | jq
    curl --location --request GET -H "Authorization:Bearer $TOKEN" 'http://$CLUSTER_IPADDR/dept2/account2' | jq

    説明

    • CLUSTER_IPADDRは、Istioイングレス・ゲートウェイの外部IPアドレスを格納した変数の名前です。Istioイングレス・ゲートウェイの外部IPアドレスを確認する方法や変数に格する方法の詳細は、「Istioイングレス・ゲートウェイのIPアドレスの確認」を参照してください。
    • TOKENは、以前に認証トークンを格納した変数の名前です。認証トークンを取得して変数に格納する方法の詳細は、アクセス・トークンの作成を参照してください。認証トークンの作成と指定を行う必要がないのは、テスト環境がMinikubeクラスタの場合のみです。その場合、ローカル・マシン上の単一のクラスタで操作が実行されます。
  2. 部門1から部門2に金額50を送金します。
    curl --location --request POST -H "Authorization:Bearer $TOKEN" 'http://$CLUSTER_IPADDR/transfers' --header 'Content-Type: application/json' --data-raw '{"from" : "account1", "to" : "account2", "amount" : 50}'

    振込サービスがトランザクションをコミットするのは、ビジネス・ロジックに基づいて、部門1へのリクエストと部門2へのリクエストの両方が正常に実行された場合のみです。MicroTxは、参加側サービスである部門1および部門2を準備してから、トランザクションをコミットします。

  3. 部門1と部門2の残高を確認し、トランザクション後の金額が正しく反映されていることを確認します。次のコマンドを実行してトランザクションを確定します。
    curl --location --request GET -H "Authorization:Bearer $TOKEN" 'http://$CLUSTER_IPADDR/dept1/account1' | jq
    curl --location --request GET -H "Authorization:Bearer $TOKEN" 'http://$CLUSTER_IPADDR/dept2/account2' | jq
  4. 次のコマンドを実行して部門1の残高を調べて、残高を書き留めます。いくつか後のステップで口座の残高を比較します。
    curl --location --request GET -H "Authorization:Bearer $TOKEN" 'http://$CLUSTER_IPADDR/dept1/account1' | jq
  5. MicroTxがエラーを処理してロールバックを実行する方法をテストするために、金額100を部門1から部門2に送金するときに、存在しない口座番号(account10など)を指定します。
    curl --location --request POST -H "Authorization:Bearer $TOKEN" 'http://$CLUSTER_IPADDR/transfers' --header 'Content-Type: application/json' --data-raw '{"from" : "account1", "to" : "account10", "amount" : 100}'

    ユーザーは500 Internal serverエラーを受け取ります。トランザクション参加側サービスは、account10が存在しないというエラー・メッセージを受け取ります。

    何らかのエラーが発生すると、振込サービスはコミットではなくロールバックをコールします。

  6. 次のコマンドを実行して、部門1の残高を調べます。
    curl --location --request GET -H "Authorization:Bearer $TOKEN" 'http://$CLUSTER_IPADDR/dept1/account1' | jq

    残高に変化があるかどうかを調べます。残高が同じであれば、部門1から金額が引き出されていません。

7.1.6 Docker SwarmでのサンプルXAアプリケーションの実行

7.1.6.1 Dockerイメージの構築およびプッシュ

リソース・マネージャとしてAutonomous Databaseインスタンスを使用する場合は、Dockerイメージの構築を開始する前に、ウォレット・ファイルをサンプル・アプリケーション・フォルダにコピーしていることを確認します。

  1. MicroTxをインストールしました。
  2. 試してみるサンプル・アプリケーションを特定し、そのコード・ファイルの場所を書き留めました。「実行するサンプル・アプリケーションの特定」を参照してください。
  3. 参加者側サービスのリソース・マネージャを設定しました。リソース・マネージャとしてAutonomous Databaseインスタンスを使用する場合は、ウォレット・ファイルをサンプル・アプリケーション・フォルダにコピーしました。

構築したDockerイメージに、作成したレジストリのアドレスをタグ付けすることが重要です。たとえば、192.0.2.1:5000。これは、アプリケーションをSwarmに配布する際に必要です。

次の手順のコード・サンプルでは、Javaサンプル・アプリケーション(XA準拠のリソース・マネージャを使用)の場所を使用します。試すシナリオに基づいて、サンプル・アプリケーションのコード・ファイルのパスを更新します。

次のステップを実行して、サンプル内の各マイクロサービスのDockerイメージを構築します:
  1. 次のコマンドに示すように、Dockerレジストリの場所をREGISTRY_LOCATIONという名前の環境変数に格納します。
    export REGISTRY_LOCATION=192.0.2.1:5000

    説明

    • 192.0.2.1は、作成したDockerレジストリのIPアドレスです。
    • 5000は、Dockerレジストリ・コンテナが通信するポート番号です。このポートを介したインバウンドおよびアウトバウンドのHTTPSまたはHTTPトラフィックを許可するために必要なネットワーキング・ルールを設定したことを確認します。

    これを行わない場合は、必要なときに、コマンドでIPアドレスを明示的に指定する必要があります。

  2. 次のコマンドを実行して、振込アプリケーションのDockerイメージを構築します。

    サンプル・コマンド

    cd installation_directory/otmm-<version>/samples/xa/java/teller
    docker image build -t $REGISTRY_LOCATION/teller:1.0 .
  3. 次のコマンドを実行して、部門1アプリケーションのDockerイメージを構築します。

    サンプル・コマンド

    cd installation_directory/otmm-<version>/samples/xa/java/department-helidon
    docker image build -t $REGISTRY_LOCATION/department-helidon:1.0 .
  4. 次のコマンドを実行して、部門2アプリケーションのDockerイメージを構築します。

    サンプル・コマンド

    cd installation_directory/otmm-<version>/samples/xa/java/department-spring
    docker image build -t $REGISTRY_LOCATION/department-spring:1.0 .
  5. タグ付けしたDockerイメージを、作成したDockerレジストリにプッシュします。

    構文

    docker push image[:tag]

    サンプル・コマンド

    次のサンプル・コマンドによって、ホテル、航空券および旅行マネージャのアプリケーションのタグ付けされたイメージがプッシュされます。

    docker push $REGISTRY_LOCATION/teller:1.0
    docker push $REGISTRY_LOCATION/department-helidon:1.0
    docker push $REGISTRY_LOCATION/department-spring:1.0

    Dockerイメージは構築した時点で、ローカルのDockerコンテナ・レジストリで使用可能になります。Dockerイメージをプッシュすると、Swarm用に作成したDockerレジストリで使用可能になります。

7.1.6.2 XAサンプル・アプリケーションのインストール

Docker SwarmにXAサンプル・アプリケーションをインストールします。

すべてのSwarmオブジェクトは、スタック・ファイルと呼ばれるマニフェストに記述されています。tmm-stack-compose.yamlスタック・ファイルはinstallation_directory/otmm-<version>/samples/dockerにあります。これは、XAサンプル・アプリケーションおよびトランザクション・コーディネータのすべてのコンポーネントおよび構成が指定されるサンプルYAMLファイルです。このファイルを参照として使用して、Docker Swarmでのマイクロサービスの実行と管理を行うためにご自身のYAMLファイルを作成してください。

XAサンプル・アプリケーションを実行するには:
  1. 任意のコード・エディタでtmm-stack-compose.yamlスタック・ファイルを編集します。

    このファイルには、XAサンプル・アプリケーションの構成の詳細が含まれています。XAサンプル・アプリケーションのセクションのコメントを解除します。

  2. 部門1および部門2のマイクロサービスのリソース・マネージャにアクセスするための詳細を指定します。
    • DEPARTMENTDATASOURCE_URL: リソース・マネージャにアクセスするためのパブリックURLを入力します。データベース・ノードのパブリックIPアドレスまたはクラスタのIPアドレスを指定できます。
    • DEPARTMENTDATASOURCE_USER: リソース・マネージャにアクセスするためのユーザー名(SYSなど)を入力します。
    • DEPARTMENTDATASOURCE_PASSWORD: 指定したユーザーがリソース・マネージャにアクセスするためのパスワードを入力します。

    これらのフィールドの値の指定に関する詳細は、『JDBC開発者ガイドおよびリファレンス』分散トランザクションを参照してください。

  3. Dockerレジストリにアップロードしたすべてのサンプル・アプリケーション・イメージの詳細を指定します。たとえば、198.51.100.1:5000/teller:1.0です。
  4. 変更内容を保存します。
  5. tmm-stack-compose.yamlスタック・ファイルをデプロイします。
    cd installation_directory/otmm-<version>/samples/docker
    docker stack deploy -c tmm-stack-compose.yaml tmmdemo

    ここで、tmmdemoはインストールするDockerスタックの名前です。他の任意の名前を指定できます。

    Output:
    Creating network tmmdemo_default
    Creating config tmmdemo_my_tcs_config
    Creating service tmmdemo_dept1
    Creating service tmmdemo_dept2
    Creating service tmmdemo_teller
    Creating service tmmdemo_otmm-tcs
  6. すべてのサービスの準備ができていることを確認します。次のコマンドを使用して、サービスとそのステータスのリストを取得します。
    docker service ls

    次のサンプル出力は、すべてのサービスの準備ができていることを示しています。

    ID             NAME                   MODE         REPLICAS   IMAGE                                   PORTS
    tjc0u55yavu4   registry               replicated   1/1        registry:2                              *:5000->5000/tcp
    varg9g3astj4   tmmdemo_dept1          replicated   1/1        198.51.100.1:5000/department-helidon:1.0   *:8086->8080/tcp
    ovtkx3677ypa   tmmdemo_dept2          replicated   1/1        198.51.100.1:5000/department-spring:1.0    *:8087->8082/tcp
    ilkvx4emyv8c   tmmdemo_otmm-tcs       replicated   1/1        198.51.100.1:5000/tmm:latest               *:9000->9000/tcp
    jv80wxsehbd2   tmmdemo_teller         replicated   1/1        198.51.100.1:5000/teller:1.0               *:8085->8080/tcp
    

    アプリケーションが実行されているポート番号を書き留めます。サンプル・アプリケーションを実行するときにポート番号を指定する必要があるためです。

サービスの準備ができたら、XAトランザクションを実行できます。
7.1.6.3 XAトランザクションの実行

トランザクションを開始する前に、マイクロサービス対応トランザクション・マネージャ・ライブラリ・ファイルをインストールし、サービスのDockerイメージをDockerレジストリにプッシュする必要があります。

  1. トランザクションを開始する前に、次のコマンドを実行して、部門1と部門2の残高を確認します。
    curl --location --request GET http://$REGISTRY_IPADDR:8086/accounts/account1 | jq
    curl --location --request GET http://$REGISTRY_IPADDR:8087/accounts/account2 | jq

    説明

    • REGISTRY_IPADDRは、DockerイメージをプッシュしたDockerレジストリのIPアドレスを格納した変数の名前です。DockerレジストリのIPアドレスを変数に格納する方法の詳細は、「Docker SwarmでのMicroTxへのアクセス」を参照してください。
    • 8086および8087は、部門1および部門2のサービスが実行されているそれぞれのポート番号です。

    ご自身の環境に基づいてこれらの詳細を指定します。

  2. 部門1から部門2に金額50を送金します。
    curl --location --request POST http://$REGISTRY_IPADDR:8085/transfers --header 'Content-Type: application/json' --data-raw '{"from" : "account1", "to" : "account2", "amount" : 50}'

    ここで、8085は振込サービスが実行されているポート番号です。ご自身の環境に応じてポート番号を指定します。

  3. 部門1と部門2の残高を確認し、トランザクション後に口座残高が正しく更新されていることを確認します。次のコマンドを実行してトランザクションを確定します。
    curl --location --request GET http://$REGISTRY_IPADDR:8086/accounts/account1 | jq
    curl --location --request GET http://$REGISTRY_IPADDR:8087/accounts/account2 | jq

7.2 LRAサンプル・アプリケーションのデプロイ

7.2.1 サンプルLRAアプリケーションについて

LRAサンプル・アプリケーションは、インストール・バンドルのinstallation_directory/otmm-<version>/samples/lra/lrademoフォルダにあります。このフォルダには、3つのサンプル・マイクロサービスのコード、YAMLファイルおよびHelmチャートが含まれています。

サンプルLRAアプリケーションのマイクロサービス

次の図に示すサンプルLRAアプリケーションには、いくつかのマイクロサービスが含まれています。これはMicroTxを使用してLRAトランザクションを管理する方法を示しています。

サンプル・アプリケーションを使用して、旅行(ホテル客室と航空券の予約を含む)を予約します。サンプル・アプリケーションの各マイクロサービスは、異なるタスクを実行します。1つのマイクロサービスが旅行を予約し、もう1つ航空券を予約し、3つ目のマイクロサービスがホテルを予約します。MicroTxは、これらのマイクロサービス間のトランザクションを調整します。

サンプルLRAアプリケーションのマイクロサービス

サンプルLRAアプリケーションは、次の多言語マイクロサービスで構成されます:

  • MicroTx (LRAコーディネータ)は、サンプル・マイクロサービス間のトランザクションを調整します。
  • 旅行マネージャ・サービスは、トランザクション・イニシエータ・サービスです。ここで、LRAトランザクションが開始します。旅行を予約する際に、このサービスが、航空券とホテルを予約するために航空券とホテルのサービスをそれぞれコールします。旅行マネージャは、ホテルと航空券の両方を予約するAPIと、その予約を取り消すAPIを公開します。ホテルと航空券の両方が正常に予約されます。または、エラー時には両方の予約が取り消されます。このJavaアプリケーションは、installation_directory/otmm-<version>/samples/lra/lrademo/trip-managerにあります。
  • ホテル予約サービスは、ホテル客室を予約するAPIと、エラー時に予約を取り消すAPIを公開します。これは旅行マネージャ・サービスによってコールされて、客室を予約します。これは既存のLRAのコンテキスト内でコールされるため自らを登録し、LRAコーディネータが客室予約を完了または補正するために使用するコールバックURIを提供します。このJavaアプリケーションは、installation_directory/otmm-<version>/samples/lra/lrademo/hotelにあります。
  • 航空券予約サービスは、航空券を予約するAPIと、エラー時に予約を取り消すAPIを公開します。これは旅行マネージャ・サービスによってコールされて、航空券を予約します。これは既存のLRAのコンテキスト内でコールされるため自らを登録し、LRAコーディネータが航空券予約を完了または補正するために使用するコールバックURIを提供します。このTypeScriptアプリケーションは、installation_directory/otmm-<version>/samples/lra/lrademo/flightにあります。
  • 旅行クライアントは、予約の確定または取消しに使用できるユーザー・インタフェースです。これはLRAトランザクションには参加しません。これは、サンプル・クライアント・サービスとして提供され、LRAプロトコルを使用する分散トランザクションを実行するマイクロサービスをコールします。このJavaアプリケーションは、installation_directory/otmm-<version>/samples/lra/lrademo/trip-clientにあります。

MicroTxライブラリは、サンプル・アプリケーション・マイクロサービスのコードに含まれています。サービスは、MicroTxライブラリを使用する際、公開されているRESTエンドポイントを介して相互に通信します。

このアプリケーションを実行すると、ホテル客室と航空券が予約され、仮予約が行われます。予約を確定する承認を与えた場合のみ、ホテル客室と航空券の予約が確定されます。仮予約を取り消すと、押さえていたホテル客室と航空券が解放され、予約が取り消されます。デフォルトでは、フライト・サービスで確定できるのは2件の予約のみです。エラー・シナリオをテストできるように、フライト・サービス・サンプル・アプリケーションは、2件の予約の確定後に追加の予約リクエストが行われると拒否します。これは、旅行のホテル仮予約の取消(補正)につながり、その旅行は予約されなくなります。

7.2.1.1 シナリオ: 映画館の座席予約

MicroTxでは、1レベルのネストがサポートされています。XAトランザクションは、LRAトランザクション内にのみネストできます。

映画チケットを予約するサンプル・アプリケーションを使用して、XAトランザクションがLRAトランザクション内にどのようにネストされるかを説明します。このサンプル・アプリケーションはインストール・バンドルには含まれていません。

サンプルのネストされたトランザクションのマイクロサービス

LRAトランザクションにXAトランザクションをネストするサンプル・アプリケーションは、次の多言語マイクロサービスで構成されます:

  • MicroTx (LRAコーディネータおよびXAコーディネータ)
  • 座席予約サービス: これはトランザクション・イニシエータ・サービスです。ここで、LRAトランザクションが開始します。このサービスは座席を予約し、予約席の支払いを処理するために支払いサービスをコールします。
  • 支払いサービス: このサービスは既存のLRAのコンテキスト内でコールされるため自らを登録し、LRAコーディネータが座席予約を完了または補正するために使用するコールバックURIを提供します。

    また、顧客の銀行口座から映画館の銀行口座への送金を開始することで、XAトランザクションを開始します。

  • 顧客の銀行サービス: このサービスはXAトランザクションに参加し、顧客の銀行口座から一定金額を引き出します。
  • 映画館の銀行サービス: このサービスはXAトランザクションに参加し、顧客の銀行口座から一定金額を引き出します。

ネストされたトランザクションのトランザクション・フローのシーケンス例

次のステップでは、サンプル・マイクロサービス間でのLRAトランザクションとXAトランザクションの正常なパスについて説明します。エラー時に、支払いサービスはコミットではなくロールバックをコールします。支払いが失敗した場合、座席予約サービスは映画館の座席の予約を削除して、再び予約対象にします。

  1. ユーザーが座席を予約するリクエストを発行すると、座席予約サービスが新しいLRAトランザクションを開始します。トランザクション・イニシエータ・サービスである座席予約は、MicroTxをコールしてLRAトランザクションを開始します。
  2. 座席が予約されると、座席予約サービスが、支払いを処理するために支払いサービスをコールします。
  3. 支払いサービスは、トランザクション参加側として既存のLRAトランザクションに参加します。
  4. 次に、支払いサービスは、MicroTxをコールしてXAトランザクションを開始するXAイニシエータ・サービスとして機能します。これが、顧客の銀行サービスから映画館の銀行サービスへの送金を開始します。
  5. 顧客の銀行サービスがXAトランザクションに登録し、DML操作を実行して一定金額を引き出し、レスポンスを返します。
  6. 支払いサービスは、一定金額を映画館の銀行サービスに預け入れする別のリクエストを開始します。
  7. XAトランザクション参加側である映画館の銀行サービスがXAトランザクションに登録し、DML操作を実行して一定金額を預け入れ、レスポンスを返します。
  8. 支払いサービスがXAトランザクションをコミットするのは、顧客の銀行へのリクエストと映画館の銀行へのリクエストの両方が正常に実行された場合のみです。何らかのエラーが発生すると、支払いサービスはコミットではなくロールバックをコールします。
  9. XAトランザクションをコミットした後、支払いサービスは、座席予約サービスに支払いステータスを返します。
  10. 支払いが成功した場合、座席予約サービスはMicroTxをコールしてLRAトランザクションを完了します。
  11. マイクロサービス対応トランザクション・マネージャが、支払いサービスおよび座席予約サービスの完了コールバックURIをコールし、LRAトランザクションを完了し、映画館の座席を予約します。
  12. 座席予約サービスが、予約された座席の詳細をユーザーに返します。

7.2.2 KubernetesでのサンプルLRAアプリケーションの実行

7.2.2.1 サンプルLRAアプリケーションのDockerイメージの構築

LRAサンプル・アプリケーションは、インストール・バンドルのinstallation_directory/otmm-<version>/samples/lra/lrademoフォルダにあります。このフォルダには、3つのマイクロサービスのコード、YAMLファイルおよびHelmチャートが含まれています。

サンプルLRAアプリケーションの詳細は、サンプルLRAアプリケーションについてを参照してください。
次のステップを実行して、サンプル内の各マイクロサービスのDockerイメージを構築します:
  1. 次のコマンドを実行して、ホテル・アプリケーションのDockerイメージを構築します。
    cd installation_directory/otmm-<version>/samples/lra/lrademo/hotel
    docker image build -t hotel:1.0 .

    イメージが正常に構築されると、次のメッセージが表示されます。

    Successfully tagged hotel:1.0

  2. 次のコマンドを実行して、航空券アプリケーションのDockerイメージを構築します。
    cd installation_directory/otmm-<version>/samples/lra/lrademo/flight
    docker image build -t flight:1.0 .

    イメージが正常に構築されると、次のメッセージが表示されます。

    Successfully tagged flight:1.0

  3. 次のコマンドを実行して、旅行マネージャ・アプリケーションのDockerイメージを構築します。
    cd installation_directory/otmm-<version>/samples/lra/lrademo/trip-manager
    docker image build -t trip-manager:1.0 .

    イメージが正常に構築されると、次のメッセージが表示されます。

    Successfully tagged trip-manager:1.0

作成したDockerイメージは、ローカルのDockerコンテナ・レジストリで使用可能になります。
7.2.2.2 LRAサンプル・アプリケーション・イメージのプッシュ

サンプル・アプリケーションの構築したDockerイメージをリモート・リポジトリにプッシュします。

構築したコンテナ・イメージは、ローカル・リポジトリで使用することができます。このイメージをリモート・リポジトリにプッシュする必要があります。Helmを使用してこのイメージにアクセスできるようにするためです。後で、Helmを使用してサンプル・アプリケーションをインストールします。

  1. Dockerを実行しているクライアント・マシンのターミナル・ウィンドウで、次のように入力して、イメージのプッシュ先のOracle Cloud Infrastructure Registryにログインします:
    docker login <region-key>.ocir.io

    ここで、<region-key>は、使用するOracle Cloud Infrastructure Registryリージョンのキーです。たとえば、phxです。Oracle Cloud Infrastructure Registryドキュメントのリージョン別可用性を参照してください。

  2. 次のコマンドを使用して、リモートDockerリポジトリにプッシュするイメージの一意のタグを指定します。

    構文

    docker tag local_image[:tag] remote_image[:tag]

    説明

    • local_image[:tag]は、イメージがローカル・リポジトリ内で識別されるタグです。
    • remote_image[:tag]は、リモートDockerリポジトリ内でイメージを識別するためのタグです。

    サンプル・コマンド

    次のサンプル・コマンドによって、ホテル、航空券および旅行マネージャのアプリケーションのイメージがタグ付けされます。

    docker tag hotel:1.0 <region-key>.ocir.io/otmmrepo/hotel:1.0
    docker tag trip-manager:1.0 <region-key>.ocir.io/otmmrepo/trip-manager:1.0 
    docker tag flight:1.0 <region-key>.ocir.io/otmmrepo/flight:1.0

    ここで、<region-key>.ocir.io/otmmrepoは、イメージ・ファイルのプッシュ先のOracle Cloud Infrastructure Registryです。他のKubernetesプラットフォームを使用している場合は、ご使用の環境に基づいて詳細を指定します。

  3. ローカル・リポジトリからリモートDockerリポジトリにDockerイメージをプッシュします。

    構文

    docker push remote_image[:tag]

    サンプル・コマンド

    次のサンプル・コマンドによって、ホテル、航空券および旅行マネージャのアプリケーションのタグ付けされたイメージがプッシュされます。

    docker push <region-key>.ocir.io/otmmrepo/hotel:1.0
    docker push <region-key>.ocir.io/otmmrepo/trip-manager:1.0
    docker push <region-key>.ocir.io/otmmrepo/flight:1.0

リモートDockerリポジトリのDockerイメージのタグを書き留めます。リモートDockerリポジトリからイメージをプルする際に、このタグを入力する必要があります。

7.2.2.3 LRAのためのvalues.yamlファイルの更新

サンプル・アプリケーション・ファイルには、values.yamlファイル(サンプル・アプリケーションのマニフェスト・ファイル)も含まれ、これには、LRAサンプル・アプリケーションのデプロイメント構成の詳細が含まれています。

サンプル・アプリケーションをKubernetesクラスタにデプロイするとき、HelmがリモートDockerレジストリからサンプル・アプリケーション・イメージをプルします。values.yamlファイルに、プルするイメージと、イメージのプル時に使用する資格証明を指定します。

values.yamlファイルに構成および環境の詳細を指定するには:

  1. 任意のコード・エディタでvalues.yamlファイル(installation_directory/otmm-RELEASE/samples/lra/helmcharts/sampleappslra/values.yamlフォルダにある)を開きます。このファイルにはサンプル値が含まれています。
  2. dockerコンテナにアップロードしたすべてのサンプル・アプリケーション・イメージの詳細を指定します。たとえば、iad.ocir.io/mytenancy/lra/trip-manager-lra:v1です。
  3. 変更内容を保存します。
7.2.2.4 LRAサンプル・アプリケーションのインストール

MicroTxをインストールしたKubernetesクラスタにLRAサンプル・アプリケーションをインストールします。

  1. 次のコマンドを実行して、LRAサンプル・アプリケーションをインストールします。
    cd installation_directory/otmm-RELEASE/samples/lra/helmcharts
    
    helm install sample-lra-app --namespace otmm sampleappslra/ \
    --values sampleappslra/values.yaml

    ここで、sample-lra-appはインストールされるアプリケーションの名前です。

    次の出力が表示されます。
    NAME: sample-lra-app
    LAST DEPLOYED: Wed Apr 20 17:12:32 2022
    NAMESPACE: otmm
    STATUS: deployed
    REVISION: 1
    TEST SUITE: None
  2. ポッドやサービスなど、すべてのリソースの準備ができていることを確認します。次のコマンドを使用して、ネームスペースotmm内のリソースのリストとそれらのステータスを取得します。
    kubectl get all -n otmm
    次のサンプル出力は、すべてのポッドの準備ができており、Running状態であることを示しています。
    NAME                                READY   STATUS    RESTARTS      AGE
    pod/flight-95db44488-h4br8          2/2     Running   0             17h
    pod/hotel-75bd8c59cb-hxgj5          2/2     Running   0             17h
    pod/otmm-tcs-84b87b66bd-9mntz       2/2     Running   1 (20h ago)   37h
    pod/trip-manager-6df68db55b-sdhcg   2/2     Running   0             17h
    
    NAME                   TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)    AGE
    service/flight         ClusterIP   10.100........   <none>        8080/TCP   17h
    service/hotel          ClusterIP   10.101........   <none>        8080/TCP   17h
    service/otmm-tcs       ClusterIP   10.109........   <none>        9000/TCP   37h
    service/trip-manager   ClusterIP   10.97.........   <none>        8080/TCP   17h
    
    NAME                           READY   UP-TO-DATE   AVAILABLE   AGE
    deployment.apps/flight         1/1     1            1           17h
    deployment.apps/hotel          1/1     1            1           17h
    deployment.apps/otmm-tcs       1/1     1            1           37h
    deployment.apps/trip-manager   1/1     1            1           17h
    
    NAME                                      DESIRED   CURRENT   READY   AGE
    replicaset.apps/flight-95db44488          1         1         1       17h
    replicaset.apps/hotel-75bd8c59cb          1         1         1       17h
    replicaset.apps/otmm-tcs-84b87b66bd       1         1         1       37h
    replicaset.apps/trip-manager-6df68db55b   1         1         1       17h
  3. アプリケーションがインストールされたことを確認します。
    helm list --namespace otmm

    次のサンプル出力には、otmmネームスペースにインストールされたアプリケーションの詳細が表示されています。ここで、sample-LRA-appは、インストールしたLRAサンプル・アプリケーションです。

    NAME            NAMESPACE       REVISION        UPDATED                                 STATUS          CHART                   APP VERSION
    otmm            otmm            1               2022-04-19 21:14:25.1941414 +0530 IST   deployed        otmm-RELEASE  RELEASE
    sample-lra-app  otmm            1               2022-04-20 17:12:32.8553506 +0530 IST   deployed        sampleappslra-1.0.1     1.0.1
7.2.2.5 LRAトランザクションの実行

トランザクションを開始する前に、アクセス・トークンを作成し、MicroTxライブラリ・ファイルをインストールして、Istioイングレス・ゲートウェイの外部IPアドレスを書き留める必要があります。

  1. 次のコマンドを実行して、ホテルと航空券を予約します。

    コマンド構文

    curl
    -H "Authorization:Bearer $TOKEN" 
    -X POST
    -d '' external-IP-address-Istio-ingress-gateway:Istio port number/application-specific-URI-for-transaction

    サンプル・コマンド

    curl
    -H "Authorization:Bearer $TOKEN" 
    -X POST
    -d '' "https://192.0.2.1:443/trip-service/api/trip?hotelName=Mercury&flightNumber=A123" | jq

    説明

    • 192.0.2.1は、Istioイングレス・ゲートウェイの外部IPアドレスです。
    • 443は、Istioポート番号です。
    • TOKENは、以前に認証トークンを格納した変数の名前です。認証トークンを取得して変数に格納する方法の詳細は、アクセス・トークンの作成を参照してください。
    サンプル・レスポンス
    {
      "cancelPending": false,
      "details": [
        {
          "cancelPending": false,
          "details": [
            
          ],
          "encodedId": "http%3A%2F%2Fomtm-tcs%3A9000%2Fapi%2Fv1%2Flra-coordinator%2F011899ca-20f3-4d8c-9e92-76de355921fe",
          "id": "http://otmm-tcs:9000/api/v1/lra-coordinator/011899ca-20f3-4d8c-9e92-76de355921fe",
          "name": "Mercury",
          "status": "PROVISIONAL",
          "type": "Hotel"
        },
        {
          "cancelPending": false,
          "details": [
            
          ],
         "encodedId": "http%3A%2F%2Fomtm-tcs%3A9000%2Fapi%2Fv1%2Flra-coordinator%2F011899ca-20f3-4d8c-9e92-76de355921fe",
          "id": "http://otmm-tcs:9000/api/v1/lra-coordinator/011899ca-20f3-4d8c-9e92-76de355921fe",
          "name": "A123",
          "status": "PROVISIONAL",
          "type": "Flight"
        }
      ],
      "encodedId": "http%3A%2F%2Fomtm-tcs%3A9000%2Fapi%2Fv1%2Flra-coordinator%2F011899ca-20f3-4d8c-9e92-76de355921fe",
      "id": "http://otmm-tcs:9000/api/v1/lra-coordinator/011899ca-20f3-4d8c-9e92-76de355921fe",
      "name": "Aggregate Booking",
      "status": "PROVISIONAL",
      "type": "Trip"
    }
  2. encodedIdおよびidの値を書き留めます。この情報は後で指定する必要があります。
  3. 次のコマンドを実行してトランザクションを確定します。

    コマンド構文

    curl --location 
    -H "Authorization:Bearer $TOKEN" 
    -H "Long-Running-Action: LRA-ID"
    --request PUT 
    -d '' http://external-ip-Istio-ingress-gateway/trip-service/api/trip/url-encoded-LRA-ID

    ここで、LRA-IDは書き留めたid属性の値、url-encoded-LRA-IDは書き留めたencodedId属性の値です。

    サンプル・コマンド

    curl --location 
    -H "Authorization:Bearer $TOKEN" 
    -H "Long-Running-Action: http://otmm-tcs:9000/lra-coordinator/011899ca-20f3-4d8c-9e92-76de355922fe"
    --request PUT 
    -d '' "https://192.0.2.1:443/trip-service/api/trip/http%3A%2F%2Fotmm-tcs%3A9000%2Flra-coordinator%2F011899ca-20f3-4d8c-9e92-76de355921fe"
  4. 次のコマンドを実行して、予約のステータスを確認します。
    curl -X GET -H "Authorization:Bearer $TOKEN" https://192.0.2.1:443/hotelService/api/hotel | jq
    curl -X GET -H "Authorization:Bearer $TOKEN" https://192.0.2.1:443/flightService/api/flight | jq

7.2.3 Docker SwarmでのサンプルLRAアプリケーションの実行

7.2.3.1 Dockerイメージの構築およびプッシュ

LRAサンプル・アプリケーションは、インストール・バンドルのinstallation_directory/otmm-<version>/samples/lra/lrademoフォルダにあります。このフォルダには、ホテルと航空券の予約に使用される3つのサンプル・マイクロサービスのアプリケーション・コードが含まれています。

サンプルLRAアプリケーションの詳細は、サンプルLRAアプリケーションについてを参照してください。

構築したDockerイメージに、作成したレジストリのアドレスをタグ付けすることが重要です。たとえば、198.51.100.1:5000です。これは、アプリケーションをswarmに配布する際に必要です。

次のステップを実行して、サンプル内の各マイクロサービスのDockerイメージを構築します:
  1. 次のコマンドを実行して、ホテル・アプリケーションのDockerイメージを構築します。
    cd installation_directory/otmm-<version>/samples/lra/lrademo/hotel
    docker image build -t 198.51.100.1:5000/hotel:1.0 .

    ここで、198.51.100.1:5000は作成したDockerレジストリのアドレスです。

  2. 次のコマンドを実行して、航空券アプリケーションのDockerイメージを構築します。
    cd installation_directory/otmm-<version>/samples/lra/lrademo/flight
    docker image build -t 198.51.100.1:5000/flight:1.0 .
  3. 次のコマンドを実行して、旅行マネージャ・アプリケーションのDockerイメージを構築します。
    cd installation_directory/otmm-<version>/samples/lra/lrademo/trip-manager
    docker image build -t 198.51.100.1:5000/trip-manager:1.0 .
  4. タグ付けしたDockerイメージを、作成したDockerレジストリにプッシュします。

    構文

    docker push image[:tag]

    サンプル・コマンド

    次のサンプル・コマンドによって、ホテル、航空券および旅行マネージャのアプリケーションのタグ付けされたイメージがプッシュされます。

    docker push 198.51.100.1:5000/hotel:1.0
    docker push 198.51.100.1:5000/trip-manager:1.0
    docker push 198.51.100.1:5000/flight:1.0

    Dockerイメージは構築した時点で、ローカルのDockerコンテナ・レジストリで使用可能になります。Dockerイメージをプッシュすると、swarm用に作成したdockerレジストリで使用可能になります。

  5. Java Development Kit (JDK)がローカル・システムにインストールされていることを確認してから、Bashシェルで次のコマンドを実行して、次の環境変数を設定します。
    export JAVA_HOME=jdk-install-dir
    export PATH=$JAVA_HOME/bin:$PATH
  6. 旅行クライアント・アプリケーションを構築します。これを使用すると、新しい旅行を予約するためのリクエストを送信できます。
    cd installation_directory/otmm-<version>/samples/lra/lrademo/trip-client
    mvn clean package
7.2.3.2 LRAサンプル・アプリケーションのインストール

Docker SwarmにLRAサンプル・アプリケーションをインストールします。

すべてのSwarmオブジェクトは、スタック・ファイルと呼ばれるマニフェストに記述されています。tmm-stack-compose.yamlスタック・ファイルはinstallation_directory/otmm-<version>/samples/dockerにあります。このYAMLファイルには、LRAサンプル・アプリケーションおよびトランザクション・コーディネータのすべてのコンポーネントおよび構成が指定されます。このファイルを使用して、Docker Swarmでマイクロサービスを実行および管理します。

LRAサンプル・アプリケーションを実行するには:
  1. tmm-stack-compose.yamlスタック・ファイルをデプロイします。
    cd installation_directory/otmm-<version>/samples/docker
    docker stack deploy -c tmm-stack-compose.yaml tmmdemo

    ここで、tmmdemoはインストールするDockerスタックの名前です。他の任意の名前を指定できます。

    Output:
    Creating network tmmdemo_default
    Creating config tmmdemo_my_tcs_config
    Creating service tmmdemo_hotel
    Creating service tmmdemo_flight
    Creating service tmmdemo_trip-manager
    Creating service tmmdemo_otmm-tcs
  2. すべてのサービスの準備ができていることを確認します。次のコマンドを使用して、サービスとそのステータスのリストを取得します。
    docker service ls

    次のサンプル出力は、すべてのサービスの準備ができていることを示しています。

    
    ID             NAME                   MODE         REPLICAS   IMAGE                             PORTS
    tjc0u55yavu4   registry               replicated   1/1        registry:2                        *:5000->5000/tcp
    qvzeovz8729y   tmmdemo_flight         replicated   1/1        198.51.100.1:5000/flight:1.0         *:8083->8083/tcp
    ifmqd521im28   tmmdemo_hotel          replicated   1/1        198.51.100.1:5000/hotel:1.0          *:8082->8082/tcp
    ilkvx4emyv8c   tmmdemo_otmm-tcs       replicated   1/1        198.51.100.1:5000/tmm:latest         *:9000->9000/tcp
    m069vayql490   tmmdemo_trip-manager   replicated   1/1        198.51.100.1:5000/trip-manager:1.0   *:8081->8081/tcp

    アプリケーションが実行されているポート番号を書き留めます。サンプル・アプリケーションを実行するときにポート番号を指定する必要があるためです。

サービスの準備ができたら、LRAトランザクションを実行できます。
7.2.3.3 LRAトランザクションの実行

サンプルLRAアプリケーションを実行して、ホテル客室と航空券を予約するには:
  1. 旅行マネージャ・サービスのURLを設定します。

    構文

    export TRIP_SERVICE_URL=<IP-address-of-Docker-registry>:<port-of-sample-app>/trip-service/api/trip

    export TRIP_SERVICE_URL=http://198.51.100.1:8081/trip-service/api/trip

    説明

    • 198.51.100.1は、DockerイメージをプッシュしたDockerレジストリのIPアドレスです。
    • 8081は、旅行マネージャ・サービスが実行されるポート番号です。

    ご自身の環境に基づいてこれらの詳細を指定します。

  2. 旅行クライアント・アプリケーションを実行します。
    cd installation_directory/otmm-<version>/samples/lra/lrademo/trip-client
    java -jar target/trip-client.jar
    旅行予約サービスのコンソールが表示されます。
  3. LRAサンプルアプリケーションの実行を確認するためにyを入力してから、[Enter]を押します。
    このサンプル・アプリケーションは、ホテル客室と航空券を暫定的に予約し、仮予約の詳細を表示します。
  4. 仮予約を確認するためにyを入力してから、[Enter]を押します。

    予約が確定され、確定した予約に関する情報が表示されます。

  5. 予約の詳細を取得するには、次のコマンドを実行します。
    curl --location --request GET http://198.51.100.1:8081/trip-service/api/trip | jq

    説明

    • 198.51.100.1は、DockerイメージをプッシュしたDockerレジストリのIPアドレスです。
    • 8081は、旅行予約サービスが実行されるポート番号です。

    サンプル・レスポンス

    [
      {
        "details": [
          {
            "encodedId": "http%3A%2F%2Fotmm-tcs%3A9000%2Fapi%2Fv1%2Flra-coordinator%2F9c44a549-9047-41d3-a3f0-623da46c6b2b",
            "id": "http://otmm-tcs:9000/api/v1/lra-coordinator/9c44a549-9047-41d3-a3f0-623da46c6b2b",
            "name": "Acme",
            "status": "CONFIRMED",
            "type": "Hotel"
          },
          {
            "details": [],
            "encodedId": "http%3A%2F%2Fotmm-tcs%3A9000%2Fapi%2Fv1%2Flra-coordinator%2F9c44a549-9047-41d3-a3f0-623da46c6b2b",
            "id": "http://otmm-tcs:9000/api/v1/lra-coordinator/9c44a549-9047-41d3-a3f0-623da46c6b2b",
            "name": "A123",
            "status": "CONFIRMED",
            "type": "Flight"
          }
        ],
        "encodedId": "http%3A%2F%2Fotmm-tcs%3A9000%2Fapi%2Fv1%2Flra-coordinator%2F9c44a549-9047-41d3-a3f0-623da46c6b2b",
        "id": "http://otmm-tcs:9000/api/v1/lra-coordinator/9c44a549-9047-41d3-a3f0-623da46c6b2b",
        "name": "Trip",
        "status": "CONFIRMED",
        "type": "Trip"
      }
    ]
  6. 次のコマンドを実行して、ホテル予約のリストを表示します。

    サンプル・コマンド

    curl --location --request GET http://198.51.100.1:8082/hotelService/api/hotel | jq

    説明

    • 198.51.100.1は、DockerイメージをプッシュしたDockerレジストリのIPアドレスです。
    • 8082は、ホテル予約サービスが実行されるポート番号です。

    ご自身の環境に基づいてこれらの詳細を指定します。

    サンプル・レスポンス

    [
      {
        "encodedId": "http%3A%2F%2Fotmm-tcs%3A9000%2Fapi%2Fv1%2Flra-coordinator%2F9c44a549-9047-41d3-a3f0-623da46c6b2b",
        "id": "http://otmm-tcs:9000/api/v1/lra-coordinator/9c44a549-9047-41d3-a3f0-623da46c6b2b",
        "name": "Acme",
        "status": "CONFIRMED",
        "type": "Hotel"
      }
    ]

    エンコードされたIDを書き留めます。特定の航空券またはホテルの予約の詳細を取得する場合は、この値を指定する必要があります。

  7. 次のコマンドを実行して、航空券予約のリストを表示します。

    サンプル・コマンド

    curl --location --request GET http://198.51.100.1:8083/flightService/api/flight | jq

    説明

    • 198.51.100.1は、DockerイメージをプッシュしたDockerレジストリのIPアドレスです。
    • 8083は、航空券予約サービスが実行されるポート番号です。

    ご自身の環境に基づいてこれらの詳細を指定します。

    サンプル・レスポンス

    [
      {
        "details": [],
        "encodedId": "http%3A%2F%2Fotmm-tcs%3A9000%2Fapi%2Fv1%2Flra-coordinator%2F9c44a549-9047-41d3-a3f0-623da46c6b2b",
        "id": "http://otmm-tcs:9000/api/v1/lra-coordinator/9c44a549-9047-41d3-a3f0-623da46c6b2b",
        "name": "A123",
        "status": "CONFIRMED",
        "type": "Flight"
      }
    ]

    エンコードされたIDを書き留めます。特定の航空券またはホテルの予約の詳細を取得する場合は、この値を指定する必要があります。

  8. 次のコマンドを実行して、特定の旅行、ホテルまたは航空券の予約の詳細を表示します。詳細を取得する予約のエンコードIDを指定してください。

    コマンド構文

    curl --location --request GET http://198.51.100.1:8081/trip-service/api/trip/<encodedId> | jq
    curl --location --request GET http://198.51.100.1:8082/hotelService/api/hotel/<encodedId> | jq
    curl --location --request GET http://198.51.100.1:8083/flightService/api/flight/<encodedId> | jq

    サンプル・コマンド

    次のコマンドによって、指定したエンコードIDの旅行の詳細が取得されます。

    curl --location --request GET http://198.51.100.1:8081/trip-service/api/trip/http%3A%2F%2Fotmm-tcs%3A9000%2Fapi%2Fv1%2Flra-coordinator%2F9c44a549-9047-41d3-a3f0-623da46c6b2b | jq

7.3 TCCサンプル・アプリケーションのデプロイ

7.3.1 サンプルTCCアプリケーションについて

インストール・バンドルに含まれるサンプルTCCアプリケーションを使用して、TCCトランザクションでマイクロサービスとMicroTxが相互に作用する方法について説明します。

TCCサンプル・アプリケーション・ファイルは、インストール・バンドルのinstallation_directory/otmm-<version>/samples/tccフォルダにあります。このフォルダには、3つのマイクロサービスのコード、YAMLファイルおよびHelmチャートが含まれています。

サンプル・アプリケーションは、TCCトランザクション・プロトコルとMicroTxを使用してトランザクションを調整します。MicroTxライブラリはすでにサンプル・アプリケーション・コードと統合されています。

サンプルTCCアプリケーションによって実装されるシナリオでは、旅行代理店マイクロサービスが旅行を予約し、航空券予約サービスが航空券を予約し、ホテル予約マイクロサービスがホテルを予約します。旅行代理店サービスは、航空券予約サービスとホテル予約サービスの両方にアクセスします。顧客が航空券とホテルを予約すると、顧客が支払を完了して予約を確定するまで、その予約が押さえられています。何らかのエラーが発生すると、予約されていたリソースが取り消され、リソースはインベントリに戻されます。

次の図に示すサンプルTCCアプリケーションには、いくつかのマイクロサービスが含まれています。これはMicroTxを使用してTCCトランザクションを管理する方法を示しています。

サンプルTCCアプリケーションのマイクロサービス

サンプルTCCアプリケーションは、次のマイクロサービスで構成されます:

  • MicroTx (TCCコーディネータ)
  • 旅行代理店サービスは、トランザクション・イニシエータ・サービスです。ここで、TCCトランザクションが開始します。ホテル客室と航空券予約するAPIと取り消すAPIを提供します。旅行を予約する際に、このサービスが、航空券予約サービスとホテル予約サービスをコールします。また、トランザクションを完了するために、確定コールまたは取消しコールをトランザクション参加側サービスに送信します。Javaアプリケーションはinstallation_directory/otmm-<version>/samples/tcc/java/travel-agentにあり、Node.jsアプリケーションはinstallation_directory/otmm-<version>/samples/tcc/nodejs/travel-agentにあります。
  • ホテル予約サービスはトランザクションに参加するため、トランザクション参加側サービスとも呼ばれます。ホテル客室予約を確定するAPIと取り消すAPIを提供します。Javaアプリケーションはinstallation_directory/otmm-<version>/samples/tcc/java/hotel-bookingにあり、Node.jsアプリケーションはinstallation_directory/otmm-<version>/samples/tcc/nodejs/hotel-bookingにあります。
  • 航空券予約サービスはトランザクションに参加するため、トランザクション参加側サービスとも呼ばれます。航空券予約を確定するAPIと取り消すAPIを提供します。Javaアプリケーションはinstallation_directory/otmm-<version>/samples/tcc/java/flight-bookingにあり、Node.jsアプリケーションはinstallation_directory/otmm-<version>/samples/tcc/nodejs/flight-bookingにあります。

サンプルTCCアプリケーションのコードは、Node.jsおよびJavaで提供されています。サンプル・アプリケーションを実行する際には、3つのサンプル・マイクロサービスすべてをNode.jsまたはJavaで構築します。Javaの旅行代理店サービスとNode.jsのホテル予約サービスを一緒に実行しようとしないでください。

7.3.2 KubernetesでのサンプルTCCアプリケーションの実行

7.3.2.1 サンプルTCCアプリケーションのDockerイメージの構築

TCCサンプル・アプリケーションは、インストール・バンドルのinstallation_directory/otmm-RELEASE/samples/tccフォルダにあります。

このフォルダには、Java、Node.jsおよびPythonの各言語で記述されたサンプル・コードの個別のフォルダが含まれます。各言語のサンプル・アプリケーション用のフォルダには、3つのマイクロサービスのコード・ファイル、YAMLファイルおよびHelmチャートが含まれています。実行するサンプル・アプリケーションを決定し、選択した言語のDockerイメージを構築します。サンプルTCCアプリケーションの詳細は、サンプルTCCアプリケーションについてを参照してください。
次のステップのうちいずれか1つのみを実行して、サンプル・コードを構築し、サンプル内の各マイクロサービスのDockerイメージを作成します。
  • 次のコマンドを実行して、Javaサンプル・アプリケーションのDockerイメージを構築します。
    • 次のコマンドを実行して、航空券アプリケーションを構築します。
      cd installation_directory/otmm-RELEASE/samples/tcc/java/flight-booking
      docker image build -t flight-booking:1.0 .
    • 次のコマンドを実行して、ホテル・アプリケーションを構築します。

      cd installation_directory/otmm-RELEASE/samples/tcc/java/hotel-booking
      docker image build -t hotel-booking:1.0 .
    • 次のコマンドを実行して、旅行代理店アプリケーションを構築します。

      cd installation_directory/otmm-RELEASE/samples/tcc/java/travel-agent
      docker image build -t travel-agent:1.0 .
  • 次のコマンドを実行して、Javaサンプル・アプリケーションのPythonイメージを構築します。
    • 次のコマンドを実行して、航空券アプリケーションを構築します。

      cd installation_directory/otmm-RELEASE/samples/tcc/python/flight-booking-py
      docker image build -t flight-booking-py:1.0 .
    • 次のコマンドを実行して、ホテル・アプリケーションを構築します。

      cd installation_directory/otmm-RELEASE/samples/tcc/python/hotel_booking-py
      docker image build -t hotel-booking-py:1.0 .
    • 次のコマンドを実行して、旅行代理店アプリケーションを構築します。

      cd installation_directory/otmm-RELEASE/samples/tcc/python/travel-agent-py
      docker image build -t travel-agent-py:1.0 .
  • 次のコマンドを実行して、Node.jsサンプル・アプリケーションのDockerイメージを構築します。
    • 次のコマンドを実行して、航空券アプリケーションを構築します。

      cd installation_directory/otmm-RELEASE/samples/tcc/nodejs/flight
      docker image build -t flight:1.0 .
    • 次のコマンドを実行して、ホテル・アプリケーションを構築します。

      cd installation_directory/otmm-RELEASE/samples/tcc/nodejs/hotel
      docker image build -t hotel:1.0 .
    • 次のコマンドを実行して、旅行代理店アプリケーションを構築します。

      cd installation_directory/otmm-RELEASE/samples/tcc/nodejs/travel-agent
      docker image build -t travel-agent:1.0 .
作成したDockerイメージは、ローカルのDockerコンテナ・レジストリで使用可能になります。作成したDockerイメージの名前を書き留めます。次のステップでこれらの名前を指定する必要があります。
7.3.2.2 TCCサンプル・アプリケーション・イメージのプッシュ

サンプル・アプリケーションの構築したDockerイメージをリモート・リポジトリにプッシュします。

構築したコンテナ・イメージは、ローカル・リポジトリで使用することができます。このイメージをリモート・リポジトリにプッシュする必要があります。Helmを使用してこのイメージにアクセスできるようにするためです。後で、Helmを使用してサンプル・アプリケーションをインストールします。

  1. イメージのプッシュ先のリモート・プライベート・リポジトリにログインするための資格証明を指定します。
    docker login <repo>

    使用しているKubernetesプラットフォームに基づいてログイン資格証明を指定します。

  2. リモートDockerリポジトリにプッシュするイメージの一意のタグを指定します。

    構文

    docker tag local_image[:tag] remote_image[:tag]

    説明

    • local_image[:tag]は、イメージがローカル・リポジトリ内で識別されるタグです。前のタスクで書き留めた、ローカル・リポジトリ内のDockerイメージの名前を指定します。
    • remote_image[:tag]は、リモートDockerリポジトリ内でイメージを識別するためのタグです。

    サンプルの言語に基づいて、次のいずれかのコマンドを実行します。

    • 次のサンプル・コマンドによって、ホテル、航空券および旅行マネージャのJavaアプリケーションのイメージがタグ付けされます。

      サンプル・コマンド

      docker tag hotel-booking:1.0 <region-key>.ocir.io/otmmrepo/hotel-booking:1.0
      docker tag flight-booking:1.0 <region-key>.ocir.io/otmmrepo/flight-booking:1.0
      docker tag travel-agent:1.0 <region-key>.ocir.io/otmmrepo/travel-agent:1.0 
    • 次のサンプル・コマンドによって、ホテル、航空券および旅行マネージャのPythonアプリケーションのイメージがタグ付けされます。

      サンプル・コマンド

      docker tag hotel_booking-py:1.0 <region-key>.ocir.io/otmmrepo/hotel_booking-py:1.0
      docker tag flight_booking-py:1.0 <region-key>.ocir.io/otmmrepo/flight_booking-py:1.0
      docker tag travel-agent-py:1.0 <region-key>.ocir.io/otmmrepo/travel-agent-py:1.0 
    • 次のサンプル・コマンドによって、ホテル、航空券および旅行マネージャのNode.jsアプリケーションのイメージがタグ付けされます。

      サンプル・コマンド

      docker tag hotel:1.0 <region-key>.ocir.io/otmmrepo/hotel:1.0
      docker tag flight:1.0 <region-key>.ocir.io/otmmrepo/flight:1.0
      docker tag travel:1.0 <region-key>.ocir.io/otmmrepo/travel-agent:1.0 

    ここで、<region-key>.ocir.io/otmmrepoは、イメージ・ファイルのプッシュ先のOracle Cloud Infrastructure Registryです。他のKubernetesプラットフォームを使用している場合は、ご使用の環境に基づいて詳細を指定します。

  3. ローカル・リポジトリからリモートDockerリポジトリにDockerイメージをプッシュします。

    構文

    docker push remote_image[:tag]

    サンプル・コマンド

    次のサンプル・コマンドによって、ホテル、航空券および旅行マネージャのアプリケーションのタグ付けされたイメージがプッシュされます。前のステップで入力した情報に基づいて、リモート・イメージの名前を指定します。

    docker push <region-key>.ocir.io/otmmrepo/hotel-booking:1.0
    docker push <region-key>.ocir.io/otmmrepo/travel-agent:1.0
    docker push <region-key>.ocir.io/otmmrepo/flight-booking:1.0

リモートDockerリポジトリのDockerイメージのタグを書き留めます。リモートDockerリポジトリからイメージをプルする際に、このタグを入力する必要があります。

7.3.2.3 TCCのためのvalues.yamlファイルの更新

サンプル・アプリケーション・フォルダには、values.yamlファイル(サンプル・アプリケーションのマニフェスト・ファイル)も含まれ、これには、TCCサンプル・アプリケーションのデプロイメント構成の詳細が含まれています。

Helmを使用してサンプル・アプリケーションをKubernetesクラスタにデプロイするとき、Helmは、values.yamlファイルに指定されている詳細に基づいて、リモートDockerレジストリからサンプル・アプリケーション・イメージをプルします。Dockerイメージの名前を指定してvalues.yamlファイルを更新します。

リモート・リポジトリにプッシュしたDockerイメージの名前を、values.yamlファイル内で更新するには:

  1. 任意のコード・エディタでvalues.yamlファイルを開きます。このファイルにはサンプル値が含まれています。

    Javaサンプル・アプリケーションの場合、ファイルはinstallation_directory/otmm-RELEASE/samples/tcc/java/helmcharts/sampleappstcc/values.yamlにあります。

    Node.jsサンプル・アプリケーションの場合、ファイルはinstallation_directory/otmm-RELEASE/samples/tcc/nodejs/helmcharts/sampleappstccnode/values.yamlにあります。

    Pythonサンプル・アプリケーションの場合、ファイルはinstallation_directory/otmm-RELEASE/samples/tcc/python/helmcharts/sampleappstccpy/values.yamlにあります。

  2. リモートDockerリポジトリにアップロードしたすべてのサンプル・アプリケーション・イメージの詳細を指定します。たとえば、iad.ocir.io/mytenancy/tcc/flight-booking-tcc:v1です。
  3. 変更内容を保存します。
7.3.2.4 TCCサンプル・アプリケーションのインストール

MicroTxをインストールしたKubernetesクラスタにTCCサンプル・アプリケーションをインストールします。

  1. TCCサンプル・アプリケーションをインストールします。
    • 次のコマンドを実行して、Javaサンプル・アプリケーションをインストールします。

      cd installation_directory/otmm-RELEASE/otmm/samples/tcc/java/helmcharts
      
      helm install sample-tcc-app --namespace otmm sampleappstcc/ \
      --values sampleappstcc/values.yaml
    • 次のコマンドを実行して、Node.jsサンプル・アプリケーションをインストールします。

      cd installation_directory/otmm-RELEASE/otmm/samples/tcc/nodejs/helmcharts
      
      helm install sample-tcc-app --namespace otmm sampleappstccnode/ \
      --values sampleappstccnode/values.yaml
    • 次のコマンドを実行して、Pythonサンプル・アプリケーションをインストールします。

      cd installation_directory/otmm-RELEASE/otmm/samples/tcc/python/helmcharts
      
      helm install sample-tcc-app --namespace otmm sampleappstccpy/ \
      --values sampleappstccpy/values.yaml

    ここで、sample-tcc-appはインストールされるアプリケーションの名前です。

  2. ポッドやサービスなど、すべてのリソースの準備ができていることを確認します。次のコマンドを使用して、ネームスペースotmm内のリソースのリストとそれらのステータスを取得します。
    kubectl get all -n otmm
  3. アプリケーションがインストールされたことを確認します。
    helm list --namespace otmm
7.3.2.5 TCCトランザクションの実行

このアプリケーションを実行すると、ホテル客室と航空券が予約され、仮予約が行われます。

予約を確定する承認を与えた場合のみ、ホテル客室と航空券の予約が確定されます。仮予約を取り消した場合は、ホテル客室と航空券の仮予約が取り消されます。取消のケースでは、暫定的に押さえていたホテルと航空券を解放し、それらのリソースを使用可能にするためのコードをアプリケーションに含める必要があります。

トランザクションを開始する前に、アクセス・トークンを作成し、MicroTxライブラリ・ファイルをインストールして、Istioイングレス・ゲートウェイの外部IPアドレスを書き留める必要があります。

TCCサンプル・アプリケーションを実行するには:
  1. 次のコマンドを実行して、ホテルと航空券を予約します。

    サンプル・コマンド

    curl -H "Authorization:Bearer $TOKEN" \
         --header 'Accept: application/json' \
         -X POST \
         -d '' "https://$CLUSTER_IPADDR/travel-agent/api/bookings/reserve?hotelName=Acme&flightNumber=AA2250"

    説明

    • CLUSTER_IPADDRは、Istioイングレス・ゲートウェイの外部IPアドレスを格納した変数の名前です。Istioイングレス・ゲートウェイの外部IPアドレスを確認する方法や変数に格する方法の詳細は、「Istioイングレス・ゲートウェイのIPアドレスの確認」を参照してください。
    • TOKENは、以前に認証トークンを格納した変数の名前です。認証トークンを取得して変数に格納する方法の詳細は、アクセス・トークンの作成を参照してください。

    サンプル・レスポンス

    {
        "tripBookingId": "840c7f0c-d87e-4694-aba5-0846e716ce99",
        "message": "Successfully booked the trip",
        "status": "RESERVED",
        "flightBooking": {
            "bookingId": "e32e1cbf-4d6d-431a-a5af-d48570e02666",
            "bookingUri": "http://$CLUSTER_IPADDR/travel-agent/api/bookings/e32e1cbf-4d6d-431a-a5af-d48570e02666",
            "expires": 120000,
            "name": "AA2250",
            "startTime": 1677146471233,
            "type": "FLIGHT"
        },
        "hotelBooking": {
            "bookingId": "e140cdba-30a6-44c0-b7c2-c168f763641c",
            "bookingUri": "http://$CLUSTER_IPADDR/travel-agent/api/bookings/e140cdba-30a6-44c0-b7c2-c168f763641c",
            "expires": 120000,
            "name": "Acme",
            "startTime": 1677146471209,
            "type": "HOTEL"
        }
    }

    このコマンドによってホテルと航空券の予約が行われ、ステータスがRESERVEDになります。

  2. tripBookingIdおよびlinkレスポンス・ヘッダーの値を書き留めます。この情報は次のステップで指定する必要があります。
  3. 予約を確定するか取り消すかを選択できます。次のいずれかのコマンドを実行して、トランザクションを確定するか取り消します。
    • トランザクションを確定するには、次のコマンドを実行します:

      コマンド構文

      curl --location --request PUT -H "Authorization:Bearer $TOKEN" \
           -d '' http://$CLUSTER_IPADDR/travel-agent/api/confirm/tripBookingId

      サンプル・コマンド

      curl -H "Authorization:Bearer $TOKEN" \
           --header 'Accept: application/json' \
           -H "link: <http://192.0.4.1:9000/api/v1/tcc-transaction/4e6dc225-d8af-4988-8446-a70e4cbd1e44>; rel=\"https://otmm.oracle.com/tcc-transaction\""
           -X PUT \
           -d '' "https://$CLUSTER_IPADDR/travel-agent/api/confirm/840c7f0c-d87e-4694-aba5-0846e716ce99"
    • トランザクションを取り消すには、次のコマンドを実行します:

      コマンド構文

      curl --location --request PUT -H "Authorization:Bearer $TOKEN" \
           -d '' https://external-IP-address-Istio-ingress-gateway/travel-agent/api/cancel/tripBookingId

      サンプル・コマンド

      curl -H "Authorization:Bearer $TOKEN" \
           --location \
           --header 'Accept: application/json' \
           -H "link: <http://192.0.4.1:9000/api/v1/tcc-transaction/4e6dc225-d8af-4988-8446-a70e4cbd1e44>; rel=\"https://otmm.oracle.com/tcc-transaction\""
           -X DELETE \
           -d '' "https://$CLUSTER_IPADDR/travel-agent/api/cancel/840c7f0c-d87e-4694-aba5-0846e716ce99"
  4. tripBookingIdを指定して、1つの予約のステータスと詳細を表示します。

    コマンド構文

    curl --location --request GET -H "Authorization:Bearer $TOKEN" \
         https://external-IP-address-Istio-ingress-gateway/travel-agent/api/bookings/tripBookingId

    サンプル・コマンド

    curl -H "Authorization:Bearer $TOKEN" \
         --location \
         --header 'Accept: application/json' \
         -X GET \
         "https://$CLUSTER_IPADDR/travel-agent/api/bookings/840c7f0c-d87e-4694-aba5-0846e716ce99"
  5. 次のコマンドを実行して、すべての予約のステータスおよび詳細を表示します。

    コマンド構文

    curl --location --request GET -H "Authorization:Bearer $TOKEN" \
         https://external-IP-address-Istio-ingress-gateway/travel-agent/api/bookings

    サンプル・コマンド

    curl -H "Authorization:Bearer $TOKEN" \
         --location \
         --header 'Accept: application/json' \
         -X GET \
         "https://$CLUSTER_IPADDR/travel-agent/api/bookings"

7.3.3 Docker SwarmでのサンプルTCCアプリケーションの実行

7.3.3.1 サンプルTCCアプリケーションのDockerイメージの構築

TCCサンプル・アプリケーションは、インストール・バンドルのinstallation_directory/otmm-RELEASE/samples/tccフォルダにあります。

このフォルダには、Java、Node.jsおよびPythonの各言語で記述されたサンプル・コードの個別のフォルダが含まれます。各言語のサンプル・アプリケーション用のフォルダには、3つのマイクロサービスのコード・ファイル、YAMLファイルおよびHelmチャートが含まれています。実行するサンプル・アプリケーションを決定し、選択した言語のDockerイメージを構築します。サンプルTCCアプリケーションの詳細は、サンプルTCCアプリケーションについてを参照してください。
  1. 次のコマンドに示すように、Dockerレジストリの場所をREGISTRY_LOCATIONという名前の環境変数に格納します。
    export REGISTRY_LOCATION=192.0.2.1:5000

    説明

    • 192.0.2.1は、作成したDockerレジストリのIPアドレスです。
    • 5000は、Dockerレジストリ・コンテナが通信するポート番号です。このポートを介したインバウンドおよびアウトバウンドのHTTPSまたはHTTPトラフィックを許可するために必要なネットワーキング・ルールを設定したことを確認します。

    これを行わない場合は、必要なときに、コマンドでIPアドレスを明示的に指定する必要があります。

  2. Python、Java、Node.jsのいずれかのサンプル・アプリケーションを試すかに応じて、次のステップのうちいずれか1つのみを実行し、サンプル・コードを構築し、サンプル内の各マイクロサービスのDockerイメージを作成します。
    • 次のコマンドを実行して、Javaサンプル・アプリケーションのDockerイメージを構築します。
      • 次のコマンドを実行して、航空券アプリケーションを構築します。
        cd installation_directory/otmm-RELEASE/samples/tcc/java/flight-booking
        docker image build -t $REGISTRY_LOCATION/flight-booking:1.0 .
      • 次のコマンドを実行して、ホテル・アプリケーションを構築します。

        cd installation_directory/otmm-RELEASE/samples/tcc/java/hotel-booking
        docker image build -t $REGISTRY_LOCATION/hotel-booking:1.0 .
      • 次のコマンドを実行して、旅行代理店アプリケーションを構築します。

        cd installation_directory/otmm-RELEASE/samples/tcc/java/travel-agent
        docker image build -t $REGISTRY_LOCATION/travel-agent:1.0 .
    • 次のコマンドを実行して、Pythonサンプル・アプリケーションのDockerイメージを構築します。
      • 次のコマンドを実行して、航空券アプリケーションを構築します。

        cd installation_directory/otmm-RELEASE/samples/tcc/python/flight-booking-py
        docker image build -t $REGISTRY_LOCATION/flight-booking-py:1.0 .
      • 次のコマンドを実行して、ホテル・アプリケーションを構築します。

        cd installation_directory/otmm-RELEASE/samples/tcc/python/hotel-booking-py
        docker image build -t $REGISTRY_LOCATION/hotel-booking-py:1.0 .
      • 次のコマンドを実行して、旅行代理店アプリケーションを構築します。

        cd installation_directory/otmm-RELEASE/samples/tcc/python/travel-agent-py
        docker image build -t $REGISTRY_LOCATION/travel-agent-py:1.0 .
    • 次のコマンドを実行して、Node.jsサンプル・アプリケーションのDockerイメージを構築します。
      • 次のコマンドを実行して、航空券アプリケーションを構築します。

        cd installation_directory/otmm-RELEASE/samples/tcc/nodejs/flight
        docker image build -t $REGISTRY_LOCATION/flight:1.0 .
      • 次のコマンドを実行して、ホテル・アプリケーションを構築します。

        cd installation_directory/otmm-RELEASE/samples/tcc/nodejs/hotel
        docker image build -t $REGISTRY_LOCATION/hotel:1.0 .
      • 次のコマンドを実行して、旅行代理店アプリケーションを構築します。

        cd installation_directory/otmm-RELEASE/samples/tcc/nodejs/travel-agent
        docker image build -t $REGISTRY_LOCATION/travel-agent:1.0 .
  3. タグ付けしたDockerイメージを、作成したDockerレジストリにプッシュします。試しているサンプル・アプリケーションの言語に基づいて、次のいずれかのコマンドを実行します。

    Dockerイメージは構築した時点で、ローカルのDockerコンテナ・レジストリで使用可能になります。Dockerイメージをプッシュすると、swarm用に作成したdockerレジストリで使用可能になります。

    構文

    docker push image[:tag]
    • 次のサンプル・コマンドによって、ホテル、航空券および旅行マネージャのJavaアプリケーションのイメージがタグ付けされます。

      サンプル・コマンド

      docker push $REGISTRY_LOCATION/hotel-booking:1.0
      docker push $REGISTRY_LOCATION/flight-booking:1.0
      docker push $REGISTRY_LOCATION/travel-agent:1.0 
    • 次のサンプル・コマンドによって、ホテル、航空券および旅行マネージャのPythonアプリケーションのイメージがタグ付けされます。

      サンプル・コマンド

      docker push $REGISTRY_LOCATION/hotel-booking-py:1.0
      docker push $REGISTRY_LOCATION/flight-booking-py:1.0
      docker push $REGISTRY_LOCATION/travel-agent-py:1.0
    • 次のサンプル・コマンドによって、ホテル、航空券および旅行マネージャのNode.jsアプリケーションのイメージがタグ付けされます。

      サンプル・コマンド

      docker push $REGISTRY_LOCATION/hotel:1.0
      docker push $REGISTRY_LOCATION/flight:1.0
      docker push $REGISTRY_LOCATION/travel-agent:1.0
作成したDockerイメージの名前を書き留めます。次のステップで、イメージの名前をYAMLファイルに指定する必要があります。
7.3.3.2 TCCサンプル・アプリケーションのインストール

Docker SwarmにTCCサンプル・アプリケーションをインストールします。

すべてのSwarmオブジェクトは、スタック・ファイルと呼ばれるマニフェストに記述されています。tmm-stack-compose.yamlスタック・ファイルはinstallation_directory/otmm-<version>/samples/dockerにあります。このYAMLファイルには、TCCサンプル・アプリケーションおよびトランザクション・コーディネータのすべてのコンポーネントおよび構成が指定されます。このファイルを使用して、Docker Swarmでマイクロサービスを実行および管理します。

TCCサンプル・アプリケーションをインストールするには:
  1. リモートDockerリポジトリにアップロードしたすべてのサンプル・アプリケーション・イメージの詳細を指定します。たとえば、$REGISTRY_LOCATION/travel-agent:1.0です。
  2. 変更内容を保存します。
  3. tmm-stack-compose.yamlスタック・ファイルをデプロイします。
    cd installation_directory/otmm-<version>/samples/docker
    docker stack deploy -c tmm-stack-compose.yaml tmmtccdemo

    ここで、tmmtccdemoはインストールするDockerスタックの名前です。他の任意の名前を指定できます。

  4. すべてのサービスの準備ができていることを確認します。次のコマンドを使用して、サービスとそのステータスのリストを取得します。
    docker service ls
サービスの準備ができたら、TCCトランザクションを実行できます。
7.3.3.3 サンプルTCCアプリケーションの実行

このアプリケーションを実行すると、ホテル客室と航空券が予約され、仮予約が行われます。

予約を確定する承認を与えた場合のみ、ホテル客室と航空券の予約が確定されます。仮予約を取り消した場合は、ホテル客室と航空券の仮予約が取り消されます。取消のケースでは、暫定的に押さえていたホテルと航空券を解放し、それらのリソースを使用可能にするためのコードをアプリケーションに含める必要があります。
  1. 次のコマンドを実行して、ホテルと航空券を予約します。

    サンプル・コマンド

    curl -H "Authorization:Bearer $TOKEN" \
         --header 'Accept: application/json' \
         -X POST \
         -d '' "https://$REGISTRY_LOCATION/travel-agent/api/bookings/reserve?hotelName=Acme&flightNumber=AA2250"

    説明

    • REGISTRY_LOCATIONは、Dockerレジストリの場所を格納した変数の名前です。
    • TOKENは、以前に認証トークンを格納した変数の名前です。認証トークンを取得して変数に格納する方法の詳細は、アクセス・トークンの作成を参照してください。

    サンプル・レスポンス

    {
        "tripBookingId": "840c7f0c-d87e-4694-aba5-0846e716ce99",
        "message": "Successfully booked the trip",
        "status": "RESERVED",
        "flightBooking": {
            "bookingId": "e32e1cbf-4d6d-431a-a5af-d48570e02666",
            "bookingUri": "http://$REGISTRY_LOCATION/travel-agent/api/bookings/e32e1cbf-4d6d-431a-a5af-d48570e02666",
            "expires": 120000,
            "name": "AA2250",
            "startTime": 1677146471233,
            "type": "FLIGHT"
        },
        "hotelBooking": {
            "bookingId": "e140cdba-30a6-44c0-b7c2-c168f763641c",
            "bookingUri": "http://$REGISTRY_LOCATION/travel-agent/api/bookings/e140cdba-30a6-44c0-b7c2-c168f763641c",
            "expires": 120000,
            "name": "Acme",
            "startTime": 1677146471209,
            "type": "HOTEL"
        }
    }

    このコマンドによってホテルと航空券の予約が行われ、ステータスがRESERVEDになります。

  2. tripBookingIdおよびlinkレスポンス・ヘッダーの値を書き留めます。この情報は次のステップで指定する必要があります。
  3. 予約を確定するか取り消すかを選択できます。次のいずれかのコマンドを実行して、トランザクションを確定するか取り消します。
    • トランザクションを確定するには、次のコマンドを実行します:

      コマンド構文

      curl --location --request PUT -H "Authorization:Bearer $TOKEN" \
           -d '' http://$REGISTRY_LOCATION/travel-agent/api/confirm/tripBookingId

      サンプル・コマンド

      curl -H "Authorization:Bearer $TOKEN" \
           --header 'Accept: application/json' \
           -H "link: <http://192.0.4.1:9000/api/v1/tcc-transaction/4e6dc225-d8af-4988-8446-a70e4cbd1e44>; rel=\"https://otmm.oracle.com/tcc-transaction\""
           -X PUT \
           -d '' "https://$REGISTRY_LOCATION/travel-agent/api/confirm/840c7f0c-d87e-4694-aba5-0846e716ce99"
    • トランザクションを取り消すには、次のコマンドを実行します:

      コマンド構文

      curl --location --request PUT -H "Authorization:Bearer $TOKEN" \
           -d '' https://REGISTRY_LOCATION/travel-agent/api/cancel/tripBookingId

      サンプル・コマンド

      curl -H "Authorization:Bearer $TOKEN" \
           --location \
           --header 'Accept: application/json' \
           -H "link: <http://192.0.4.1:9000/api/v1/tcc-transaction/4e6dc225-d8af-4988-8446-a70e4cbd1e44>; rel=\"https://otmm.oracle.com/tcc-transaction\""
           -X DELETE \
           -d '' "https://$REGISTRY_LOCATION/travel-agent/api/cancel/840c7f0c-d87e-4694-aba5-0846e716ce99"
  4. tripBookingIdを指定して、1つの予約のステータスと詳細を表示します。

    コマンド構文

    curl --location --request GET -H "Authorization:Bearer $TOKEN" \
         https://REGISTRY_LOCATION/travel-agent/api/bookings/tripBookingId

    サンプル・コマンド

    curl -H "Authorization:Bearer $TOKEN" \
         --location \
         --header 'Accept: application/json' \
         -X GET \
         "https://$REGISTRY_LOCATION/travel-agent/api/bookings/840c7f0c-d87e-4694-aba5-0846e716ce99"
  5. 次のコマンドを実行して、すべての予約のステータスおよび詳細を表示します。

    コマンド構文

    curl --location --request GET -H "Authorization:Bearer $TOKEN" \
         https://REGISTRY_LOCATION/travel-agent/api/bookings

    サンプル・コマンド

    curl -H "Authorization:Bearer $TOKEN" \
         --location \
         --header 'Accept: application/json' \
         -X GET \
         "https://$REGISTRY_LOCATION/travel-agent/api/bookings"