Spring Boot 2.1.x ランタイムガイド


序文

本ガイドでは、概念と、開発者が Spring Boot ランタイムを使用するために必要な実用的な詳細について説明します。OpenShift では、Linux コンテナーとしてデプロイされた Spring Boot アプリケーションの設計を制御する情報を提供します。

第1章 Spring Boot でのアプリケーション開発の概要

本セクションでは、Red Hat ランタイムを使用したアプリケーション開発の基本概念を説明します。また、Spring Boot ランタイムの概要も提供します。

1.1. Red Hat ランタイムを使用したアプリケーション開発の概要

Red Hat OpenShift は、クラウドネイティブランタイムのコレクションを提供するコンテナーアプリケーションプラットフォームです。ランタイムを使用して、Java または JavaScript アプリケーションを OpenShift で開発、ビルド、およびデプロイできます。

Red Hat Runtimes for OpenShift を使用したアプリケーション開発には、以下が含まれます。

  • Eclipse Vert.x、Thorntail、Spring Boot など、OpenShift で実行するように設計されたランタイムのコレクション。
  • OpenShift 上のクラウドネイティブ開発への説明的なアプローチ。

OpenShift は、アプリケーションのデプロイメントおよびモニタリングの管理、保護、自動化に役立ちます。ビジネスの問題を小規模なマイクロサービスに分割し、OpenShift を使用してマイクロサービスをデプロイし、監視し、維持することができます。サーキットブレーカー、ヘルスチェック、サービス検出などのパターンをアプリケーションに実装できます。

クラウドネイティブの開発は、クラウドコンピューティングを最大限に活用します。

アプリケーションをビルド、デプロイ、および管理できます。

OpenShift Container Platform
Red Hat によるプライベートのオンプレミスクラウド
Red Hat Container Development Kit(Minishift)
ローカルマシンにインストールおよび実行可能なローカルクラウド。この機能は、Red Hat Container Development Kit (CDK)または Minishift によって提供されます。
Red Hat CodeReady Studio
アプリケーションの開発、テスト、デプロイのための統合開発環境(IDE)。

アプリケーションの開発を始めるのに役立つため、アプリケーションの例ですべてのランタイムを利用できます。これらのサンプルアプリケーションは、Developer Launcher からアクセスできます。サンプルをテンプレートとして使用してアプリケーションを作成することができます。アプリケーションの例の詳細は、「サンプルアプリケーションの 概要」を参照してください。

本ガイドでは、Spring Boot ランタイムについて詳しく説明します。他の ランタイムの詳細は、関連するランタイムドキュメントを参照してください

1.2. Developer Launcher を使用した Red Hat OpenShift でのアプリケーション開発

Developer Launcher(developers.redhat.com/launch)を使用して、OpenShift でのクラウドネイティブアプリケーションの開発 を開始することができます。Red Hat が提供するサービスです。

Developer Launcher はスタンドアロンのプロジェクトジェネレーターです。これを使用して、OpenShift Container Platform、Minishift、または CDK などの OpenShift インスタンスでアプリケーションをビルドし、デプロイできます。

Developer Launcher でアプリケーションをダウンロードし、デプロイする方法は「Developer Launcher を 使用したアプリケーションのダウンロードおよびデプロイ」を参照してください。

1.3. Spring Boot の概要

Spring Boot を使用すると、スタンドアロンの Spring ベースのアプリケーションを作成できます。Spring Boot に関するドキュメントの一覧は、「 追加のリソース 」を参照してください。

OpenShift 上の Spring Boot は、Spring Boot の簡素化されたアプリケーション開発機能と、OpenShift のインフラストラクチャーおよびコンテナーオーケストレーションの機能を組み合わせたものです。以下に例を示します。

  • ローリングアップデート
  • サービスディスカバリー
  • カナリアデプロイメント
  • 一般的なマイクロサービスパターンを実装する方法: 外部化設定、ヘルスチェック、サーキットブレーカー、フェイルオーバー

1.3.1. Spring Boot の機能およびフレームワークの概要

本ガイドでは、Spring Boot を使用した最新のアプリケーションの設計について説明します。これらの概念は、HTTP コネクターまたは非ブロッキング HTTP コネクターのいずれかを使用した Web または Websocket アプリケーションの開発をサポートします。アプリケーションは、変更なしにパッケージ化およびデプロイでき、OpenShift でクラウドネイティブ機能を使用するように更新できます。

以下の表の機能は、OpenShift で実行されるサンプルアプリケーションの集合として利用できます。一部の機能は Kubernetes にネイティブで、Spring Cloud Kubernetes から利用できます。Actuator などの機能は Spring Boot で直接利用できます。

表1.1 機能およびフレームワークの概要

機能問題アドレスCloud NativeFramework

サーキットブレーカー

サービス間の切り替えを行い、サービスに障害が発生した場合に中断せずに受信したリクエストの処理を継続します。

はい

Spring Cloud Netflix: Hystrix

ヘルスチェック

サービスの readiness および liveness を確認します。プローブが失敗すると、サービスが自動的に再起動します。

はい

Spring Boot Actuator

Service Discovery// include::modules/TEMPLATE_CONCEPT_explaining_a_concept.adoc[leveloffset=+1]

OpenShift にデプロイされたサービス/エンドポイントを検出し、DNS エントリーに一致するサービス名を使用してサービスまたはルートの背後で公開されます。

◯: Kubernetes API の使用

Spring Cloud Kubernetes: DiscoveryClient

サーバー側負荷分散

複数のサービスインスタンスをデプロイし、それらのインスタンス間で負荷を透過的に分散することで、負荷が増大します。

◯: 内部 Kubernetes ロードバランサーの使用

-

Externalize パラメーター

実行される環境からアプリケーションを独立させます。

◯ - Kubernetes ConfigMap または Secret

Spring Cloud Kubernetes: ConfigMap

1.3.2. アプリケーションの例

クラウドネイティブアプリケーションやサービスのビルド方法を示すアプリケーションの例が挙げられます。これらは、アプリケーション開発時に使用すべき、規定アーキテクチャー、設計パターン、ツール、およびベストプラクティスを示しています。アプリケーションの例は、クラウドネイティブマイクロサービスを作成するためのテンプレートとして使用できます。本ガイドで説明されているデプロイメントプロセスを使用して、これらのサンプルを更新および再デプロイできます。

この例では、以下のような マイクロサービスパターン を実装します。

  • REST API の作成
  • データベースの相互運用
  • ヘルスチェックパターンの実装
  • アプリケーションの設定の外部化により、それらをよりセキュアにし、スケーリングが容易になります。

サンプルアプリケーションを以下のように使用することができます。

  • テクノロジーの実例
  • プロジェクトのアプリケーションの開発方法を理解するためのツールまたはサンドボックス
  • 独自のユースケースの更新または拡張の開始点

各アプリケーションは 1 つ以上のランタイムに実装されます。たとえば、REST API Level 0 の例は以下のランタイムで利用できます。

以降のセクションでは、Spring Boot ランタイムに実装されたアプリケーションの例を説明します。

第2章 Spring Boot を使用するためのアプリケーションの設定

アプリケーションのルートディレクトリーにある pom.xml ファイルで Spring Boot BOM(Bill of Materials)アーティファクトを参照します。

前提条件

  • Maven ベースのアプリケーション

手順

  1. pom.xml ファイルを開き、me.snowdrop:spring-boot-bom アーティファクトを <dependencyManagement> セクションに追加し、およびを指定し <type>pom</type> <scope>import</scope>ます。

    <project>
      ...
      <dependencyManagement>
        <dependencies>
          <dependency>
            <groupId>me.snowdrop</groupId>
            <artifactId>spring-boot-bom</artifactId>
            <version>2.1.15.Final-redhat-00001</version>
            <type>pom</type>
            <scope>import</scope>
          </dependency>
        </dependencies>
      </dependencyManagement>
      ...
    </project>
  2. 以下のプロパティーを含めて、Spring Boot のバージョンおよび使用している Spring Boot Maven プラグインのバージョンを追跡します。

    <project>
      ...
      <properties>
        <spring-boot.version>2.1.15.RELEASE</spring-boot.version>
        <spring-boot-maven-plugin.version>2.1.15.RELEASE</spring-boot-maven-plugin.version>
      </properties>
      ...
    </project>
  3. Spring Boot Starters および Spring Boot Maven プラグインが含まれるリポジトリーを指定します。

      <!-- Specify the repositories containing Spring Boot artifacts. -->
      <repositories>
        <repository>
          <id>redhat-ga</id>
          <name>Red Hat GA Repository</name>
          <url>https://maven.repository.redhat.com/ga/</url>
        </repository>
      </repositories>
    
      <!-- Specify the repositories containing the plugins used to execute the build of your application. -->
      <pluginRepositories>
        <pluginRepository>
          <id>redhat-ga</id>
          <name>Red Hat GA Repository</name>
          <url>https://maven.repository.redhat.com/ga/</url>
        </pluginRepository>
      </pluginRepositories>
  4. アプリケーションのパッケージ化に使用されるプラグイン spring-boot-maven-plugin として参照します。

    <project>
      ...
      <build>
        <plugins>
            ...
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>${spring-boot-maven-plugin.version}</version>
                <executions>
                    <execution>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                  </executions>
                <configuration>
                    <redeploy>true</redeploy>
                </configuration>
            </plugin>
            ...
        </plugins>
      </build>
      ...
    </project>

関連情報

  • Spring Boot アプリケーションのパッケージ化に関する詳細は、Spring Boot Maven Plugin ドキュメントを参照してください。

第3章 Developer Launcher を使用したアプリケーションのダウンロードおよびデプロイ

本セクションでは、ランタイムで提供されるサンプルアプリケーションをダウンロードしてデプロイする方法を説明します。アプリケーションの例は、Developer Launcher で利用できます。

3.1. 開発者ランチャーの使用

Developer Launcher(developers.redhat.com/launch) は OpenShift で実行されます。アプリケーションの例をデプロイする場合、Developer Launcher は以下の手順を説明します。

  • ランタイムの選択
  • アプリケーションのビルドおよび実行

Developer Launcher は選択に基づいてカスタムプロジェクトを生成します。ZIP バージョンのプロジェクトをダウンロードするか、または OpenShift Online インスタンスでアプリケーションを直接起動することができます。

Developer Launcher を使用してアプリケーションを OpenShift にデプロイする場合、Source-to-Image(S2I)ビルドプロセスが使用されます。このビルドプロセスは、OpenShift でアプリケーションを実行するために必要なすべての設定、ビルド、およびデプロイメント手順を処理します。

3.2. Developer Launcher を使用したアプリケーションサンプルのダウンロード

Red Hat は、Spring Boot ランタイムの使用に役立つサンプルアプリケーションを提供します。これらの例は、Developer Launcher(developers.redhat.com/launch) で利用できます。

アプリケーションの例をダウンロードし、ビルドし、デプロイできます。本セクションでは、アプリケーションの例をダウンロードする方法を説明します。

サンプルアプリケーションをテンプレートとして使用して、独自のクラウドネイティブアプリケーションを作成することができます。

手順

  1. Developer Launcher(developers.redhat.com/launch) に移動します。
  2. Start をクリックします。
  3. Deploy an Example Application をクリックします。
  4. Select an Example をクリックし、ランタイムで使用できるサンプルアプリケーションの一覧を表示します。
  5. ランタイムを選択します。
  6. アプリケーションの例を選択します。

    注記

    アプリケーションの例は、複数のランタイムで利用できます。前の手順でランタイムを選択していない場合は、サンプルアプリケーションで利用可能なランタイム一覧からランタイムを選択できます。

  7. ランタイムのリリースバージョンを選択します。ランタイムに記載されているコミュニティーまたは製品リリースから選択できます。
  8. 保存 をクリックします。
  9. Download をクリックしてサンプルアプリケーションを ダウンロード します。

    ソースファイルおよびドキュメントファイルを含む ZIP ファイルがダウンロードされます。

3.3. OpenShift Container Platform または CDK(Minishift)へのアプリケーションのデプロイ

サンプルアプリケーションを OpenShift Container Platform または CDK(Minishift)のいずれかにデプロイできます。アプリケーションのデプロイ先に応じて、認証に関連する Web コンソールを使用します。

前提条件

  • Developer Launcher を使用して作成されたアプリケーションプロジェクトの例
  • アプリケーションを OpenShift Container Platform にデプロイする場合は、OpenShift Container Platform Web コンソールにアクセスできる必要があります。
  • CDK(Minishift)にアプリケーションをデプロイする場合は、CDK(Minishift)Web コンソールにアクセスできる必要があります。
  • oc コマンドラインクライアントがインストールされている。

手順

  1. アプリケーションのサンプルをダウンロードします。
  2. oc コマンドラインクライアントを使用して、OpenShift Container Platform または CDK(Minishift)にサンプルアプリケーションをデプロイすることができます。

    Web コンソールによって提供されるトークンを使用してクライアントを認証する必要があります。アプリケーションのデプロイ先に応じて、OpenShift Container Platform Web コンソールまたは CDK(Minishift)Web コンソールを使用します。クライアントの認証を行うには、以下の手順を実行します。

    1. Web コンソールにログインします。
    2. Web コンソールの右上隅にある疑問符アイコンをクリックします。
    3. 一覧から Command Line Tools を選択します。
    4. oc login コマンドをコピーします。
    5. ターミナルにコマンドを貼り付け、oc CLI クライアントをアカウントで認証します。

      $ oc login OPENSHIFT_URL --token=MYTOKEN
  3. ZIP ファイルの内容を展開します。

    $ unzip MY_APPLICATION_NAME.zip
  4. OpenShift で新規プロジェクトを作成します。

    $ oc new-project MY_PROJECT_NAME
  5. のルートディレクトリーに移動し MY_APPLICATION_NAMEます。
  6. Maven を使用してサンプルアプリケーションをデプロイします。

    $ mvn clean fabric8:deploy -Popenshift

    注記: アプリケーションによっては、追加の設定が必要になる場合があります。サンプルアプリケーションをビルドおよびデプロイするには、README ファイルに記載されている手順に従います。

  7. アプリケーションのステータスを確認し、Pod が実行されていることを確認します。

    $ oc get pods -w
    NAME                             READY     STATUS      RESTARTS   AGE
    MY_APP_NAME-1-aaaaa               1/1       Running     0          58s
    MY_APP_NAME-s2i-1-build           0/1       Completed   0          2m

    MY_APP_NAME-1-aaaaa Pod の状態は、完全にデプロイされ、起動した Running 後のステータスになります。アプリケーションの Pod 名は異なる場合があります。Pod 名の数値は、新規ビルドごとに増加します。末尾の文字は、Pod の作成時に生成されます。

  8. サンプルアプリケーションをデプロイし、起動した後に、そのルートを決定します。

    ルート情報の例

    $ oc get routes
    NAME                 HOST/PORT                                                     PATH      SERVICES        PORT      TERMINATION
    MY_APP_NAME         MY_APP_NAME-MY_PROJECT_NAME.OPENSHIFT_HOSTNAME      MY_APP_NAME      8080

    Pod のルート情報は、アクセスに使用できるベース URL を提供します。この例では、をベース URL http://MY_APP_NAME-MY_PROJECT_NAME.OPENSHIFT_HOSTNAME として使用し、アプリケーションにアクセスできます。

第4章 Spring Boot ランタイムアプリケーションの開発およびデプロイ

サンプルを使用する 他に、新規 Spring Boot アプリケーションをゼロから作成し、それらを OpenShift にデプロイできます。

Spring Boot アプリケーションでサポートおよびテストされた Maven アーティファクトを指定および使用する場合は、OpenShift Application Runtimes Spring Boot BOM を使用することが推奨されます。

4.1. Spring Boot アプリケーションの開発

Spring Boot の基本的なアプリケーションでは以下を作成する必要があります。

  • Spring Boot メソッドが含まれる Java クラス。
  • アプリケーションをビルドするために必要な Maven が必要とする情報が含まれる pom.xml ファイル。

以下の手順では、"{"content":"Greetings!"}" を応答として返す単純な Greeting アプリケーションを作成します。

注記

アプリケーションを OpenShift にビルドおよびデプロイする場合、Spring Boot 2.1.x は、OpenJDK 8 および OpenJDK 11 に基づくビルダーイメージのみをサポートします。Oracle JDK および OpenJDK 9 ビルダーイメージはサポートされていません。

前提条件

  • Maven がインストールされている。
  • OpenJDK 8 または OpenJDK 11 がインストールされている。

手順

  1. 新しいディレクトリーを作成し myApp、これに移動します。

    $ mkdir myApp
    $ cd myApp

    これはアプリケーションのルートディレクトリーです。

  2. ルートディレクトリー src/main/java/com/example/ にディレクトリー構造を作成し、そのディレクトリーに移動します。

    $ mkdir -p src/main/java/com/example/
    $ cd src/main/java/com/example/
  3. アプリケーションコードが MyApp.java 含まれる Java クラスファイルを作成します。

    package com.example;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.ResponseBody;
    import org.springframework.web.bind.annotation.RestController;
    
    @SpringBootApplication
    @RestController
    public class MyApp {
    
        public static void main(String[] args) {
            SpringApplication.run(MyApp.class, args);
        }
    
        @RequestMapping("/")
        @ResponseBody
        public Message displayMessage() {
            return new Message();
        }
    
        static class Message {
            private String content = "Greetings!";
    
            public String getContent() {
                return content;
            }
    
            public void setContent(String content) {
                this.content = content;
            }
        }
    }
  4. 以下の内容を myApp 含む、アプリケーションの root ディレクトリーに pom.xml ファイルを作成します。

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
      <modelVersion>4.0.0</modelVersion>
    
      <groupId>com.example</groupId>
      <artifactId>my-app</artifactId>
      <version>1.0.0-SNAPSHOT</version>
    
      <name>MyApp</name>
      <description>My Application</description>
    
      <!-- Specify the JDK builder image used to build your application. -->
      <!-- Use OpenJDK 8 and OpenJDK 11-based images. OracleJDK-based images are not supported. -->
      <properties>
        <fabric8.generator.from>registry.access.redhat.com/redhat-openjdk-18/openjdk18-openshift:latest</fabric8.generator.from>
      </properties>
    
      <!-- Import dependencies from the Spring Boot BOM. -->
      <dependencyManagement>
        <dependencies>
          <dependency>
            <groupId>me.snowdrop</groupId>
            <artifactId>spring-boot-bom</artifactId>
            <version>2.1.15.Final-redhat-00001</version>
            <type>pom</type>
            <scope>import</scope>
          </dependency>
        </dependencies>
      </dependencyManagement>
    
      <dependencies>
          <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
          </dependency>
          <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
          </dependency>
          <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
          </dependency>
      </dependencies>
    
      <build>
        <plugins>
          <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <version>2.1.15.RELEASE</version>
          </plugin>
        </plugins>
      </build>
    
      <!-- Specify the repositories containing Spring Boot artifacts -->
      <repositories>
        <repository>
          <id>redhat-ga</id>
          <name>Red Hat GA Repository</name>
          <url>https://maven.repository.redhat.com/ga/</url>
        </repository>
      </repositories>
    
      <pluginRepositories>
        <pluginRepository>
          <id>redhat-ga</id>
          <name>Red Hat GA Repository</name>
          <url>https://maven.repository.redhat.com/ga/</url>
        </pluginRepository>
      </pluginRepositories>
    
    </project>
  5. アプリケーションのルートディレクトリーから Maven を使用してアプリケーションをビルドします。

    $ mvn spring-boot:run
  6. アプリケーションが実行されていることを確認します。

    curl またはブラウザーを使用して、アプリケーションがで実行されていることを確認し http://localhost:8080ます。

    $ curl http://localhost:8080
    {"content":"Greetings!"}

関連情報

  • OpenShift で実行する際のアプリケーションのヘルスモニタリングを有効にするために liveness および readiness プローブを設定できます。OpenShift でのアプリケーションのヘルスモニタリングがどのように機能するかを確認するには、Health Check の例 を試してください。

4.2. Spring Boot アプリケーションの OpenShift へのデプロイ

Spring Boot アプリケーションを OpenShift にデプロイするには、pom.xml ファイルをアプリケーションに設定してから Fabric8 Maven プラグインを使用します。pom.xml ファイルの fabric8.generator.from URL を置き換えて、OpenJDK イメージを指定できます。

4.2.1. Red Hat Enterprise Linux 用の OpenJDK イメージ

アプリケーションを OpenShift にビルドし、デプロイするために使用する OpenJDK イメージを選択できます。OpenJDK イメージは、OpenJDK 8 または OpenJDK 11 で RHEL 7 および RHEL 8 で利用できます。

RHEL 8 イメージにアクセスするには、Red Hat Ecosystem Catalog への Docker または podman 認証が必要です。認証手順は、以下の表の Red Hat Ecosystem Catalog リンクで提供されています。

注記

OpenShift 3 や OpenShift 4 など、RHEL 7 ホストで RHEL 8 ベースのコンテナーを使用すると、サポートは限定されます。詳細は「 Red Hat Enterprise Linux コンテナー互換性マトリックス 」を参照してください。

4.2.2. OpenShift デプロイメント用の Spring Boot アプリケーションの準備

Spring Boot アプリケーションを OpenShift にデプロイするには、以下が含まれている必要があります。

  • アプリケーションの pom.xml ファイルにあるランチャープロファイル情報。

以下の手順では、Fabric8 Maven プラグインのあるプロファイルを使用して、アプリケーションを OpenShift にビルドし、デプロイします。

前提条件

  • Maven がインストールされている。
  • RHEL 8 イメージにアクセスするために、Red Hat Ecosystem Catalog への Docker または podman 認証

手順

  1. アプリケーションの root ディレクトリーの pom.xml ファイルに以下の内容を追加します。

    ...
    
    <profiles>
        <profile>
          <id>openshift</id>
          <build>
            <plugins>
              <plugin>
                <groupId>io.fabric8</groupId>
                <artifactId>fabric8-maven-plugin</artifactId>
                <version>4.4.1</version>
                <executions>
                  <execution>
                    <goals>
                      <goal>resource</goal>
                      <goal>build</goal>
                    </goals>
                  </execution>
                </executions>
              </plugin>
            </plugins>
          </build>
        </profile>
    </profiles>
  2. pom.xml ファイルの fabric8.generator.from プロパティーを置き換え、OpenJDK イメージを指定します。

    • RHEL 7 と OpenJDK 8 の組み合わせ

      <fabric8.generator.from>registry.access.redhat.com/redhat-openjdk-18/openjdk18-openshift:latest</fabric8.generator.from>
    • RHEL 7 と OpenJDK 11 の組み合わせ

      <fabric8.generator.from>registry.access.redhat.com/openjdk/openjdk-11-rhel7:latest</fabric8.generator.from>
    • RHEL 8 と OpenJDK 8 の組み合わせ

      <fabric8.generator.from>registry.redhat.io/openjdk/openjdk-8-rhel8:latest</fabric8.generator.from>
    • RHEL 8 と OpenJDK 11 の組み合わせ

      <fabric8.generator.from>registry.redhat.io/openjdk/openjdk-11-rhel8:latest</fabric8.generator.from>

4.2.3. Fabric8 Maven プラグインを使用した Spring Boot アプリケーションの OpenShift へのデプロイ

Spring Boot アプリケーションを OpenShift にデプロイするには、以下を実行する必要があります。

  • OpenShift インスタンスにログインします。
  • アプリケーションを OpenShift インスタンスにデプロイします。

前提条件

  • oc CLI クライアントがインストールされている。
  • Maven がインストールされている。

手順

  1. oc クライアントを使用して OpenShift インスタンスにログインします。

    $ oc login ...
  2. OpenShift インスタンスで新規プロジェクトを作成します。

    $ oc new-project MY_PROJECT_NAME
  3. アプリケーションの root ディレクトリーから Maven を使用してアプリケーションを OpenShift にデプロイします。アプリケーションのルートディレクトリーには pom.xml ファイルが含まれます。

    $ mvn clean fabric8:deploy -Popenshift

    このコマンドは Fabric8 Maven Plugin を使用して OpenShift で S2I プロセス を起動し、Pod を起動します。

  4. デプロイメントを確認します。

    1. アプリケーションのステータスを確認し、Pod が実行されていることを確認します。

      $ oc get pods -w
      NAME                             READY     STATUS      RESTARTS   AGE
      MY_APP_NAME-1-aaaaa               1/1       Running     0          58s
      MY_APP_NAME-s2i-1-build           0/1       Completed   0          2m

      MY_APP_NAME-1-aaaaa Pod のステータスは、Running 完全にデプロイされ、起動されるとのステータスになります。

      特定の Pod 名は異なります。

    2. Pod のルートを判別します。

      ルート情報の例

      $ oc get routes
      NAME                 HOST/PORT                                                     PATH      SERVICES        PORT      TERMINATION
      MY_APP_NAME         MY_APP_NAME-MY_PROJECT_NAME.OPENSHIFT_HOSTNAME      MY_APP_NAME      8080

      Pod のルート情報は、アクセスに使用するベース URL を提供します。

      この例で http://MY_APP_NAME-MY_PROJECT_NAME.OPENSHIFT_HOSTNAME は、はアプリケーションにアクセスするためのベース URL です。

    3. アプリケーションが OpenShift で実行されていることを確認します。

      $ curl http://MY_APP_NAME-MY_PROJECT_NAME.OPENSHIFT_HOSTNAME
      {"content":"Greetings!"}

4.3. スタンドアロン Red Hat Enterprise Linux への Spring Boot アプリケーションのデプロイ

Spring Boot アプリケーションをスタンドアロン Red Hat Enterprise Linux にデプロイするには、java -jar コマンドを使用して pom.xml ファイルをアプリケーションで設定し、Maven を使用してパッケージ化し、デプロイします。

前提条件

  • RHEL 7 または RHEL 8 がインストールされている。

4.3.1. スタンドアロン Red Hat Enterprise Linux デプロイメント向けの Spring Boot アプリケーションの準備

Spring Boot アプリケーションをスタンドアロン Red Hat Enterprise Linux にデプロイするには、最初に Maven を使用してアプリケーションをパッケージ化する必要があります。

前提条件

  • Maven がインストールされている。

手順

  1. 以下の内容をアプリケーションの root ディレクトリーの pom.xml ファイルに追加します。

      ...
      <!-- Specify target artifact type for the repackage goal. -->
      <packaging>jar</packaging>
      ...
      <build>
        <plugins>
          <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <version>${spring-boot.version}</version>
            <executions>
              <execution>
                  <goals>
                   <goal>repackage</goal>
                 </goals>
              </execution>
            </executions>
          </plugin>
        </plugins>
      </build>
      ...
  2. Maven を使用してアプリケーションをパッケージ化します。

    $ mvn clean package

    生成される JAR ファイルは target ディレクトリーにあります。

4.3.2. jar を使用したスタンドアロンの Red Hat Enterprise Linux への Spring Boot アプリケーションのデプロイ

Spring Boot アプリケーションをスタンドアロンの Red Hat Enterprise Linux にデプロイするには、java -jar コマンドを使用します。

前提条件

  • RHEL 7 または RHEL 8 がインストールされている。
  • OpenJDK 8 または OpenJDK 11 がインストールされている。
  • アプリケーションを含む JAR ファイル。

手順

  1. アプリケーションで JAR ファイルをデプロイします。

    $ java -jar my-project-1.0.0.jar
  2. デプロイメントを確認します。

    curl またはブラウザーを使用して、アプリケーションがで実行されていることを確認し http://localhost:8080ます。

    $ curl http://localhost:8080

第5章 Eclipse Vert.x で Spring Boot を使用したリアクティブアプリケーションの開発

注記

Spring Boot の Eclipse Vert.x 再アクティブコンポーネントは テクノロジープレビュー として提供されます。

ここでは、Spring Boot および Eclipse Vert.x をベースとした Spring Boot スターターを使用した反応的な方法でアプリケーションの開発を説明します。以下の例は、スターターを使用して反応的アプリケーションを作成する方法を示しています。

5.1. Eclipse Vert.x での Spring Boot の概要

Spring の反応的スタックは、バックプレッシャーを実装し、Reactive Streams 仕様に準拠する反応的ライブラリーである Project Reactor で構築されます。これは、非同期イベントストリームの処理を有効にする Flux および Mono 機能する API タイプを提供します。

Spring は Project Reactor に加えて、非同期 イベント駆動型の Web アプリケーションフレームワークである WebFlux を提供します。WebFlux は主に Reactor Netty と連携するように設計されていますが、Eclipse Vert.x などの他の反応的な HTTP サーバーでも動作します。

Spring WebFlux および Reactor を使用すると、以下のようなアプリケーションを作成できます。

  • non-blocking: アプリケーションは、現在のリクエストの完了に必要なリモートコンポーネントまたはサービスからの応答を待機するときに追加のリクエストを処理を継続します。
  • 非同期 - アプリケーションは、応答イベントを生成し、アプリケーションの他のクライアントが検出できるイベントストリームにパブリッシュすることで、イベントストリームからイベントに応答します。
  • イベント駆動型 - アプリケーションは、ユーザーが生成したイベント、またはマウスクリック、HTTP 要求、ストレージに追加される新しいファイルなどの別のサービスに応答します。
  • スケーラブル - アプリケーションの必要なイベント処理容量に一致させるように、または Subscriber の数を増やすと、アプリケーションの個々のクライアント間でルーティング要求の複雑性がわずかに増大します。反応的なアプリケーションは、他のアプリケーションプログラミングモデルと比較して、コンピューティングリソースやネットワークリソースよりも少ないイベントを処理することができます。
  • Resilient: アプリケーションは、サービス全体の品質に影響を及ぼさずに、依存するサービスの障害を処理できます。

Spring WebFlux を使用するその他の利点は次のとおりです。

SpringMVC と同様
SpringMVC API タイプと WebFlux API タイプは同じで、開発者は WebFlux を使用するアプリケーションをプログラミングするために SpringMVC に関する知識を簡単に適用できます。

Red Hat による Spring Reactive オファリングは、Reactor および WebFlux の利点を OpenShift およびスタンドアロン RHEL に提供し、WebFLux フレームワークの Eclipse Vert.x 拡張セットを導入しています。これにより、Spring Boot の抽象化および迅速なプロトタイプ機能のレベルを維持し、完全に反応的にアプリケーションでサービス間のネットワーク通信を処理する非同期 IO API を提供します。

アノテーション付きコントローラーのサポート
WebFlux は SpringMVC によって導入されたエンドポイントコントローラーアノテーションを保持します(SpringMVC および WebFlux は反応的 RxJava2 および Reactor の戻りタイプをサポートします)。
機能プログラミングサポート
また、Java 8 Functional API だけでなく、CompletablebFuture、および API と対話し Stream ます。アノテーションベースのエンドポイントに加え、WebFlux は機能エンドポイントもサポートします。

関連情報

Spring Reactive スタックに含まれるテクノロジーの実装詳細に関する詳細は、以下のリソースを参照してください。

5.2. 反応的な Spring Web

spring-web モジュールは、以下を含む Spring WebFlux の反応的機能の基盤要素を 提供します。

  • HttpHandler APIが提供する HTTP 抽象化
  • サポートされるサーバーに対する reactive Streams アダプター(Eclipse Vert.x、Undertow など)
  • イベントストリームデータをエンコードおよびデコードするためのコーデック。これには以下が含まれます。

    • DataBuffer: 異なるタイプのバイトバッファー表現の抽象化(Netty ByteBuf java.nio.ByteBuffer、およびその他のもの)
    • HTTP とは独立してコンテンツをエンコードおよびデコードする低レベルの契約
    • HttpMessageReader HTTP メッセージ HTTPMessageWriter コンテンツをエンコードおよびデコードするためのコントラクト
  • WebHandler API(非ブロッキングコントラクトを使用する Servlet 3.1 I/O API に適しています)。

Web アプリケーションを設計する場合、Spring WebFlux が提供する 2 つのプログラミングモデルを選択できます。

アノテーション付きコントローラー
Spring WebFlux のアノテーション付きコントローラーは Spring MVC と一貫性があり、spring-web モジュールからの同じアノテーションに基づいています。WebFlux カウンターパートでは、SpringMVC の spring-web モジュールの他に、反応的な @RequestBody 引数もサポートします。
機能エンドポイント
Java 8 Lambda 式および機能 API の Spring WebFlux が提供する機能エンドポイント。このプログラミングモデルは、要求をルーティングし、処理する専用のライブラリー(Reactor)に依存します。Intent の宣言に依存し、コールバックを使用してアクティビティーを完了するアノテーションベースのエンドポイントコントローラーとは異なり、機能エンドポイントに基づくリアクティブモデルにより、要求処理がアプリケーションによって完全に制御されます。

5.3. WebFlux を使用した反応的な Spring Boot HTTP サービスの作成

Spring Boot および WebFlux を使用して、基本的な再アクティブな Hello World HTTP Web サービスを作成します。

前提条件

手順

  1. プロジェクトの pom.xml ファイルに依存関係 vertx-spring-boot-starter-http として追加します。

    pom.xml

    <project>
    ...
      <dependencies>
      ...
        <dependency>
          <groupId>dev.snowdrop</groupId>
          <artifactId>vertx-spring-boot-starter-http</artifactId>
        </dependency>
      ...
      <dependencies>
    ...
    </project>

  2. アプリケーションのメインクラスを作成し、ルーターおよびハンドラーメソッドを定義します。

    HttpSampleApplication.java

    package dev.snowdrop.vertx.sample.http;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.context.annotation.Bean;
    import org.springframework.web.reactive.function.server.RouterFunction;
    import org.springframework.web.reactive.function.server.ServerRequest;
    import org.springframework.web.reactive.function.server.ServerResponse;
    import reactor.core.publisher.Mono;
    
    import static org.springframework.web.reactive.function.BodyInserters.fromObject;
    import static org.springframework.web.reactive.function.server.RouterFunctions.route;
    import static org.springframework.web.reactive.function.server.ServerResponse.ok;
    
    @SpringBootApplication
    public class HttpSampleApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(HttpSampleApplication.class, args);
        }
    
        @Bean
        public RouterFunction<ServerResponse> helloRouter() {
            return route()
                .GET("/hello", this::helloHandler)
                .build();
        }
    
        private Mono<ServerResponse> helloHandler(ServerRequest request) {
            String name = request
                .queryParam("name")
                .orElse("World");
            String message = String.format("Hello, %s!", name);
    
            return ok()
                .body(fromObject(message));
        }
    }

  3. オプション: アプリケーションをローカルで実行し、テストします。

    1. Maven プロジェクトの root ディレクトリーに移動します。

      $ cd myApp
    2. アプリケーションをパッケージ化します。

      $ mvn clean package
    3. コマンドラインからアプリケーションを起動します。

      $ java -jar target/vertx-spring-boot-sample-http.jar
    4. 新しいターミナルウィンドウで、/hello エンドポイントに HTTP 要求を発行します。

      $ curl localhost:8080/hello
      Hello, World!
    5. カスタマイズした応答を取得するために、要求にカスタム名を指定します。

      $ curl http://localhost:8080/hello?name=John
      Hello, John!

関連情報

5.4. 反応的な Spring Boot WebFlux アプリケーションでの Basic 認証の使用。

Spring Security および WebFlux スターターを使用して、基本的なフォームベースの認証で反応的な Hello World HTTP Web サービスを作成します。

前提条件

手順

  1. vertx-spring-boot-starter-http およびを依存関係 spring-boot-starter-security としてプロジェクトの pom.xml ファイルに追加します。

    pom.xml

    <project>
    ...
      <dependencies>
      ...
        <dependency>
          <groupId>dev.snowdrop</groupId>
          <artifactId>vertx-spring-boot-starter-http</artifactId>
        </dependency>
        <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-security</artifactId>
        </dependency>
      ...
      <dependencies>
    ...
    </project>

  2. アプリケーションのエンドポイントコントローラークラスを作成します。

    HelloController.java

    package dev.snowdrop.vertx.sample.http.security;
    
    import java.security.Principal;
    
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RestController;
    import reactor.core.publisher.Mono;
    
    @RestController
    public class HelloController {
    
        @GetMapping("/")
        public Mono<String> hello(Mono<Principal> principal) {
            return principal
                .map(Principal::getName)
                .map(this::helloMessage);
        }
    
        private String helloMessage(String username) {
            return "Hello, " + username + "!";
        }
    }

  3. アプリケーションのメインクラスを作成します。

    HttpSecuritySampleApplication.java

    package dev.snowdrop.vertx.sample.http.security;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    
    @SpringBootApplication
    public class HttpSecuritySampleApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(HttpSecuritySampleApplication.class, args);
        }
    }

  4. /hello エンドポイントにアクセスするためのユーザークレデンシャルを保存する SecurityConfiguration クラスを作成します。

    SecurityConfiguration.java

    package dev.snowdrop.vertx.sample.http.security;
    
    import org.springframework.context.annotation.Bean;
    import org.springframework.security.config.annotation.web.reactive.EnableWebFluxSecurity;
    import org.springframework.security.core.userdetails.MapReactiveUserDetailsService;
    import org.springframework.security.core.userdetails.User;
    import org.springframework.security.core.userdetails.UserDetails;
    
    @EnableWebFluxSecurity
    public class SecurityConfiguration {
    
        @Bean
        public MapReactiveUserDetailsService userDetailsService() {
            UserDetails user = User.withDefaultPasswordEncoder()
                .username("user")
                .password("user")
                .roles("USER")
                .build();
    
            return new MapReactiveUserDetailsService(user);
        }
    }

  5. オプション: アプリケーションをローカルで実行し、テストします。

    1. Maven プロジェクトの root ディレクトリーに移動します。

      $ cd myApp
    2. アプリケーションをパッケージ化します。

      $ mvn clean package
    3. コマンドラインからアプリケーションを起動します。

      $ java -jar target/vertx-spring-boot-sample-http-security.jar
    4. ブラウザーを http://localhost:8080 使用して、ログイン画面にアクセスします。
    5. 以下の認証情報を使用してログインします。

      • Username: user
      • password: user

      ログイン時に、カスタマイズされた応答を受け取る必要があります。

      Hello, user!
    6. Web ブラウザーを http://localhost:8080/logout 使用してに移動し、Log out ボタンを使用してアプリケーションからログアウトします。
    7. 認証されていない HTTP 要求を行うには、ターミナルを使用し localhost:8080ます。アプリケーションから HTTP 401 Unauthorized レスポンスを受け取ります。

      $ curl -I http://localhost:8080
      HTTP/1.1 401 Unauthorized
      WWW-Authenticate: Basic realm="Realm"
      Cache-Control: no-cache, no-store, max-age=0, must-revalidate
      Pragma: no-cache
      Expires: 0
      X-Content-Type-Options: nosniff
      X-Frame-Options: DENY
      X-XSS-Protection: 1 ; mode=block
      Referrer-Policy: no-referrer
    8. example ユーザークレデンシャルを使用して認証されたリクエストを発行します。カスタマイズされた応答を受け取る必要があります。

      $ curl -u user:user http://localhost:8080
      Hello, user!

関連情報

5.5. 反応的な Spring Boot アプリケーションでの OAuth2 認証の使用。

反応的な Spring Boot アプリケーションの OAuth2 認証 を設定し、クライアント ID およびクライアントシークレットを使用して認証します。

前提条件

  • JDK 8 または JDK 11 がインストールされている。
  • GitHub アカウント
  • Maven がインストールされている。
  • Spring Boot を使用するよう設定された Maven ベースのアプリケーションプロジェクト

手順

  1. Github アカウントで新規の OAuth 2 アプリケーションを登録 します。登録フォームに以下の値を指定するようにしてください。

  2. 以下の依存関係をプロジェクトの pom.xml ファイルに追加します。

    • vertx-spring-boot-starter-http
    • spring-boot-starter-security
    • spring-boot-starter-oauth2-client
    • reactor-netty

      が正常に spring-boot-starter-oauth2-client 機能するには reactor-netty クライアントが必要であることに注意してください。

      pom.xml

      <project>
      ...
        <dependencies>
        ...
          <dependency>
            <groupId>dev.snowdrop</groupId>
            <artifactId>vertx-spring-boot-starter-http</artifactId>
          </dependency>
          <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
          </dependency>
          <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-oauth2-client</artifactId>
          </dependency>
          <!-- Spring OAuth2 client only works with Reactor Netty client -->
          <dependency>
            <groupId>io.projectreactor.netty</groupId>
            <artifactId>reactor-netty</artifactId>
          </dependency>
        ...
        <dependencies>
      ...
      </project>

  3. アプリケーションのエンドポイントコントローラークラスを作成します。

    HelloController.java

    package dev.snowdrop.vertx.sample.http.oauth;
    
    import org.springframework.security.core.annotation.AuthenticationPrincipal;
    import org.springframework.security.oauth2.core.user.OAuth2User;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RestController;
    import reactor.core.publisher.Mono;
    
    @RestController
    public class HelloController {
    
        @GetMapping
        public Mono<String> hello(@AuthenticationPrincipal OAuth2User oauth2User) {
            return Mono.just("Hello, " + oauth2User.getAttributes().get("name") + "!");
        }
    }

  4. アプリケーションのメインクラスを作成します。

    OAuthSampleApplication.java

    package dev.snowdrop.vertx.sample.http.oauth;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    
    @SpringBootApplication
    public class OAuthSampleApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(OAuthSampleApplication.class, args);
        }
    }

  5. アプリケーションの登録時に GitHub から受信した OAuth2 クライアント ID およびクライアントシークレットを保存する YAML 設定ファイルを作成します。

    src/main/resources/application.yml

    spring:
      security:
        oauth2:
          client:
            registration:
              github:
                client-id: YOUR_GITHUB_CLIENT_ID
                client-secret: YOUR_GITHUB_CLIENT_SECRET

  6. オプション: アプリケーションをローカルで実行し、テストします。

    1. Maven プロジェクトの root ディレクトリーに移動します。

      $ cd myApp
    2. アプリケーションをパッケージ化します。

      $ mvn clean package
    3. コマンドラインからアプリケーションを起動します。

      $ java -jar target/vertx-spring-boot-sample-http-oauth.jar
    4. Web ブラウザーを http://localhost:8080 使用してに移動します。GitHub の OAuth2 アプリケーション承認画面にリダイレクトされます。プロンプトが表示されたら、GitHub アカウントの認証情報を使用してログインします。
    5. Authorize をクリックして確定します。カスタマイズした応答メッセージを示す画面にリダイレクトされます。

関連情報

5.6. 反応的な Spring Boot SMTP メールアプリケーションの作成

Eclipse Vert.x で Spring Boot で再アクティブな SMTP メールサービスを作成します。

前提条件

  • JDK 8 または JDK 11 がインストールされている。
  • Maven がインストールされている。
  • Spring Boot を使用するよう設定された Maven ベースのアプリケーションプロジェクト
  • マシン上に設定された SMTP メールサーバー

手順

  1. vertx-spring-boot-starter-http およびを依存関係 vertx-spring-boot-starter-mail としてプロジェクトの pom.xml ファイルに追加します。

    pom.xml

    <project>
    ...
      <dependencies>
      ...
        <dependency>
          <groupId>dev.snowdrop</groupId>
          <artifactId>vertx-spring-boot-starter-http</artifactId>
        </dependency>
        <dependency>
          <groupId>dev.snowdrop</groupId>
          <artifactId>vertx-spring-boot-starter-mail</artifactId>
        </dependency>
      ...
      <dependencies>
    ...
    </project>

  2. アプリケーションのメールハンドラークラスを作成します。

    MailHandler.java

    package dev.snowdrop.vertx.sample.mail;
    
    import dev.snowdrop.vertx.mail.MailClient;
    import dev.snowdrop.vertx.mail.MailMessage;
    import dev.snowdrop.vertx.mail.SimpleMailMessage;
    import org.springframework.stereotype.Component;
    import org.springframework.util.MultiValueMap;
    import org.springframework.web.reactive.function.server.ServerRequest;
    import org.springframework.web.reactive.function.server.ServerResponse;
    import reactor.core.publisher.Mono;
    
    import static org.springframework.web.reactive.function.server.ServerResponse.noContent;
    
    @Component
    public class MailHandler {
    
        private final MailClient mailClient;
    
        public MailHandler(MailClient mailClient) {
            this.mailClient = mailClient;
        }
    
        public Mono<ServerResponse> send(ServerRequest request) {
            return request.formData()
                .log()
                .map(this::formToMessage)
                .flatMap(mailClient::send)
                .flatMap(result -> noContent().build());
        }
    
        private MailMessage formToMessage(MultiValueMap<String, String> form) {
            return new SimpleMailMessage()
                .setFrom(form.getFirst("from"))
                .setTo(form.get("to"))
                .setSubject(form.getFirst("subject"))
                .setText(form.getFirst("text"));
        }
    
    }

  3. アプリケーションのメインクラスを作成します。

    MailSampleApplication.java

    package dev.snowdrop.vertx.sample.mail;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.context.annotation.Bean;
    import org.springframework.core.io.ClassPathResource;
    import org.springframework.web.reactive.function.server.RouterFunction;
    import org.springframework.web.reactive.function.server.ServerResponse;
    
    import static org.springframework.http.MediaType.APPLICATION_FORM_URLENCODED;
    import static org.springframework.web.reactive.function.server.RequestPredicates.accept;
    import static org.springframework.web.reactive.function.server.RouterFunctions.resources;
    import static org.springframework.web.reactive.function.server.RouterFunctions.route;
    
    @SpringBootApplication
    public class MailSampleApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(MailSampleApplication.class, args);
        }
    
        @Bean
        public RouterFunction<ServerResponse> mailRouter(MailHandler mailHandler) {
            return route()
                    .POST("/mail", accept(APPLICATION_FORM_URLENCODED), mailHandler::send)
                    .build();
        }
    
        @Bean
        public RouterFunction<ServerResponse> staticResourceRouter() {
            return resources("/**", new ClassPathResource("static/"));
        }
    
    }

  4. SMTP サーバーの認証情報を保存するための application.properties ファイルを作成します。

    application.properties

    vertx.mail.host=YOUR_SMTP_SERVER_HOSTNAME
    vertx.mail.username=YOUR_SMTP_SERVER_USERNAME
    vertx.mail.password=YOUR_SMTP_SERVER_PASSWORD

  5. アプリケーションのフロントエンドとして機能する src/main/resources/static/index.html ファイルを作成します。この手順で使用できる HTML メールフォームのサンプル を使用します。
  6. オプション: アプリケーションをローカルで実行し、テストします。

    1. Maven プロジェクトの root ディレクトリーに移動します。

      $ cd myApp
    2. アプリケーションをパッケージ化します。

      $ mvn clean package
    3. コマンドラインからアプリケーションを起動します。

      $ java -jar target/vertx-spring-boot-sample-mail.jar
    4. Web ブラウザーを http://localhost:8080/index.html 使用してメールフォームにアクセスします。

関連情報

5.7. server-sent イベント

サーバー送信イベント(SSE)は、HTTP sever がクライアントに一方向の更新を送信できるようにするプッシュテクノロジーです。SSE は、イベントソースとクライアント間の接続を確立することで機能します。イベントソースはこの接続を使用してイベントをクライアント側にプッシュします。サーバーがイベントをプッシュした後も、接続は開いたままとなり、後続のイベントをプッシュするために使用できます。クライアントがサーバーの要求を終了すると、接続は閉じられます。SSE は、クライアントが更新のためにイベントソースをポーリングするたびに新しい接続が確立されなければならないポーリングに対するより効率的な代替方法を表します。WebSocket とは対照的に、SSE はイベントを一方向のみにプッシュします(つまり、ソースからクライアントへ)。イベントソースとクライアント間の双方向通信は処理しません。

SSE の仕様は HTML5 に組み込まれ、レガシーバージョンを含む Web ブラウザーで広くサポートされます。SSE はコマンドラインから使用でき、他のプロトコルと比較して設定が比較的簡単です。

SSE は、サーバーからクライアントに頻繁に更新を必要とするユースケースに適していますが、クライアント側からサーバーへの更新は少なくなることが予想されます。更新は、クライアント側からサーバーへ行われると、REST などの別のプロトコルで処理できます。このようなユースケースの例には、新規ファイルがファイルサーバーにアップロードされたときにクライアントに送信されるメディアフィードの更新や通知などがあります。

5.8. 反応的な Spring Boot アプリケーションでのサーバー対応のイベントの使用

HTTP 要求を受け入れる単純なサービスを作成し、サーバー送信イベント(SSE)のストリームを返します。クライアントがサーバーへの接続を確立し、ストリーミングが開始されると、接続は開いたままになります。サーバーは、新しいイベントを継続的にクライアントにプッシュするために接続を再利用します。要求を取り消すと、接続が閉じ、ストリームが停止し、クライアントがサーバーから更新の受信を停止します。

前提条件

手順

  1. プロジェクトの pom.xml ファイルに依存関係 vertx-spring-boot-starter-http として追加します。

    pom.xml

    <project>
    ...
      <dependencies>
      ...
        <dependency>
          <groupId>dev.snowdrop</groupId>
          <artifactId>vertx-spring-boot-starter-http</artifactId>
        </dependency>
      ...
      <dependencies>
    ...
    </project>

  2. アプリケーションのメインクラスを作成します。

    SseExampleApplication.java

    package dev.snowdrop.vertx.sample.sse;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    
    @SpringBootApplication
    public class SseSampleApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(SseSampleApplication.class, args);
        }
    }

  3. アプリケーションの Server-sent Event コントローラークラスを作成します。この例では、クラスはランダムな整数のストリームを生成し、ターミナルアプリケーションに出力します。

    SseController.java

    package dev.snowdrop.vertx.sample.sse;
    
    import java.time.Duration;
    import java.util.Random;
    
    import org.springframework.http.MediaType;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RestController;
    import reactor.core.publisher.Flux;
    
    @RestController
    public class SseController {
    
        @GetMapping(produces = MediaType.TEXT_EVENT_STREAM_VALUE)
        public Flux<Integer> getRandomNumberStream() {
            Random random = new Random();
    
            return Flux.interval(Duration.ofSeconds(1))
                .map(i -> random.nextInt())
                .log();
        }
    }

  4. オプション: アプリケーションをローカルで実行し、テストします。

    1. Maven プロジェクトの root ディレクトリーに移動します。

      $ cd myApp
    2. アプリケーションをパッケージ化します。

      $ mvn clean package
    3. コマンドラインからアプリケーションを起動します。

      $ java -jar target/vertx-spring-boot-sample-sse.jar
    4. 新しいターミナルウィンドウで、に HTTP 要求を発行し localhostます。サーバー関連のイベントコントローラーから、無作為な整数の継続的なストリームの受信を開始します。

      $ curl localhost:8080
      data:-2126721954
      
      data:-573499422
      
      data:1404187823
      
      data:1338766210
      
      data:-666543077
      ...

      +CCtrl押して HTTP リクエストをキャンセルし、応答のストリームを終了します。

関連情報

サンプルを使用 する他に、Eclipse Vert.x スターターで Spring Boot を使用して新規 Spring Boot アプリケーションを作成し、それらを OpenShift にデプロイすることもできます。

第6章 Spring Boot ベースのアプリケーションのデバッグ

このセクションでは、ローカルデプロイメントとリモートデプロイメントの両方で Spring Boot ベースのアプリケーションのデバッグについて説明します。

6.1. リモートデバッグ

アプリケーションをリモートでデバッグするには、最初にデバッグモードで開始するように設定してから、デバッガーを割り当てる必要があります。

6.1.1. デバッグモードでの Spring Boot アプリケーションのローカルでの起動

Maven ベースのプロジェクトのデバッグ方法の 1 つは、デバッグポートを指定している間にアプリケーションを手動で起動し、その後そのポートにリモートデバッガーを接続する方法の 1 つです。この方法は、少なくとも mvn spring-boot:run ゴールを使用してアプリケーションを手動で起動する場合に該当します。

前提条件

  • Maven ベースのアプリケーション

手順

  1. コンソールで、アプリケーションでディレクトリーに移動します。
  2. アプリケーションを起動し、以下の構文を使用して必要な JVM 引数とデバッグポートを指定します。

    $ mvn spring-boot:run -Drun.jvmArguments="-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=$PORT_NUMBER"

    $PORT_NUMBER は、選択した未使用のポート番号です。リモートデバッガー設定の場合は、この数字に留意してください。

    JVM が一時停止し、アプリケーションを起動する前にリモートデバッガー接続を待機する場合は、suspend に変更し yます。

6.1.2. デバッグモードでの uberjar の起動

アプリケーションを Spring Boot uberjar としてパッケージ化する場合は、以下のパラメーターを使用して実行してデバッグします。

前提条件

  • アプリケーションのある uberjar

手順

  1. コンソールで、uberjar でディレクトリーに移動します。
  2. 以下のパラメーターを使用して uberjar を実行します。すべてのパラメーターが、行上の uberjar の名前の前に指定されていることを確認します。

    $ java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=$PORT_NUMBER -jar $UBERJAR_FILENAME

    $PORT_NUMBER は、選択した未使用のポート番号です。リモートデバッガー設定の場合は、この数字に留意してください。

    JVM が一時停止し、アプリケーションを起動する前にリモートデバッガー接続を待機する場合は、suspend に変更し yます。

6.1.3. デバッグモードでの OpenShift でのアプリケーションの起動

OpenShift で Spring Boot ベースのアプリケーションをデバッグするには、リモートデバッガーからアプリケーションに接続できるように true、コンテナー内部の JAVA_DEBUG 環境変数をに設定し、ポート転送を設定する必要があります。

前提条件

  • OpenShift で実行されているアプリケーション。
  • oc バイナリーがマシンにインストールされている。
  • ターゲット OpenShift 環境で oc port-forward コマンドを実行する機能。

手順

  1. oc コマンドを使用して、利用可能なデプロイメント設定を一覧表示します。

    $ oc get dc
  2. アプリケーションのデプロイメント設定で JAVA_DEBUG 環境変数をに設定します。これにより true、JVM がデバッグ 5005 用にポート番号を開くように設定します。以下に例を示します。

    $ oc set env dc/MY_APP_NAME JAVA_DEBUG=true
  3. 設定変更時に自動的に再デプロイするようにアプリケーションを設定していない場合は、アプリケーションを再デプロイします。以下に例を示します。

    $ oc rollout latest dc/MY_APP_NAME
  4. ローカルマシンからアプリケーション Pod へのポート転送を設定します。

    1. 現在実行中の Pod を一覧表示し、アプリケーションが含まれる Pod を見つけます。

      $ oc get pod
      NAME                            READY     STATUS      RESTARTS   AGE
      MY_APP_NAME-3-1xrsp          0/1       Running     0          6s
      ...
    2. ポート転送を設定します。

      $ oc port-forward MY_APP_NAME-3-1xrsp $LOCAL_PORT_NUMBER:5005

      $LOCAL_PORT_NUMBER は、ローカルマシンで選択した未使用のポート番号です。リモートデバッガー設定の場合は、この数字に留意してください。

  5. デバッグが完了したら、アプリケーション Pod で JAVA_DEBUG 環境変数の設定を解除します。以下に例を示します。

    $ oc set env dc/MY_APP_NAME JAVA_DEBUG-

関連情報

デフォルトからデバッグポートを変更する場合は、JAVA_DEBUG_PORT 環境変数を設定することもでき 5005ます。

6.1.4. アプリケーションへのリモートデバッガーの割り当て

アプリケーションがデバッグ用に設定されている場合は、選択したリモートデバッガーを割り当てます。本ガイドでは、Red Hat CodeReady Studio を説明しますが、他のプログラムを使用する場合も同様です。

前提条件

手順

  1. Red Hat CodeReady Studio を起動します。
  2. アプリケーションの新しいデバッグ設定を作成します。

    1. Run→Debug Configurations をクリックし ます。
    2. 設定のリストで、リモート Java アプリケーションをダブルクリックします。これにより、新しいリモートデバッグ設定が作成されます。
    3. Name フィールドに設定に適切な名前を入力します。
    4. アプリケーションのディレクトリーへのパスを プロジェクト フィールドに入力します。Browse…​ 利便性のため、ボタン。
    5. Connection Type フィールドを Standard(Socket Attach) に設定していない場合は、これを設定します。
    6. Port フィールドを、アプリケーションがデバッグをリッスンしているポート番号に設定します。
    7. 適用をクリックします。
  3. Debug Configurations ウィンドウで Debug ボタンをクリックしてデバッグを開始します。

    最初にデバッグ設定を簡単に起動するには 、Run→Debug History をクリックして、一覧から設定を選択します。

関連情報

6.2. デバッグロギング

6.2.1. Spring Boot のデバッグロギングの追加

デバッグロギングをアプリケーションに追加します。

前提条件

手順

  1. ロギングを追加するクラス org.apache.commons.logging.LogFactory のを使用して org.apache.commons.logging.Log オブジェクトを宣言します。

    import org.apache.commons.logging.Log;
    import org.apache.commons.logging.LogFactory;
    ...
    private static Log logger = LogFactory.getLog(TheClass.class);

    たとえば、REST API Level 0 サンプルの GreetingEndpoint クラスにロギングを追加する場合は、 を使用し GreetingEndpoint.classます。

  2. を使用してデバッグステートメントを追加し logger.debug("my logging message")ます。

    logging ステートメントの例

    @GET
    @Path("/greeting")
    @Produces("application/json")
    public Greeting greeting(@QueryParam("name") @DefaultValue("World") String name) {
        String message = String.format(properties.getMessage(), name);
    
        logger.debug("Message: " + message);
    
        return new Greeting(message);
    }

  3. を追加 logging.level.fully.qualified.name.of.TheClass=DEBUGsrc/main/resources/application.propertiesます。

    たとえば、logging ステートメントを以下を使用 io.openshift.booster.service.GreetingEndpoint します。

    logging.level.io.openshift.booster.service.GreetingEndpoint=DEBUG

    これにより、DEBUG レベルのログメッセージをクラスのログに表示できるようになります。

6.2.2. localhost での Spring Boot デバッグログへのアクセス

アプリケーションを起動し、これと対話し、デバッグステートメントを確認します。

前提条件

  • デバッグロギングが有効になっているアプリケーション。

手順

  1. アプリケーションを起動します。

    $ mvn spring-boot:run
  2. アプリケーションをテストしてデバッグロギングを呼び出します。

    たとえば、REST API レベル 0 の例 をテストするには、/api/greeting メソッドを呼び出します。

    $ curl http://localhost:8080/api/greeting?name=Sarah
  3. アプリケーションログを表示して、デバッグメッセージを表示します。

    i.o.booster.service.GreetingEndpoint     : Message: Hello, Sarah!

デバッグロギングを無効にするには、logging.level.fully.qualified.name.of.TheClass=DEBUG からを削除して、アプリケーションを再起動 src/main/resources/application.properties します。

6.2.3. OpenShift でのデバッグログへのアクセス

アプリケーションを起動し、これと対話し、OpenShift でデバッグステートメントを確認します。

前提条件

  • デバッグロギングが有効な Maven ベースのアプリケーション。
  • oc CLI クライアントがインストールされ、認証されている。

手順

  1. アプリケーションを OpenShift にデプロイします。

    $ mvn clean fabric8:deploy -Popenshift
  2. ログを表示します。

    1. アプリケーションで Pod の名前を取得します。

      $ oc get pods
    2. ログ出力の監視を開始します。

      $ oc logs -f pod/MY_APP_NAME-2-aaaaa

      ログ出力を確認できるように、ターミナルウィンドウにログ出力を表示させます。

  3. アプリケーションと対話します。

    たとえば、/api/greeting メソッドで message 変数をログに記録するための REST API レベル 0 の例 にデバッグロギングがあるとします。

    1. アプリケーションのルートを取得します。

      $ oc get routes
    2. アプリケーションの /api/greeting エンドポイントで HTTP 要求を実行します。

      $ curl $APPLICATION_ROUTE/api/greeting?name=Sarah
  4. Pod ログと共にウィンドウに戻り、ログのデバッグロギングメッセージを検査します。

    i.o.booster.service.GreetingEndpoint     : Message: Hello, Sarah!
  5. デバッグロギングを無効にするには、アプリケーション logging.level.fully.qualified.name.of.TheClass=DEBUG からを削除 src/main/resources/application.properties して再デプロイします。

第7章 アプリケーションのモニタリング

このセクションでは、OpenShift 上で実行される Spring Boot ベースのアプリケーションのモニタリングについて説明します。

7.1. OpenShift でのアプリケーションの JVM メトリクスへのアクセス

7.1.1. OpenShift での Jolokia を使用した JVM メトリクスへのアクセス

jolokia は、OpenShift 上の HTTP 経由で JMX(Java Management Extension)メトリクスにアクセスするための組み込み軽量ソリューションです。jolokia を使用すると、HTTP ブリッジで JMX が収集した CPU、ストレージ、およびメモリー使用量データにアクセスできます。jolokia は REST インターフェースと JSON 形式のメッセージペイロードを使用します。高い速度とリソース要件の低さにより、クラウドアプリケーションのモニタリングに適しています。

Java ベースのアプリケーションの場合、OpenShift Web コンソールは、アプリケーションを実行する JVM によって関連するすべてのメトリクス出力を収集し、表示する統合 hawt.io コンソール を提供します。

前提条件

  • 認証された oc クライアント
  • OpenShift のプロジェクトで実行される Java ベースのアプリケーションコンテナー
  • 最新の JDK 1.8.0 イメージ

手順

  1. プロジェクト内の Pod のデプロイメント設定を一覧表示し、アプリケーションに対応するものを選択します。

    oc get dc
    NAME         REVISION   DESIRED   CURRENT   TRIGGERED BY
    MY_APP_NAME   2          1         1         config,image(my-app:6)
    ...
  2. 編集するためにアプリケーションを実行する Pod の YAML デプロイメントテンプレートを開きます。

    oc edit dc/MY_APP_NAME
  3. テンプレートの ports セクションに以下のエントリーを追加して、変更を保存します。

    ...
    spec:
      ...
      ports:
      - containerPort: 8778
        name: jolokia
        protocol: TCP
      ...
    ...
  4. アプリケーションを実行する Pod を再デプロイします。

    oc rollout latest dc/MY_APP_NAME

    Pod は更新されたデプロイメント設定で再デプロイされ、ポートを公開し 8778ます。

  5. OpenShift Web コンソールにログインします。
  6. サイドバーで、Applications > Pods に移動し、アプリケーションを実行している Pod の名前をクリックします。
  7. Pod の詳細画面で Open Java Console を クリックし、hawt.io コンソールにアクセスします。

関連情報

7.2. Spring Boot での Prometheus を使用したアプリケーションメトリクスの公開

Prometheus は、モニタリングされたアプリケーションにアクティブに接続してデータを収集します。アプリケーションは、メトリクスをアクティブにサーバーに送信しません。

  1. 前提条件

    • クラスターで実行されている Prometheus サーバー

手順

  1. spring-boot-starter-actuator および micrometer-registry-prometheus 依存関係を含め pom.xmlます。

    pom.xml

    <dependencies>
      ...
      <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
      </dependency>
      <dependency>
        <groupId>io.micrometer</groupId>
        <artifactId>micrometer-registry-prometheus</artifactId>
        <version>1.1.0</version>
      </dependency>
      ...
    </dependencies>

  2. アプリケーションからメトリクスを収集します。

    • デフォルトでは、はアプリケーションを公開する各エンドポイントの Timer メトリクスを spring-boot-starter-actuator 自動的に記録します。Timer メトリクスのデフォルト名はに設定され http.server.requestsます。メトリクスのカスタム名を設定できます。

      management.metrics.web.server.requests-metric-name=custom.timer.metric.name

      デフォルト http.server.requests では、名前はになります。

      Timer メトリクスには、すべてのリクエストに記録された一連の文字が含まれます。デフォルトでは、これらの値は以下のとおりです。

      method
      エンドポイントを呼び出す HTTP メソッド(例: GET または) PUT
      status
      リクエストの応答で返される HTTP ステータスコード(例:、) 200 201 500
      uri
      変数の置換前の URI テンプレート(例:) /api/person/{id}
      exception
      リクエストの受信時にアプリケーションによって例外が発生すると、このディメンションは例外クラスの単純な名前を記録します。
    • ここでは、特定のエンドポイントの Timer メトリックのみを記録します。

      1. アプリケーションの spring-boot-starter-actuator 設定で auto-time-requests プロパティーを無効にします。

        management.metrics.web.server.auto-time-requests=false

        プロパティーはデフォルト true でに設定されます。

      2. アノテーションを指定したメソッドまたはクラスに @io.micrometer.core.annotation.Timed アノテーションを付けます。以下に例を示します。

        @RestController
        public class GreetingController {
        
            @RequestMapping("/greeting")
            @Timed
            public String get() {
                return "Hello from a timed endpoint";
            }
        }

        @Timed アノテーションは、メーターされたエンドポイントの呼び出しにかかる時間を追跡するために使用されます。

  3. アプリケーションを起動します。

    $ mvn spring-boot:run
  4. トレースされたエンドポイントを複数回呼び出します。

    $ curl http://localhost:8080/greeting
    Hello from a timed endpoint
  5. コレクションが発生するまで 15 秒以上待機し、Prometheus UI のメトリクスを確認します。

    1. http://localhost:9090/ で Prometheus UI を開き 、Expression ボックス requests入力 します。
    2. 提案内容からの例を選択し、Execute http.server.requests をクリックします。
    3. 表示されるテーブルで、metered エンドポイントを呼び出すのにどの程度かかるかを確認できます。

    作成したすべてのメトリクスの前にが付けられることに注意してください application:。Spring Boot によって自動的に公開される他のメトリクスがあります。これらのメトリクスには base: vendor: およびのプレフィックスが付けられ、アプリケーションが実行される JVM に関する情報が公開されます。

関連情報

第8章 利用可能な Spring Boot の例

Spring Boot ランタイムはサンプルアプリケーションを提供します。OpenShift でアプリケーションの開発を開始すると、サンプルアプリケーションをテンプレートとして使用できます。

これらのサンプルアプリケーションは、Developer Launcher でアクセスできます。

8.1. Spring Boot の REST API レベル 0 の例

重要

以下の例は、実稼働環境で実行する予定はありません。

修飾レベルの例: Foundational

REST API レベル 0 の例

REST API Level 0 の例は、REST フレームワークを使用して HTTP 経由でビジネス操作をリモート手順呼び出しエンドポイントにマップする方法を示しています。これは、Elson Maturity Model のレベル 0 に対応します。REST とその基盤となる原則を使用して HTTP エンドポイントを作成すると、素早くプロトタイプし、API を柔軟に設計することができます。

この例では、HTTP プロトコルを使用してリモートサービスと対話する方法を紹介します。これにより、以下が可能になります。

  • api/greeting エンドポイントで HTTP GET リクエストを実行します。
  • Hello, World! String で構成されるペイロードが含まれる JSON 形式で応答を受信します。
  • String 引数を渡す間に api/greeting エンドポイントで HTTP GET リクエストを実行します。これにより、クエリー文字列の name request パラメーターが使用されます。
  • リクエストに渡される name パラメーターの値に Hello, $name! $name 置き換えられたペイロードが含まれる JSON 形式の応答を受信します。

8.1.1. REST API レベル 0 設計トレードオフ

表8.1 トレードオフの設計

proscons
  • このサンプルアプリケーションでは、迅速なプロトタイプが可能になります。
  • API の設計は柔軟性があります。
  • HTTP エンドポイントにより、クライアントは言語に依存しないようになります。
  • アプリケーションまたはサービスの成熟度として、REST API Level 0 のアプローチがスケーリングされない可能性があります。データベースの対話に関するクリーンな API 設計やユースケースをサポートしない可能性があります。

    • 共有された変更可能な状態に関連するすべての操作は、適切なバッキングデータストアと統合する必要があります。
    • この API 設計によって処理されるすべてのリクエストは、要求に対応するコンテナーにのみスコープ付けされます。後続のリクエストは同じコンテナーによって処理されない可能性があります。

8.1.2. REST API レベル 0 サンプルアプリケーションの OpenShift Online へのデプロイ

OpenShift Online で REST API レベル 0 サンプルアプリケーションを実行するには、以下のいずれかのオプションを使用します。

各方法では、同じ oc コマンドを使用してアプリケーションをデプロイしますが、developers.redhat.com/launch を使用すると、oc コマンドを実行する自動デプロイメントワークフローが提供されます。

8.1.2.1. developers.redhat.com/launch を使用したサンプルアプリケーションのデプロイ

前提条件

手順

  1. ブラウザーで developers.redhat.com/launch URL に移動します。
  2. 画面の手順にしたがって、Spring Boot でサンプルアプリケーションを作成し、起動します。

8.1.2.2. oc CLI クライアントの認証

oc コマンドラインクライアントを使用して OpenShift Online のアプリケーションサンプルを使用するには、OpenShift Online Web インターフェースによって提供されるトークンを使用してクライアントを認証する必要があります。

前提条件

手順

  1. ブラウザーで OpenShift Online URL に移動します。
  2. Web コンソールの右上隅にあるユーザー名の横にある疑問符アイコンをクリックします。
  3. ドロップダウンメニューで Command Line Tools を選択します。
  4. oc login コマンドをコピーします。
  5. ターミナルにコマンドを貼り付けます。このコマンドは、認証トークンを使用して、OpenShift Online アカウントで oc CLI クライアントを認証します。

    $ oc login OPENSHIFT_URL --token=MYTOKEN

8.1.2.3. oc CLI クライアントを使用した REST API レベル 0 サンプルアプリケーションのデプロイ

前提条件

手順

  1. GitHub からプロジェクトのクローンを作成します。

    $ git clone git@github.com:USERNAME/MY_PROJECT_NAME.git

    プロジェクトの ZIP ファイルをダウンロードした場合は、展開します。

    $ unzip MY_PROJECT_NAME.zip
  2. OpenShift で新規プロジェクトを作成します。

    $ oc new-project MY_PROJECT_NAME
  3. アプリケーションのルートディレクトリーに移動します。
  4. Maven を使用して OpenShift へのデプロイメントを開始します。

    $ mvn clean fabric8:deploy -Popenshift

    このコマンドは Fabric8 Maven Plugin を使用して OpenShift で S2I プロセス を起動し、Pod を起動します。

  5. アプリケーションのステータスを確認し、Pod が実行されていることを確認します。

    $ oc get pods -w
    NAME                             READY     STATUS      RESTARTS   AGE
    MY_APP_NAME-1-aaaaa               1/1       Running     0          58s
    MY_APP_NAME-s2i-1-build           0/1       Completed   0          2m

    MY_APP_NAME-1-aaaaa Pod のステータスは、Running 完全にデプロイされ、起動されるとのステータスになります。特定の Pod 名は異なります。中間の数は新しいビルドごとに増加します。末尾の文字は、Pod の作成時に生成されます。

  6. サンプルアプリケーションをデプロイし、起動した後に、そのルートを決定します。

    ルート情報の例

    $ oc get routes
    NAME                 HOST/PORT                                                     PATH      SERVICES        PORT      TERMINATION
    MY_APP_NAME         MY_APP_NAME-MY_PROJECT_NAME.OPENSHIFT_HOSTNAME      MY_APP_NAME      8080

    Pod のルート情報は、アクセスに使用するベース URL を提供します。上記の例では、アプリケーションにアクセスするためのベース URL http://MY_APP_NAME-MY_PROJECT_NAME.OPENSHIFT_HOSTNAME としてを使用します。

8.1.3. REST API レベル 0 のサンプルアプリケーションの Minishift または CDK へのデプロイ

以下のいずれかのオプションを使用して、Minishift または CDK でローカルに REST API Level 0 のサンプルアプリケーションを実行します。

各メソッドは同じ oc コマンドを使用してアプリケーションをデプロイしますが、Fabric8 Launcher を使用すると、oc コマンドを実行する自動デプロイメントワークフローが提供されます。

8.1.3.1. Fabric8 Launcher ツール URL およびクレデンシャルの取得

Minishift または CDK でサンプルアプリケーションを作成してデプロイするには、Fabric8 Launcher ツール URL およびユーザー認証情報が必要です。この情報は Minishift または CDK の起動時に提供されます。

前提条件

  • Fabric8 Launcher ツールがインストールされ、設定され、実行されている。

手順

  1. Minishift または CDK を起動したコンソールに移動します。
  2. コンソール出力で、実行中の Fabric8 Launcher にアクセスするのに使用できる URL およびユーザークレデンシャルを確認します。

    Minishift または CDK の起動からのコンソールの出力例

    ...
    -- Removing temporary directory ... OK
    -- Server Information ...
       OpenShift server started.
       The server is accessible via web console at:
           https://192.168.42.152:8443
    
       You are logged in as:
           User:     developer
           Password: developer
    
       To login as administrator:
           oc login -u system:admin

8.1.3.2. Fabric8 Launcher ツールを使用したサンプルアプリケーションのデプロイ

前提条件

手順

  1. ブラウザーで Fabric8 Launcher URL に移動します。
  2. 画面の手順にしたがって、Spring Boot でサンプルアプリケーションを作成して起動します。

8.1.3.3. oc CLI クライアントの認証

oc コマンドラインクライアントを使用して Minishift または CDK のアプリケーションの例を使用するには、Minishift または CDK の Web インターフェースによって提供されるトークンを使用してクライアントを認証する必要があります。

前提条件

手順

  1. ブラウザーで Minishift または CDK の URL に移動します。
  2. Web コンソールの右上隅にあるユーザー名の横にある疑問符アイコンをクリックします。
  3. ドロップダウンメニューで Command Line Tools を選択します。
  4. oc login コマンドをコピーします。
  5. ターミナルにコマンドを貼り付けます。コマンドは、認証トークンを使用して、Minishift または CDK アカウントで oc CLI クライアントを認証します。

    $ oc login OPENSHIFT_URL --token=MYTOKEN

8.1.3.4. oc CLI クライアントを使用した REST API レベル 0 サンプルアプリケーションのデプロイ

前提条件

手順

  1. GitHub からプロジェクトのクローンを作成します。

    $ git clone git@github.com:USERNAME/MY_PROJECT_NAME.git

    プロジェクトの ZIP ファイルをダウンロードした場合は、展開します。

    $ unzip MY_PROJECT_NAME.zip
  2. OpenShift で新規プロジェクトを作成します。

    $ oc new-project MY_PROJECT_NAME
  3. アプリケーションのルートディレクトリーに移動します。
  4. Maven を使用して OpenShift へのデプロイメントを開始します。

    $ mvn clean fabric8:deploy -Popenshift

    このコマンドは Fabric8 Maven Plugin を使用して OpenShift で S2I プロセス を起動し、Pod を起動します。

  5. アプリケーションのステータスを確認し、Pod が実行されていることを確認します。

    $ oc get pods -w
    NAME                             READY     STATUS      RESTARTS   AGE
    MY_APP_NAME-1-aaaaa               1/1       Running     0          58s
    MY_APP_NAME-s2i-1-build           0/1       Completed   0          2m

    MY_APP_NAME-1-aaaaa Pod のステータスは、Running 完全にデプロイされ、起動されるとのステータスになります。特定の Pod 名は異なります。中間の数は新しいビルドごとに増加します。末尾の文字は、Pod の作成時に生成されます。

  6. サンプルアプリケーションをデプロイし、起動した後に、そのルートを決定します。

    ルート情報の例

    $ oc get routes
    NAME                 HOST/PORT                                                     PATH      SERVICES        PORT      TERMINATION
    MY_APP_NAME         MY_APP_NAME-MY_PROJECT_NAME.OPENSHIFT_HOSTNAME      MY_APP_NAME      8080

    Pod のルート情報は、アクセスに使用するベース URL を提供します。上記の例では、アプリケーションにアクセスするためのベース URL http://MY_APP_NAME-MY_PROJECT_NAME.OPENSHIFT_HOSTNAME としてを使用します。

8.1.4. REST API レベル 0 サンプルアプリケーションの OpenShift Container Platform へのデプロイ

サンプルアプリケーションを OpenShift Container Platform に作成し、デプロイするプロセスは OpenShift Online と似ています。

前提条件

手順

8.1.5. Spring Boot のアプリケーションを変更していない REST API レベル 0 の例と対話

この例では、GET リクエストを受け入れるデフォルトの HTTP エンドポイントを提供します。

前提条件

  • 実行中のアプリケーション
  • curl バイナリーまたは Web ブラウザー

手順

  1. 例に対して GET リクエスト curl を実行するには、を使用します。ブラウザーを使用してこれを行うこともできます。

    $ curl http://MY_APP_NAME-MY_PROJECT_NAME.OPENSHIFT_HOSTNAME/api/greeting
    {"content":"Hello, World!"}
  2. name URL パラメーター curl を使用して、例に対して GET リクエストを実行するには、を使用します。ブラウザーを使用してこれを行うこともできます。

    $ curl http://MY_APP_NAME-MY_PROJECT_NAME.OPENSHIFT_HOSTNAME/api/greeting?name=Sarah
    {"content":"Hello, Sarah!"}
注記

ブラウザーから、例で提供されるフォームを使用して、同じ対話を実行することもできます。このフォームはプロジェクトのルートにあり http://MY_APP_NAME-MY_PROJECT_NAME.OPENSHIFT_HOSTNAMEます。

8.1.6. REST API レベル 0 アプリケーションインテグレーションテストの例の実行

このアプリケーションの例には、自己完結型の統合テストセットが含まれます。OpenShift プロジェクト内で実行される場合、テストは次のとおりです。

  • アプリケーションのテストインスタンスをプロジェクトにデプロイします。
  • そのインスタンスで個別のテストを実行します。
  • テストの完了時に、プロジェクトのインスタンスをすべて削除します。
警告

統合テストを実行すると、サンプルアプリケーションの既存のインスタンスがすべてターゲット OpenShift プロジェクトから削除します。サンプルアプリケーションを誤って削除しないようにするには、テストを実行する別の OpenShift プロジェクトを作成して選択します。

前提条件

  • 認証された oc クライアント
  • 空の OpenShift プロジェクト

手順

以下のコマンドを実行してインテグレーションテストを実行します。

$ mvn clean verify -Popenshift,openshift-it

8.1.7. REST リソース

REST の背景と関連情報は、以下を参照してください。

8.2. Spring Boot の外部化設定の例

重要

以下の例は、実稼働環境で実行する予定はありません。

修飾レベルの例: Foundational

外部化設定は、ConfigMap を使用した外部化設定の基本例を提供します。ConfigMap は、コンテナーを OpenShift とは独立しつつ、単純なキーと値のペアとして 1 つ以上の Linux コンテナーに設定データを挿入するために使用するオブジェクトです。

以下の例は、以下の方法を示しています。

  • を設定して設定し ConfigMapます。
  • アプリケーション ConfigMap 内のにより提供される設定を使用します。
  • 実行中のアプリケーションの ConfigMap 設定への変更をデプロイします。

8.2.1. 外部化設定設計パターン

可能な限り、アプリケーション設定を外部化し、アプリケーションコードから分離します。これにより、異なる環境を通過する際にアプリケーション設定を変更することができますが、コードは変更されません。設定を外部化すると、コードベースおよびバージョン制御から機密情報や内部情報も保持されます。多くの言語およびアプリケーションサーバーは、アプリケーションの設定の外部化をサポートする環境変数を提供します。

マイクロサービスアーキテクチャーおよびマルチ言語(polywaret)環境は、アプリケーションの設定を管理するために複雑な層を追加します。アプリケーションは独立した分散サービスで構成され、それぞれに独自の設定を指定できます。設定データをすべて同期し、アクセス可能な状態に維持すると、メンテナンス課題が発生します。

ConfigMap は、アプリケーション設定を外部化し、OpenShift 上の個別の Linux コンテナーおよび Pod で使用できるようにします。YAML ファイルの使用を含むさまざまな方法で ConfigMap オブジェクトを作成し、これを Linux コンテナーに挿入できます。ConfigMap により、設定データのセットをグループ化およびスケーリングすることもできます。これにより、基本的な 開発ステージ、および 実稼働以外に多数の環境を設定できます。ConfigMap についての詳細は、OpenShift ドキュメントを参照してください

8.2.2. 外部化された設定設計のトレードオフ

表8.2 設計の手段

proscons
  • デプロイメントとは別の設定
  • 個別に更新できます。
  • サービス間で共有できます。
  • 環境への設定の追加には、追加のステップが必要です。
  • 別々に維持する必要があります。
  • サービスの範囲外の調整が必要

8.2.3. 外部設定サンプルアプリケーションの OpenShift Online へのデプロイ

以下のオプションのいずれかを使用して、OpenShift Online で Externalized Configuration のサンプルアプリケーションを実行します。

各方法では、同じ oc コマンドを使用してアプリケーションをデプロイしますが、developers.redhat.com/launch を使用すると、oc コマンドを実行する自動デプロイメントワークフローが提供されます。

8.2.3.1. developers.redhat.com/launch を使用したサンプルアプリケーションのデプロイ

前提条件

手順

  1. ブラウザーで developers.redhat.com/launch URL に移動します。
  2. 画面の手順にしたがって、Spring Boot でサンプルアプリケーションを作成し、起動します。

8.2.3.2. oc CLI クライアントの認証

oc コマンドラインクライアントを使用して OpenShift Online のアプリケーションサンプルを使用するには、OpenShift Online Web インターフェースによって提供されるトークンを使用してクライアントを認証する必要があります。

前提条件

手順

  1. ブラウザーで OpenShift Online URL に移動します。
  2. Web コンソールの右上隅にあるユーザー名の横にある疑問符アイコンをクリックします。
  3. ドロップダウンメニューで Command Line Tools を選択します。
  4. oc login コマンドをコピーします。
  5. ターミナルにコマンドを貼り付けます。このコマンドは、認証トークンを使用して、OpenShift Online アカウントで oc CLI クライアントを認証します。

    $ oc login OPENSHIFT_URL --token=MYTOKEN

8.2.3.3. oc CLI クライアントを使用した外部化設定サンプルアプリケーションのデプロイ

前提条件

手順

  1. GitHub からプロジェクトのクローンを作成します。

    $ git clone git@github.com:USERNAME/MY_PROJECT_NAME.git

    プロジェクトの ZIP ファイルをダウンロードした場合は、展開します。

    $ unzip MY_PROJECT_NAME.zip
  2. 新規 OpenShift プロジェクトを作成します。

    $ oc new-project MY_PROJECT_NAME
  3. サンプルアプリケーションのデプロイ前に view アクセス権限をサービスアカウントに割り当てます。これにより、アプリケーションは ConfigMap の内容を読み取るために OpenShift API にアクセスできるようになります。

    $ oc policy add-role-to-user view -n $(oc project -q) -z default
  4. アプリケーションのルートディレクトリーに移動します。
  5. を使用して ConfigMap 設定を OpenShift にデプロイし application.ymlます。

    $ oc create configmap app-config --from-file=application.yml
  6. ConfigMap 設定がデプロイされていることを確認します。

    $ oc get configmap app-config -o yaml
    
    apiVersion: v1
    data:
      application.yml: |
         # This properties file should be used to initialise a ConfigMap
         greeting:
           message: "Hello %s from a ConfigMap!"
    ...
  7. Maven を使用して OpenShift へのデプロイメントを開始します。

    $ mvn clean fabric8:deploy -Popenshift

    このコマンドは Fabric8 Maven Plugin を使用して OpenShift で S2I プロセス を起動し、Pod を起動します。

  8. アプリケーションのステータスを確認し、Pod が実行されていることを確認します。

    $ oc get pods -w
    NAME                                       READY     STATUS      RESTARTS   AGE
    MY_APP_NAME-1-aaaaa               1/1       Running     0          58s
    MY_APP_NAME-s2i-1-build           0/1       Completed   0          2m

    MY_APP_NAME-1-aaaaa Pod のステータスは、完全にデプロイおよび起動 Running されるとのステータスになります。特定の Pod 名は異なります。中間の数は新しいビルドごとに増加します。末尾の文字は、Pod の作成時に生成されます。

  9. サンプルアプリケーションをデプロイし、起動した後に、そのルートを決定します。

    ルート情報の例

    $ oc get routes
    NAME                 HOST/PORT                                                     PATH      SERVICES        PORT      TERMINATION
    MY_APP_NAME         MY_APP_NAME-MY_PROJECT_NAME.OPENSHIFT_HOSTNAME      MY_APP_NAME      8080

    Pod のルート情報は、アクセスに使用するベース URL を提供します。上記の例では、アプリケーションにアクセスするためのベース URL http://MY_APP_NAME-MY_PROJECT_NAME.OPENSHIFT_HOSTNAME としてを使用します。

8.2.4. 外部設定サンプルアプリケーションの Minishift または CDK へのデプロイ

以下のいずれかのオプションを使用して、Minishift または CDK で Externalized Configuration のサンプルアプリケーションをローカルで実行します。

各メソッドは同じ oc コマンドを使用してアプリケーションをデプロイしますが、Fabric8 Launcher を使用すると、oc コマンドを実行する自動デプロイメントワークフローが提供されます。

8.2.4.1. Fabric8 Launcher ツール URL およびクレデンシャルの取得

Minishift または CDK でサンプルアプリケーションを作成してデプロイするには、Fabric8 Launcher ツール URL およびユーザー認証情報が必要です。この情報は Minishift または CDK の起動時に提供されます。

前提条件

  • Fabric8 Launcher ツールがインストールされ、設定され、実行されている。

手順

  1. Minishift または CDK を起動したコンソールに移動します。
  2. コンソール出力で、実行中の Fabric8 Launcher にアクセスするのに使用できる URL およびユーザークレデンシャルを確認します。

    Minishift または CDK の起動からのコンソールの出力例

    ...
    -- Removing temporary directory ... OK
    -- Server Information ...
       OpenShift server started.
       The server is accessible via web console at:
           https://192.168.42.152:8443
    
       You are logged in as:
           User:     developer
           Password: developer
    
       To login as administrator:
           oc login -u system:admin

8.2.4.2. Fabric8 Launcher ツールを使用したサンプルアプリケーションのデプロイ

前提条件

手順

  1. ブラウザーで Fabric8 Launcher URL に移動します。
  2. 画面の手順にしたがって、Spring Boot でサンプルアプリケーションを作成して起動します。

8.2.4.3. oc CLI クライアントの認証

oc コマンドラインクライアントを使用して Minishift または CDK のアプリケーションの例を使用するには、Minishift または CDK の Web インターフェースによって提供されるトークンを使用してクライアントを認証する必要があります。

前提条件

手順

  1. ブラウザーで Minishift または CDK の URL に移動します。
  2. Web コンソールの右上隅にあるユーザー名の横にある疑問符アイコンをクリックします。
  3. ドロップダウンメニューで Command Line Tools を選択します。
  4. oc login コマンドをコピーします。
  5. ターミナルにコマンドを貼り付けます。コマンドは、認証トークンを使用して、Minishift または CDK アカウントで oc CLI クライアントを認証します。

    $ oc login OPENSHIFT_URL --token=MYTOKEN

8.2.4.4. oc CLI クライアントを使用した外部化設定サンプルアプリケーションのデプロイ

前提条件

手順

  1. GitHub からプロジェクトのクローンを作成します。

    $ git clone git@github.com:USERNAME/MY_PROJECT_NAME.git

    プロジェクトの ZIP ファイルをダウンロードした場合は、展開します。

    $ unzip MY_PROJECT_NAME.zip
  2. 新規 OpenShift プロジェクトを作成します。

    $ oc new-project MY_PROJECT_NAME
  3. サンプルアプリケーションのデプロイ前に view アクセス権限をサービスアカウントに割り当てます。これにより、アプリケーションは ConfigMap の内容を読み取るために OpenShift API にアクセスできるようになります。

    $ oc policy add-role-to-user view -n $(oc project -q) -z default
  4. アプリケーションのルートディレクトリーに移動します。
  5. を使用して ConfigMap 設定を OpenShift にデプロイし application.ymlます。

    $ oc create configmap app-config --from-file=application.yml
  6. ConfigMap 設定がデプロイされていることを確認します。

    $ oc get configmap app-config -o yaml
    
    apiVersion: v1
    data:
      application.yml: |
         # This properties file should be used to initialise a ConfigMap
         greeting:
           message: "Hello %s from a ConfigMap!"
    ...
  7. Maven を使用して OpenShift へのデプロイメントを開始します。

    $ mvn clean fabric8:deploy -Popenshift

    このコマンドは Fabric8 Maven Plugin を使用して OpenShift で S2I プロセス を起動し、Pod を起動します。

  8. アプリケーションのステータスを確認し、Pod が実行されていることを確認します。

    $ oc get pods -w
    NAME                                       READY     STATUS      RESTARTS   AGE
    MY_APP_NAME-1-aaaaa               1/1       Running     0          58s
    MY_APP_NAME-s2i-1-build           0/1       Completed   0          2m

    MY_APP_NAME-1-aaaaa Pod のステータスは、完全にデプロイおよび起動 Running されるとのステータスになります。特定の Pod 名は異なります。中間の数は新しいビルドごとに増加します。末尾の文字は、Pod の作成時に生成されます。

  9. サンプルアプリケーションをデプロイし、起動した後に、そのルートを決定します。

    ルート情報の例

    $ oc get routes
    NAME                 HOST/PORT                                                     PATH      SERVICES        PORT      TERMINATION
    MY_APP_NAME         MY_APP_NAME-MY_PROJECT_NAME.OPENSHIFT_HOSTNAME      MY_APP_NAME      8080

    Pod のルート情報は、アクセスに使用するベース URL を提供します。上記の例では、アプリケーションにアクセスするためのベース URL http://MY_APP_NAME-MY_PROJECT_NAME.OPENSHIFT_HOSTNAME としてを使用します。

8.2.5. 外部設定サンプルアプリケーションの OpenShift Container Platform へのデプロイ

サンプルアプリケーションを OpenShift Container Platform に作成し、デプロイするプロセスは OpenShift Online と似ています。

前提条件

手順

8.2.6. Spring Boot の未変更の外部化設定サンプルアプリケーションとの対話

この例では、GET リクエストを受け入れるデフォルトの HTTP エンドポイントを提供します。

前提条件

  • 実行中のアプリケーション
  • curl バイナリーまたは Web ブラウザー

手順

  1. 例に対して GET リクエスト curl を実行するには、を使用します。ブラウザーを使用してこれを行うこともできます。

    $ curl http://MY_APP_NAME-MY_PROJECT_NAME.OPENSHIFT_HOSTNAME/api/greeting
    {"content":"Hello World from a ConfigMap!"}
  2. デプロイされた ConfigMap 設定を更新します。

    $ oc edit configmap app-config

    greeting.message キーの値をに変更して Bonjour!、ファイルを保存します。これを保存した後、変更は OpenShift インスタンスに伝播されます。

  3. ConfigMap 設定の変更が反映されるように、新しいバージョンのアプリケーションをデプロイします。

    $ oc rollout latest dc/MY_APP_NAME
  4. サンプルのステータスを確認し、新規 Pod が実行されていることを確認します。

    $ oc get pods -w
    NAME                             READY     STATUS      RESTARTS   AGE
    MY_APP_NAME-1-aaaaa       1/1       Running     0          58s
    MY_APP_NAME-s2i-1-build   0/1       Completed   0          2m

    MY_APP_NAME-1-aaaaa Pod のステータスは、完全にデプロイされ、起動されると Running のステータスになります。特定の Pod 名は異なります。中間の数は新しいビルドごとに増加します。末尾の文字は、Pod の作成時に生成されます。

  5. 更新された ConfigMap 設定の例 curl に対してを使用して GET 要求を実行し、更新された greeting を表示します。また、アプリケーションの Web フォームを使用して、ブラウザーから実行できます。

    $ curl http://MY_APP_NAME-MY_PROJECT_NAME.OPENSHIFT_HOSTNAME/api/greeting
    {"content":"Bonjour!"}

8.2.7. 外部設定のサンプルアプリケーションインテグレーションテストの実行

このアプリケーションの例には、自己完結型の統合テストセットが含まれます。OpenShift プロジェクト内で実行される場合、テストは次のとおりです。

  • アプリケーションのテストインスタンスをプロジェクトにデプロイします。
  • そのインスタンスで個別のテストを実行します。
  • テストの完了時に、プロジェクトのインスタンスをすべて削除します。
警告

統合テストを実行すると、サンプルアプリケーションの既存のインスタンスがすべてターゲット OpenShift プロジェクトから削除します。サンプルアプリケーションを誤って削除しないようにするには、テストを実行する別の OpenShift プロジェクトを作成して選択します。

前提条件

  • 認証された oc クライアント
  • 空の OpenShift プロジェクト
  • サンプルアプリケーションのサービスアカウントに割り当てられたアクセスパーミッションを表示します。これにより、アプリケーションは ConfigMap から設定を読み取ることができます。

    $ oc policy add-role-to-user view -n $(oc project -q) -z default

手順

以下のコマンドを実行してインテグレーションテストを実行します。

$ mvn clean verify -Popenshift,openshift-it

8.2.8. Externalized Configuration リソース

Externalized Configuration および ConfigMap についての背景および関連情報は、以下を参照してください。

8.3. Spring Boot のリレーショナルデータベースバックエンドの例

重要

以下の例は、実稼働環境で実行する予定はありません。

制限: このサンプルアプリケーションを Minishift または CDK で実行します。手動のワークフローを使用して、以下の例を OpenShift Online Pro および OpenShift Container Platform にデプロイすることもできます。この例は、現在 OpenShift Online Starter では使用できません。

修飾レベルの例: Foundational

リレーショナルデータベースバックエンドの例

Relational Database Backend のサンプルは REST API Level 0 アプリケーションで展開され、単純な HTTP API を使用して PostgreSQL データベースで createreadupdate、および delete (CRUD)操作を実行する基本的な例を提供します。CRUD 操作は永続ストレージの 4 つの基本的な機能であり、データベースを扱う HTTP API の開発時に幅広く使用されます。

この例では、HTTP アプリケーションが OpenShift でデータベースを見つけ、接続する機能も説明します。各ランタイムは、特定のケースで最適な接続ソリューションの実装方法を示しています。ランタイムは、JDBCJPA、または ORM API への直接アクセスなどのオプションを選択できます。

このサンプルアプリケーションは HTTP で CRUD 操作を実行してデータを操作するエンドポイントを提供する HTTP API を公開します。CRUD 操作は HTTP にマップされ Verbsます。API は JSON フォーマットを使用してリクエストを受信し、ユーザーに応答を返します。ユーザーは、サンプルで提供されるユーザーインターフェースを使用してアプリケーションを使用することもできます。この例では、以下を可能にするアプリケーションを提供します。

  • ブラウザーでアプリケーション Web インターフェースに移動します。これにより、単純な Web サイトが公開され、my_data データベースのデータに対して CRUD 操作を実行できます。
  • api/fruits エンドポイントで HTTP GET リクエストを実行します。
  • データベースのすべての fruit の一覧を含む JSON 配列としてフォーマットされた応答を受信します。
  • 有効なアイテム ID を引数として渡す間に、api/fruits/* エンドポイントで HTTP GET リクエストを実行します。
  • 指定の ID を持つ fruit の名前が含まれる JSON 形式の応答を受信します。指定された ID に項目が一致しないと、呼び出しによって HTTP エラー 404 が返されます。
  • 有効な name 値を渡される api/fruits エンドポイントで HTTP POST リクエストを実行し、データベースに新しいエントリーを作成します。
  • 有効な ID と名前を引数として渡す api/fruits/* エンドポイントで HTTP PUT リクエストを実行します。これにより、リクエストで指定された名前と一致するように、指定された ID を持つアイテムの名前が更新されます。
  • 有効な ID を引数として渡して、api/fruits/* エンドポイントで HTTP DELETE リクエストを実行します。これにより、データベースから指定された ID を持つアイテムが削除され、HTTP コード 204 (No Content)が応答として返されます。無効な ID を渡すと、呼び出しによって HTTP エラーが発生し 404ます。

この例には、アプリケーションが完全にデータベースと 統合されたことを確認するために使用できる自動統合テスト のセットも含まれています。

この例では、推奨される HTTP API 手法に従い、完全に成熟した RESTful モデル(レベル 3)ではなく、互換性のある HTTP 動詞およびステータスを使用します。

8.3.1. リレーショナルデータベースバックエンド設計トレードオフ

表8.3 設計の手段

proscons
  • 各ランタイムは、データベースの対話の実装方法を決定します。その 1 つは JDBC などの低レベルの接続 API を使用できますが、他の一部の接続は JPA を使用でき、もう 1 つは ORM API に直接アクセスできます。各ランタイムで最適な方法を決定します。
  • 各ランタイムはスキーマの作成方法を決定します。
  • このサンプルアプリケーションで提供される PostgreSQL データベースは永続ストレージでバックアップされません。データベース Pod を停止または再デプロイすると、データベースへの変更は失われます。変更を保持するために、サンプルアプリケーションの Pod で外部データベースを使用するには、OpenShift ドキュメントの「 Creating an applications with a database 」を参照してください。また、OpenShift のデータベースコンテナーを使用して永続ストレージを設定することもできます。(OpenShift およびコンテナーで永続ストレージを使用する方法についての詳細は、OpenShift ドキュメントの「 永続ストレージ」および「 ボリュームおよび 永続ボリュームの管理 」の章 を参照してください)。

8.3.2. Relational Database Backend サンプルアプリケーションの OpenShift Online へのデプロイ

以下のいずれかのオプションを使用して、OpenShift Online で Relational Database Backend のサンプルアプリケーションを実行します。

各方法では、同じ oc コマンドを使用してアプリケーションをデプロイしますが、developers.redhat.com/launch を使用すると、oc コマンドを実行する自動デプロイメントワークフローが提供されます。

8.3.2.1. developers.redhat.com/launch を使用したサンプルアプリケーションのデプロイ

前提条件

手順

  1. ブラウザーで developers.redhat.com/launch URL に移動します。
  2. 画面の手順にしたがって、Spring Boot でサンプルアプリケーションを作成し、起動します。

8.3.2.2. oc CLI クライアントの認証

oc コマンドラインクライアントを使用して OpenShift Online のアプリケーションサンプルを使用するには、OpenShift Online Web インターフェースによって提供されるトークンを使用してクライアントを認証する必要があります。

前提条件

手順

  1. ブラウザーで OpenShift Online URL に移動します。
  2. Web コンソールの右上隅にあるユーザー名の横にある疑問符アイコンをクリックします。
  3. ドロップダウンメニューで Command Line Tools を選択します。
  4. oc login コマンドをコピーします。
  5. ターミナルにコマンドを貼り付けます。このコマンドは、認証トークンを使用して、OpenShift Online アカウントで oc CLI クライアントを認証します。

    $ oc login OPENSHIFT_URL --token=MYTOKEN

8.3.2.3. oc CLI クライアントを使用したリレーショナルデータベースバックエンドサンプルアプリケーションのデプロイ

前提条件

手順

  1. GitHub からプロジェクトのクローンを作成します。

    $ git clone git@github.com:USERNAME/MY_PROJECT_NAME.git

    プロジェクトの ZIP ファイルをダウンロードした場合は、展開します。

    $ unzip MY_PROJECT_NAME.zip
  2. 新規 OpenShift プロジェクトを作成します。

    $ oc new-project MY_PROJECT_NAME
  3. アプリケーションのルートディレクトリーに移動します。
  4. PostgreSQL データベースを OpenShift にデプロイします。データベースアプリケーションの作成時に、ユーザー名、パスワード、およびデータベース名に以下の値を使用するようにしてください。これらの値を使用するようにアプリケーションの例を事前に設定されています。異なる値を使用すると、アプリケーションがデータベースと統合できなくなります。

    $ oc new-app -e POSTGRESQL_USER=luke -ePOSTGRESQL_PASSWORD=secret -ePOSTGRESQL_DATABASE=my_data centos/postgresql-10-centos7 --name=my-database
  5. データベースのステータスを確認し、Pod が実行されていることを確認します。

    $ oc get pods -w
    my-database-1-aaaaa   1/1       Running   0         45s
    my-database-1-deploy   0/1       Completed   0         53s

    my-database-1-aaaaa Pod のステータスはで、完全にデプロイされ、起動される Running と ready と表示されるはずです。特定の Pod 名は異なります。中間の数は新しいビルドごとに増加します。末尾の文字は、Pod の作成時に生成されます。

  6. maven を使用して、OpenShift へのデプロイメントを開始します。

    $ mvn clean fabric8:deploy -Popenshift

    このコマンドは Fabric8 Maven Plugin を使用して OpenShift で S2I プロセス を起動し、Pod を起動します。

  7. アプリケーションのステータスを確認し、Pod が実行されていることを確認します。

    $ oc get pods -w
    NAME                             READY     STATUS      RESTARTS   AGE
    MY_APP_NAME-1-aaaaa       1/1       Running     0          58s
    MY_APP_NAME-s2i-1-build   0/1       Completed   0          2m

    MY_APP_NAME-1-aaaaa Pod のステータスがで、完全にデプロイされ、起動される Running と ready と表示されるはずです。

  8. サンプルアプリケーションをデプロイし、起動した後に、そのルートを決定します。

    ルート情報の例

    $ oc get routes
    NAME                 HOST/PORT                                     PATH      SERVICES             PORT      TERMINATION
    MY_APP_NAME   MY_APP_NAME-MY_PROJECT_NAME.OPENSHIFT_HOSTNAME      MY_APP_NAME   8080

    Pod のルート情報は、アクセスに使用するベース URL を提供します。上記の例では、アプリケーションにアクセスするためのベース URL http://MY_APP_NAME-MY_PROJECT_NAME.OPENSHIFT_HOSTNAME としてを使用します。

8.3.3. Minishift または CDK へのリレーショナルデータベースバックエンドの例のデプロイ

Minishift または CDK でローカルの Relational Database バックエンドの例を実行するには、以下のいずれかのオプションを使用します。

各メソッドは同じ oc コマンドを使用してアプリケーションをデプロイしますが、Fabric8 Launcher を使用すると、oc コマンドを実行する自動デプロイメントワークフローが提供されます。

8.3.3.1. Fabric8 Launcher ツール URL およびクレデンシャルの取得

Minishift または CDK でサンプルアプリケーションを作成してデプロイするには、Fabric8 Launcher ツール URL およびユーザー認証情報が必要です。この情報は Minishift または CDK の起動時に提供されます。

前提条件

  • Fabric8 Launcher ツールがインストールされ、設定され、実行されている。

手順

  1. Minishift または CDK を起動したコンソールに移動します。
  2. コンソール出力で、実行中の Fabric8 Launcher にアクセスするのに使用できる URL およびユーザークレデンシャルを確認します。

    Minishift または CDK の起動からのコンソールの出力例

    ...
    -- Removing temporary directory ... OK
    -- Server Information ...
       OpenShift server started.
       The server is accessible via web console at:
           https://192.168.42.152:8443
    
       You are logged in as:
           User:     developer
           Password: developer
    
       To login as administrator:
           oc login -u system:admin

8.3.3.2. Fabric8 Launcher ツールを使用したサンプルアプリケーションのデプロイ

前提条件

手順

  1. ブラウザーで Fabric8 Launcher URL に移動します。
  2. 画面の手順にしたがって、Spring Boot でサンプルアプリケーションを作成して起動します。

8.3.3.3. oc CLI クライアントの認証

oc コマンドラインクライアントを使用して Minishift または CDK のアプリケーションの例を使用するには、Minishift または CDK の Web インターフェースによって提供されるトークンを使用してクライアントを認証する必要があります。

前提条件

手順

  1. ブラウザーで Minishift または CDK の URL に移動します。
  2. Web コンソールの右上隅にあるユーザー名の横にある疑問符アイコンをクリックします。
  3. ドロップダウンメニューで Command Line Tools を選択します。
  4. oc login コマンドをコピーします。
  5. ターミナルにコマンドを貼り付けます。コマンドは、認証トークンを使用して、Minishift または CDK アカウントで oc CLI クライアントを認証します。

    $ oc login OPENSHIFT_URL --token=MYTOKEN

8.3.3.4. oc CLI クライアントを使用したリレーショナルデータベースバックエンドサンプルアプリケーションのデプロイ

前提条件

手順

  1. GitHub からプロジェクトのクローンを作成します。

    $ git clone git@github.com:USERNAME/MY_PROJECT_NAME.git

    プロジェクトの ZIP ファイルをダウンロードした場合は、展開します。

    $ unzip MY_PROJECT_NAME.zip
  2. 新規 OpenShift プロジェクトを作成します。

    $ oc new-project MY_PROJECT_NAME
  3. アプリケーションのルートディレクトリーに移動します。
  4. PostgreSQL データベースを OpenShift にデプロイします。データベースアプリケーションの作成時に、ユーザー名、パスワード、およびデータベース名に以下の値を使用するようにしてください。これらの値を使用するようにアプリケーションの例を事前に設定されています。異なる値を使用すると、アプリケーションがデータベースと統合できなくなります。

    $ oc new-app -e POSTGRESQL_USER=luke -ePOSTGRESQL_PASSWORD=secret -ePOSTGRESQL_DATABASE=my_data centos/postgresql-10-centos7 --name=my-database
  5. データベースのステータスを確認し、Pod が実行されていることを確認します。

    $ oc get pods -w
    my-database-1-aaaaa   1/1       Running   0         45s
    my-database-1-deploy   0/1       Completed   0         53s

    my-database-1-aaaaa Pod のステータスはで、完全にデプロイされ、起動される Running と ready と表示されるはずです。特定の Pod 名は異なります。中間の数は新しいビルドごとに増加します。末尾の文字は、Pod の作成時に生成されます。

  6. maven を使用して、OpenShift へのデプロイメントを開始します。

    $ mvn clean fabric8:deploy -Popenshift

    このコマンドは Fabric8 Maven Plugin を使用して OpenShift で S2I プロセス を起動し、Pod を起動します。

  7. アプリケーションのステータスを確認し、Pod が実行されていることを確認します。

    $ oc get pods -w
    NAME                             READY     STATUS      RESTARTS   AGE
    MY_APP_NAME-1-aaaaa       1/1       Running     0          58s
    MY_APP_NAME-s2i-1-build   0/1       Completed   0          2m

    MY_APP_NAME-1-aaaaa Pod のステータスがで、完全にデプロイされ、起動される Running と ready と表示されるはずです。

  8. サンプルアプリケーションをデプロイし、起動した後に、そのルートを決定します。

    ルート情報の例

    $ oc get routes
    NAME                 HOST/PORT                                     PATH      SERVICES             PORT      TERMINATION
    MY_APP_NAME   MY_APP_NAME-MY_PROJECT_NAME.OPENSHIFT_HOSTNAME      MY_APP_NAME   8080

    Pod のルート情報は、アクセスに使用するベース URL を提供します。上記の例では、アプリケーションにアクセスするためのベース URL http://MY_APP_NAME-MY_PROJECT_NAME.OPENSHIFT_HOSTNAME としてを使用します。

8.3.4. リレーショナルデータベースバックエンドのサンプルアプリケーションの OpenShift Container Platform へのデプロイ

サンプルアプリケーションを OpenShift Container Platform に作成し、デプロイするプロセスは OpenShift Online と似ています。

前提条件

手順

8.3.5. リレーショナルデータベースバックエンド API との対話

サンプルアプリケーションの作成が終了したら、以下のように対話できます。

前提条件

  • 実行中のアプリケーション
  • curl バイナリーまたは Web ブラウザー

手順

  1. 以下のコマンドを実行して、アプリケーションの URL を取得します。

    $ oc get route MY_APP_NAME
    NAME                 HOST/PORT                                         PATH      SERVICES             PORT      TERMINATION
    MY_APP_NAME           MY_APP_NAME-MY_PROJECT_NAME.OPENSHIFT_HOSTNAME              MY_APP_NAME           8080
  2. データベースアプリケーションの Web インターフェースにアクセスするには、ブラウザーで アプリケーション URL に移動します。

    http://MY_APP_NAME-MY_PROJECT_NAME.OPENSHIFT_HOSTNAME

    curl以下を使用して、api/fruits/* エンドポイントで要求を直接実行できます。

    データベース内のすべてのエントリーを一覧表示します。

    $ curl http://MY_APP_NAME-MY_PROJECT_NAME.OPENSHIFT_HOSTNAME/api/fruits

    [ {
      "id" : 1,
      "name" : "Apple",
      "stock" : 10
    }, {
      "id" : 2,
      "name" : "Orange",
      "stock" : 10
    }, {
      "id" : 3,
      "name" : "Pear",
      "stock" : 10
    } ]

    特定の ID でエントリーを取得します。

    $ curl http://MY_APP_NAME-MY_PROJECT_NAME.OPENSHIFT_HOSTNAME/api/fruits/3

    {
      "id" : 3,
      "name" : "Pear",
      "stock" : 10
    }

    新規エントリーを作成します。

    $ curl -H "Content-Type: application/json" -X POST -d '{"name":"Peach","stock":1}'  http://MY_APP_NAME-MY_PROJECT_NAME.OPENSHIFT_HOSTNAME/api/fruits

    {
      "id" : 4,
      "name" : "Peach",
      "stock" : 1
    }

    エントリーの更新

    $ curl -H "Content-Type: application/json" -X PUT -d '{"name":"Apple","stock":"100"}'  http://MY_APP_NAME-MY_PROJECT_NAME.OPENSHIFT_HOSTNAME/api/fruits/1

    {
      "id" : 1,
      "name" : "Apple",
      "stock" : 100
    }

    エントリーを削除します。

    $ curl -X DELETE http://MY_APP_NAME-MY_PROJECT_NAME.OPENSHIFT_HOSTNAME/api/fruits/1

トラブルシューティング
  • これらのコマンドを実行した後に HTTP エラーコードを応答 503 として受信した場合は、アプリケーションがまだ準備状態にないことを意味します。

8.3.6. Relational Database バックエンドの例のアプリケーション統合テストの実行

このアプリケーションの例には、自己完結型の統合テストセットが含まれます。OpenShift プロジェクト内で実行される場合、テストは次のとおりです。

  • アプリケーションのテストインスタンスをプロジェクトにデプロイします。
  • そのインスタンスで個別のテストを実行します。
  • テストの完了時に、プロジェクトのインスタンスをすべて削除します。
警告

統合テストを実行すると、サンプルアプリケーションの既存のインスタンスがすべてターゲット OpenShift プロジェクトから削除します。サンプルアプリケーションを誤って削除しないようにするには、テストを実行する別の OpenShift プロジェクトを作成して選択します。

前提条件

  • 認証された oc クライアント
  • 空の OpenShift プロジェクト

手順

以下のコマンドを実行してインテグレーションテストを実行します。

$ mvn clean verify -Popenshift,openshift-it

8.3.7. リレーショナルデータベースリソース

OpenShift、CRUD、HTTP API、および REST でのリレーショナルデータベースの実行に関する背景および関連情報は、以下を参照してください。

8.4. Spring Boot のヘルスチェックの例

重要

以下の例は、実稼働環境で実行する予定はありません。

修飾レベルの例: Foundational

アプリケーションをデプロイする際には、利用可能なかどうか、および受信リクエストの処理を開始することができるかどうかを知ることが重要です。ヘルスチェックパターンを実装すると、アプリケーションの 正常性 を監視できます。これには、アプリケーションが利用可能なかどうか、リクエストに対応できるかどうかが含まれます。

注記

ヘルスチェックの用語に精通していない場合は、最初に 「ヘルスチェックの概念」 セクションを参照してください。

このユースケースの目的は、プローブを使用したヘルスチェックパターンを示しています。プローブは、アプリケーションの liveness および readiness を報告するために使用されます。このユースケースでは、HTTP リクエストを発行するように HTTP health エンドポイントを公開するアプリケーションを設定します。コンテナーが health HTTP エンドポイントの liveness プローブに従って有効である場合は、管理プラットフォームは戻りコード 200 として受信し、それ以上のアクションは必要ありません。health HTTP エンドポイントが応答を返しない場合(スレッドがブロックされている場合など)、アプリケーションは liveness プローブに従って動作していると見なされません。この場合、プラットフォームはそのアプリケーションに対応する Pod を強制終了し、アプリケーションを再起動するために新規 Pod を再作成します。

このユースケースでは、readiness プローブを実証し、使用することができます。アプリケーションが実行されていても、再起動時にアプリケーションが HTTP 503 応答コードを返す場合など、アプリケーションが readiness プローブに従って準備状態にあると見なされる場合、このアプリケーションは readiness プローブに従って HTTP 応答コードを返す場合などです。アプリケーションが readiness プローブによって準備状態にあるとみなされない場合、readiness プローブに従って準備状態にあると見なされるまで要求はそのアプリケーションにルーティングされません。

8.4.1. ヘルスチェックの概念

ヘルスチェックパターンを理解するには、まず以下の概念を理解する必要があります。

Liveness
Liveness は、アプリケーションが実行しているかどうかを定義します。実行中のアプリケーションが応答しない状態または停止状態に移行することがあるため、再起動する必要があります。liveness を確認すると、アプリケーションが再起動する必要があるかどうかを判断するのに役立ちます。
readiness
readiness は、実行中のアプリケーションがリクエストに対応できるかどうかを定義します。実行中のアプリケーションがエラーまたは破損状態に移行することがあります。この場合、要求に対応できなくなりました。readiness の確認は、リクエストをそのアプリケーションにルーティングし続けるかどうかを判断するのに役立ちます。
fail-over
fail-over により、要求のサービスが正常に処理されるようになります。アプリケーションがリクエストのサービスに失敗すると、その要求と今後のリクエストは フェイルオーバーするか、同じアプリケーションの冗長コピーである別のアプリケーションにルーティングすることができます。
回復性と安定性
回復性および安定性により、要求のサービスが適切に処理される障害を適切に処理できます。接続損失によりアプリケーションがリクエストのサービスに失敗する場合、回復性のあるシステムでは、接続の再確立後に要求の再試行が可能です。
probe
プローブは、実行中のコンテナーで定期的に診断を実行する Kubernetes の動作です。

8.4.2. Health Check サンプルアプリケーションの OpenShift Online へのデプロイ

OpenShift Online で Health Check サンプルアプリケーションを実行するには、以下のいずれかのオプションを使用します。

各方法では、同じ oc コマンドを使用してアプリケーションをデプロイしますが、developers.redhat.com/launch を使用すると、oc コマンドを実行する自動デプロイメントワークフローが提供されます。

8.4.2.1. developers.redhat.com/launch を使用したサンプルアプリケーションのデプロイ

前提条件

手順

  1. ブラウザーで developers.redhat.com/launch URL に移動します。
  2. 画面の手順にしたがって、Spring Boot でサンプルアプリケーションを作成し、起動します。

8.4.2.2. oc CLI クライアントの認証

oc コマンドラインクライアントを使用して OpenShift Online のアプリケーションサンプルを使用するには、OpenShift Online Web インターフェースによって提供されるトークンを使用してクライアントを認証する必要があります。

前提条件

手順

  1. ブラウザーで OpenShift Online URL に移動します。
  2. Web コンソールの右上隅にあるユーザー名の横にある疑問符アイコンをクリックします。
  3. ドロップダウンメニューで Command Line Tools を選択します。
  4. oc login コマンドをコピーします。
  5. ターミナルにコマンドを貼り付けます。このコマンドは、認証トークンを使用して、OpenShift Online アカウントで oc CLI クライアントを認証します。

    $ oc login OPENSHIFT_URL --token=MYTOKEN

8.4.2.3. oc CLI クライアントを使用した Health Check サンプルアプリケーションのデプロイ

前提条件

手順

  1. GitHub からプロジェクトのクローンを作成します。

    $ git clone git@github.com:USERNAME/MY_PROJECT_NAME.git

    プロジェクトの ZIP ファイルをダウンロードした場合は、展開します。

    $ unzip MY_PROJECT_NAME.zip
  2. 新規 OpenShift プロジェクトを作成します。

    $ oc new-project MY_PROJECT_NAME
  3. アプリケーションのルートディレクトリーに移動します。
  4. Maven を使用して OpenShift へのデプロイメントを開始します。

    $ mvn clean fabric8:deploy -Popenshift

    このコマンドは Fabric8 Maven Plugin を使用して OpenShift で S2I プロセス を起動し、Pod を起動します。

  5. アプリケーションのステータスを確認し、Pod が実行されていることを確認します。

    $ oc get pods -w
    NAME                             READY     STATUS      RESTARTS   AGE
    MY_APP_NAME-1-aaaaa               1/1       Running     0          58s
    MY_APP_NAME-s2i-1-build           0/1       Completed   0          2m

    MY_APP_NAME-1-aaaaa Pod のステータスは、完全にデプロイおよび起動 Running されるとのステータスになります。また、続行する前に Pod が準備状態になるのを待つ必要があります。これは READY コラムに表示されます。たとえば、MY_APP_NAME-1-aaaaa はコラムがの場合には準備が READY 整い 1/1ます。特定の Pod 名は異なります。中間の数は新しいビルドごとに増加します。末尾の文字は、Pod の作成時に生成されます。

  6. サンプルアプリケーションをデプロイし、起動した後に、そのルートを決定します。

    ルート情報の例

    $ oc get routes
    NAME                 HOST/PORT                                                     PATH      SERVICES        PORT      TERMINATION
    MY_APP_NAME         MY_APP_NAME-MY_PROJECT_NAME.OPENSHIFT_HOSTNAME      MY_APP_NAME      8080

    Pod のルート情報は、アクセスに使用するベース URL を提供します。上記の例では、アプリケーションにアクセスするためのベース URL http://MY_APP_NAME-MY_PROJECT_NAME.OPENSHIFT_HOSTNAME としてを使用します。

8.4.3. Minishift または CDK への Health Check サンプルアプリケーションのデプロイ

Minishift または CDK でローカルに Health Check のサンプルアプリケーションを実行するには、以下のいずれかのオプションを使用します。

各メソッドは同じ oc コマンドを使用してアプリケーションをデプロイしますが、Fabric8 Launcher を使用すると、oc コマンドを実行する自動デプロイメントワークフローが提供されます。

8.4.3.1. Fabric8 Launcher ツール URL およびクレデンシャルの取得

Minishift または CDK でサンプルアプリケーションを作成してデプロイするには、Fabric8 Launcher ツール URL およびユーザー認証情報が必要です。この情報は Minishift または CDK の起動時に提供されます。

前提条件

  • Fabric8 Launcher ツールがインストールされ、設定され、実行されている。

手順

  1. Minishift または CDK を起動したコンソールに移動します。
  2. コンソール出力で、実行中の Fabric8 Launcher にアクセスするのに使用できる URL およびユーザークレデンシャルを確認します。

    Minishift または CDK の起動からのコンソールの出力例

    ...
    -- Removing temporary directory ... OK
    -- Server Information ...
       OpenShift server started.
       The server is accessible via web console at:
           https://192.168.42.152:8443
    
       You are logged in as:
           User:     developer
           Password: developer
    
       To login as administrator:
           oc login -u system:admin

8.4.3.2. Fabric8 Launcher ツールを使用したサンプルアプリケーションのデプロイ

前提条件

手順

  1. ブラウザーで Fabric8 Launcher URL に移動します。
  2. 画面の手順にしたがって、Spring Boot でサンプルアプリケーションを作成して起動します。

8.4.3.3. oc CLI クライアントの認証

oc コマンドラインクライアントを使用して Minishift または CDK のアプリケーションの例を使用するには、Minishift または CDK の Web インターフェースによって提供されるトークンを使用してクライアントを認証する必要があります。

前提条件

手順

  1. ブラウザーで Minishift または CDK の URL に移動します。
  2. Web コンソールの右上隅にあるユーザー名の横にある疑問符アイコンをクリックします。
  3. ドロップダウンメニューで Command Line Tools を選択します。
  4. oc login コマンドをコピーします。
  5. ターミナルにコマンドを貼り付けます。コマンドは、認証トークンを使用して、Minishift または CDK アカウントで oc CLI クライアントを認証します。

    $ oc login OPENSHIFT_URL --token=MYTOKEN

8.4.3.4. oc CLI クライアントを使用した Health Check サンプルアプリケーションのデプロイ

前提条件

手順

  1. GitHub からプロジェクトのクローンを作成します。

    $ git clone git@github.com:USERNAME/MY_PROJECT_NAME.git

    プロジェクトの ZIP ファイルをダウンロードした場合は、展開します。

    $ unzip MY_PROJECT_NAME.zip
  2. 新規 OpenShift プロジェクトを作成します。

    $ oc new-project MY_PROJECT_NAME
  3. アプリケーションのルートディレクトリーに移動します。
  4. Maven を使用して OpenShift へのデプロイメントを開始します。

    $ mvn clean fabric8:deploy -Popenshift

    このコマンドは Fabric8 Maven Plugin を使用して OpenShift で S2I プロセス を起動し、Pod を起動します。

  5. アプリケーションのステータスを確認し、Pod が実行されていることを確認します。

    $ oc get pods -w
    NAME                             READY     STATUS      RESTARTS   AGE
    MY_APP_NAME-1-aaaaa               1/1       Running     0          58s
    MY_APP_NAME-s2i-1-build           0/1       Completed   0          2m

    MY_APP_NAME-1-aaaaa Pod のステータスは、完全にデプロイおよび起動 Running されるとのステータスになります。また、続行する前に Pod が準備状態になるのを待つ必要があります。これは READY コラムに表示されます。たとえば、MY_APP_NAME-1-aaaaa はコラムがの場合には準備が READY 整い 1/1ます。特定の Pod 名は異なります。中間の数は新しいビルドごとに増加します。末尾の文字は、Pod の作成時に生成されます。

  6. サンプルアプリケーションをデプロイし、起動した後に、そのルートを決定します。

    ルート情報の例

    $ oc get routes
    NAME                 HOST/PORT                                                     PATH      SERVICES        PORT      TERMINATION
    MY_APP_NAME         MY_APP_NAME-MY_PROJECT_NAME.OPENSHIFT_HOSTNAME      MY_APP_NAME      8080

    Pod のルート情報は、アクセスに使用するベース URL を提供します。上記の例では、アプリケーションにアクセスするためのベース URL http://MY_APP_NAME-MY_PROJECT_NAME.OPENSHIFT_HOSTNAME としてを使用します。

8.4.4. Health Check サンプルアプリケーションの OpenShift Container Platform へのデプロイ

サンプルアプリケーションを OpenShift Container Platform に作成し、デプロイするプロセスは OpenShift Online と似ています。

前提条件

手順

8.4.5. 未変更の Health Check アプリケーションとの対話

サンプルアプリケーションをデプロイすると、MY_APP_NAME サービスが実行できるようになります。MY_APP_NAME サービスは、以下の REST エンドポイントを公開します。

/api/greeting
名前を String として返します。
/api/stop
障害をシミュレートする方法として、サービスを強制的に応答させないようにします。

以下の手順では、サービスの可用性を検証し、障害をシミュレートする方法を示しています。利用可能なサービスの失敗により、OpenShift の自己修復機能がサービス上でトリガーされます。

続いて、Web インターフェースを使用してこれらの手順を実行できます。

  1. MY_APP_NAME サービスに対して GET 要求 curl を実行するには、を使用します。ブラウザーを使用してこれを行うこともできます。

    $ curl http://MY_APP_NAME-MY_PROJECT_NAME.OPENSHIFT_HOSTNAME/api/greeting
    {"content":"Hello, World!"}
  2. /api/stop エンドポイントを呼び出して、エンドポイントの直後に /api/greeting エンドポイントの可用性を確認します。

    /api/stop エンドポイントを呼び出すと、内部サービス障害をシミュレートし、OpenShift の自己修復機能をトリガーします。障害をシミュレートし /api/greeting た後にを呼び出すと、サービスは Application is not available ページを返すはずです。

    $ curl http://MY_APP_NAME-MY_PROJECT_NAME.OPENSHIFT_HOSTNAME/api/stop

    (以下で表示)

    $ curl http://MY_APP_NAME-MY_PROJECT_NAME.OPENSHIFT_HOSTNAME/api/greeting
    <html>
      <head>
      ...
      </head>
      <body>
        <div>
          <h1>Application is not available</h1>
          ...
        </div>
      </body>
    </html>
    注記

    /api/stop エンドポイントの呼び出し後に OpenShift が Pod を削除した場合に応じて、最初に 404 のエラーコードが表示される可能性があります。/api/greeting エンドポイントの呼び出しを続けると、OpenShift で Pod を削除した後に Application is not available ページが表示されます。

  3. を使用 oc get pods -w して、アクション内の自己修復機能を継続的に監視します。

    サービスの障害が発生する間は、OpenShift コンソールまたは oc クライアントツールで自己修復機能を確認できます。READY 状態の Pod 数がゼロ(0/1)に移行した後、1 分を経過すると(1 分未満)、その後に Pod の数が 1 つに戻ります(1/1)。その他に、サービス障害を呼び出すたびに RESTARTS 数が増えます。

    $ oc get pods -w
    NAME                           READY     STATUS    RESTARTS   AGE
    MY_APP_NAME-1-26iy7   0/1       Running   5          18m
    MY_APP_NAME-1-26iy7   1/1       Running   5         19m
  4. オプション: Web インターフェースを使用してサービスを呼び出します。

    ターミナルウィンドウを使用した対話にしたがって、サービスによって提供される Web インターフェースを使用して、異なるメソッドを起動し、サービスがライフサイクルフェーズに移行するのを確認できます。

    http://MY_APP_NAME-MY_PROJECT_NAME.OPENSHIFT_HOSTNAME
  5. オプション: Web コンソールを使用して、自己修復プロセスの各段階でアプリケーションによって生成されたログ出力を表示します。

    1. プロジェクトに移動します。
    2. サイドバーで、Monitoring をクリックします。
    3. 画面右上隅にある Events をクリックし、ログメッセージを表示します。
    4. オプション: View Details をクリックして、イベントログの詳細ビューを表示します。

    ヘルスチェックアプリケーションは以下のメッセージを生成します。

    message状態

    Unhealthy

    readiness プローブに失敗しました。このメッセージは予想され、/api/greeting エンドポイントのシミュレーションされた障害が検出され、セルフ修復プロセスが開始することを示します。

    Killing

    サービスを実行する利用不可の Docker コンテナーは、再作成される前に強制終了されます。

    Pulling

    最新バージョンの Docker イメージをダウンロードして、コンテナーを再作成します。

    Pulled

    Docker イメージが正常にダウンロードされました。

    Created

    Docker コンテナーが正常に作成されました。

    Started

    Docker コンテナーが要求を処理する準備ができている

8.4.6. Health Check のサンプルアプリケーションインテグレーションテストの実行

このアプリケーションの例には、自己完結型の統合テストセットが含まれます。OpenShift プロジェクト内で実行される場合、テストは次のとおりです。

  • アプリケーションのテストインスタンスをプロジェクトにデプロイします。
  • そのインスタンスで個別のテストを実行します。
  • テストの完了時に、プロジェクトのインスタンスをすべて削除します。
警告

統合テストを実行すると、サンプルアプリケーションの既存のインスタンスがすべてターゲット OpenShift プロジェクトから削除します。サンプルアプリケーションを誤って削除しないようにするには、テストを実行する別の OpenShift プロジェクトを作成して選択します。

前提条件

  • 認証された oc クライアント
  • 空の OpenShift プロジェクト

手順

以下のコマンドを実行してインテグレーションテストを実行します。

$ mvn clean verify -Popenshift,openshift-it

8.4.7. ヘルスチェックのリソース

ヘルスチェックに関する背景と関連情報は、以下を参照してください。

8.5. Spring Boot のサーキットブレーカーの例

重要

以下の例は、実稼働環境で実行する予定はありません。

制限: このサンプルアプリケーションを Minishift または CDK で実行します。手動のワークフローを使用して、以下の例を OpenShift Online Pro および OpenShift Container Platform にデプロイすることもできます。この例は、現在 OpenShift Online Starter では使用できません。

修飾レベルの例: Foundational

Circuit Breaker の例は、サービス障害を報告し、要求の処理で使用できるまで、失敗したサービスへのアクセスを制限する一般的なパターンを示しています。これは、機能の障害が発生したサービスに依存する他のサービスでの繰り返し失敗を防ぐのに役立ちます。

この例は、サービスに Circuit Breaker およびフォールバックパターンを実装する方法を示しています。

8.5.1. サーキットブレーカー設計パターン

Circuit Breaker は、以下のパターンです。

  • サービスが他のサービスを同期的に呼び出すサービスアーキテクチャーにおけるネットワーク障害の影響と、レイテンシーが短縮されます。

    サービスのいずれかの場合には、以下のコマンドを実行します。

    • ネットワーク障害により利用できなくなる
    • トラフィックのオーバーヒュームにより、レイテンシーの値が非常に大きいことが原因となります。

    エンドポイントを呼び出す他のサービスが、そのエンドポイントに到達しようとすると、重要なリソースを使い切らない可能性があり、それら自体が使用できなくなる可能性があります。

  • この状態が cascading と呼ばれるようになり、マイクロサービスアーキテクチャー全体が使用できなくなる可能性があります。
  • 保護されている機能とリモート機能との間のプロキシーとして機能し、失敗を監視します。
  • 障害が特定のしきい値に到達すると、サーキットブレーカーへの呼び出しはすべて、保護されている呼び出しを行わずにエラーまたは事前定義のフォールバック応答を返します。

Circuit Breaker には通常、Circuit Breaker のトリップ時に通知するエラー報告メカニズムも含まれています。

サーキットブレーカーの実装
  • Circuit Breaker パターンを実装すると、サービスクライアントは一定の間隔でプロキシーを介してリモートサービスエンドポイントを呼び出します。
  • リモートサービスエンドポイントへの呼び出しを繰り返しかつ一貫して失敗した場合、Circuit Breaker トリップは、設定されたタイムアウト期間でサービスへのすべての呼び出しを即座に失敗し、事前定義されたフォールバック応答を返します。
  • タイムアウトの期限が切れると、テストコールの数がリモートサービスに渡され、修復されているか、または利用不可のままであると判断できます。

    • テスト呼び出しが失敗すると、Circuit Breaker はサービスを利用できない状態にし、受信した呼び出しにフォールバック応答を返し続けます。
    • テスト呼び出しに成功すると、Circuit Breaker は閉じ、トラフィックが完全にリモートサービスに到達できるようになります。

8.5.2. サーキットブレーカー設計のトレードオフ

表8.4 設計の手段

proscons
  • サービスが呼び出す他のサービスの障害を処理できるようにします。
  • タイムアウト値の最適化が困難である可能性があります。

    • large-than-necessary タイムアウト値は、レイテンシーが過剰に発生する可能性があります。
    • small-than-necessary タイムアウト値によって誤検出が発生する可能性があります。

8.5.3. Circuit Breaker サンプルアプリケーションの OpenShift Online へのデプロイ

以下のオプションのいずれかを使用して、OpenShift Online で Circuit Breaker サンプルアプリケーションを実行します。

各方法では、同じ oc コマンドを使用してアプリケーションをデプロイしますが、developers.redhat.com/launch を使用すると、oc コマンドを実行する自動デプロイメントワークフローが提供されます。

8.5.3.1. developers.redhat.com/launch を使用したサンプルアプリケーションのデプロイ

前提条件

手順

  1. ブラウザーで developers.redhat.com/launch URL に移動します。
  2. 画面の手順にしたがって、Spring Boot でサンプルアプリケーションを作成し、起動します。

8.5.3.2. oc CLI クライアントの認証

oc コマンドラインクライアントを使用して OpenShift Online のアプリケーションサンプルを使用するには、OpenShift Online Web インターフェースによって提供されるトークンを使用してクライアントを認証する必要があります。

前提条件

手順

  1. ブラウザーで OpenShift Online URL に移動します。
  2. Web コンソールの右上隅にあるユーザー名の横にある疑問符アイコンをクリックします。
  3. ドロップダウンメニューで Command Line Tools を選択します。
  4. oc login コマンドをコピーします。
  5. ターミナルにコマンドを貼り付けます。このコマンドは、認証トークンを使用して、OpenShift Online アカウントで oc CLI クライアントを認証します。

    $ oc login OPENSHIFT_URL --token=MYTOKEN

8.5.3.3. oc CLI クライアントを使用した Circuit Breaker サンプルアプリケーションのデプロイ

前提条件

手順

  1. GitHub からプロジェクトのクローンを作成します。

    $ git clone git@github.com:USERNAME/MY_PROJECT_NAME.git

    プロジェクトの ZIP ファイルをダウンロードした場合は、展開します。

    $ unzip MY_PROJECT_NAME.zip
  2. 新規 OpenShift プロジェクトを作成します。

    $ oc new-project MY_PROJECT_NAME
  3. アプリケーションのルートディレクトリーに移動します。
  4. Maven を使用して OpenShift へのデプロイメントを開始します。

    $ mvn clean fabric8:deploy -Popenshift

    このコマンドは Fabric8 Maven Plugin を使用して OpenShift で S2I プロセス を起動し、Pod を起動します。

  5. アプリケーションのステータスを確認し、Pod が実行されていることを確認します。

    $ oc get pods -w
    NAME                             READY     STATUS      RESTARTS   AGE
    MY_APP_NAME-greeting-1-aaaaa     1/1       Running   0           17s
    MY_APP_NAME-greeting-1-deploy    0/1       Completed 0           22s
    MY_APP_NAME-name-1-aaaaa         1/1       Running   0           14s
    MY_APP_NAME-name-1-deploy        0/1       Completed 0           28s

    MY_APP_NAME-greeting-1-aaaaaMY_APP_NAME-name-1-aaaaa Pod の両方のステータス Running は、完全にデプロイされ、起動されるとのステータスになります。また、続行する前に Pod が準備状態になるのを待ってください。これは READY コラムに表示されます。たとえば、MY_APP_NAME-greeting-1-aaaaa はコラムがの場合には準備が READY 整い 1/1ます。特定の Pod 名は異なります。中間の数は新しいビルドごとに増加します。末尾の文字は、Pod の作成時に生成されます。

  6. サンプルアプリケーションをデプロイし、起動した後に、そのルートを決定します。

    ルート情報の例

    $ oc get routes
    NAME                 HOST/PORT                                                     PATH      SERVICES        PORT      TERMINATION
    MY_APP_NAME-greeting   MY_APP_NAME-greeting-MY_PROJECT_NAME.OPENSHIFT_HOSTNAME            MY_APP_NAME-greeting   8080                    None
    MY_APP_NAME-name       MY_APP_NAME-name-MY_PROJECT_NAME.OPENSHIFT_HOSTNAME            MY_APP_NAME-name       8080                    None

    Pod のルート情報は、アクセスに使用するベース URL を提供します。上記の例では、アプリケーションにアクセスするためのベース URL http://MY_APP_NAME-greeting-MY_PROJECT_NAME.OPENSHIFT_HOSTNAME としてを使用します。

8.5.4. Minishift または CDK への Circuit Breaker サンプルアプリケーションのデプロイ

Minishift または CDK で Circuit Breaker のサンプルアプリケーションをローカルに実行するには、以下のいずれかのオプションを使用します。

各メソッドは同じ oc コマンドを使用してアプリケーションをデプロイしますが、Fabric8 Launcher を使用すると、oc コマンドを実行する自動デプロイメントワークフローが提供されます。

8.5.4.1. Fabric8 Launcher ツール URL およびクレデンシャルの取得

Minishift または CDK でサンプルアプリケーションを作成してデプロイするには、Fabric8 Launcher ツール URL およびユーザー認証情報が必要です。この情報は Minishift または CDK の起動時に提供されます。

前提条件

  • Fabric8 Launcher ツールがインストールされ、設定され、実行されている。

手順

  1. Minishift または CDK を起動したコンソールに移動します。
  2. コンソール出力で、実行中の Fabric8 Launcher にアクセスするのに使用できる URL およびユーザークレデンシャルを確認します。

    Minishift または CDK の起動からのコンソールの出力例

    ...
    -- Removing temporary directory ... OK
    -- Server Information ...
       OpenShift server started.
       The server is accessible via web console at:
           https://192.168.42.152:8443
    
       You are logged in as:
           User:     developer
           Password: developer
    
       To login as administrator:
           oc login -u system:admin

8.5.4.2. Fabric8 Launcher ツールを使用したサンプルアプリケーションのデプロイ

前提条件

手順

  1. ブラウザーで Fabric8 Launcher URL に移動します。
  2. 画面の手順にしたがって、Spring Boot でサンプルアプリケーションを作成して起動します。

8.5.4.3. oc CLI クライアントの認証

oc コマンドラインクライアントを使用して Minishift または CDK のアプリケーションの例を使用するには、Minishift または CDK の Web インターフェースによって提供されるトークンを使用してクライアントを認証する必要があります。

前提条件

手順

  1. ブラウザーで Minishift または CDK の URL に移動します。
  2. Web コンソールの右上隅にあるユーザー名の横にある疑問符アイコンをクリックします。
  3. ドロップダウンメニューで Command Line Tools を選択します。
  4. oc login コマンドをコピーします。
  5. ターミナルにコマンドを貼り付けます。コマンドは、認証トークンを使用して、Minishift または CDK アカウントで oc CLI クライアントを認証します。

    $ oc login OPENSHIFT_URL --token=MYTOKEN

8.5.4.4. oc CLI クライアントを使用した Circuit Breaker サンプルアプリケーションのデプロイ

前提条件

手順

  1. GitHub からプロジェクトのクローンを作成します。

    $ git clone git@github.com:USERNAME/MY_PROJECT_NAME.git

    プロジェクトの ZIP ファイルをダウンロードした場合は、展開します。

    $ unzip MY_PROJECT_NAME.zip
  2. 新規 OpenShift プロジェクトを作成します。

    $ oc new-project MY_PROJECT_NAME
  3. アプリケーションのルートディレクトリーに移動します。
  4. Maven を使用して OpenShift へのデプロイメントを開始します。

    $ mvn clean fabric8:deploy -Popenshift

    このコマンドは Fabric8 Maven Plugin を使用して OpenShift で S2I プロセス を起動し、Pod を起動します。

  5. アプリケーションのステータスを確認し、Pod が実行されていることを確認します。

    $ oc get pods -w
    NAME                             READY     STATUS      RESTARTS   AGE
    MY_APP_NAME-greeting-1-aaaaa     1/1       Running   0           17s
    MY_APP_NAME-greeting-1-deploy    0/1       Completed 0           22s
    MY_APP_NAME-name-1-aaaaa         1/1       Running   0           14s
    MY_APP_NAME-name-1-deploy        0/1       Completed 0           28s

    MY_APP_NAME-greeting-1-aaaaaMY_APP_NAME-name-1-aaaaa Pod の両方のステータス Running は、完全にデプロイされ、起動されるとのステータスになります。また、続行する前に Pod が準備状態になるのを待ってください。これは READY コラムに表示されます。たとえば、MY_APP_NAME-greeting-1-aaaaa はコラムがの場合には準備が READY 整い 1/1ます。特定の Pod 名は異なります。中間の数は新しいビルドごとに増加します。末尾の文字は、Pod の作成時に生成されます。

  6. サンプルアプリケーションをデプロイし、起動した後に、そのルートを決定します。

    ルート情報の例

    $ oc get routes
    NAME                 HOST/PORT                                                     PATH      SERVICES        PORT      TERMINATION
    MY_APP_NAME-greeting   MY_APP_NAME-greeting-MY_PROJECT_NAME.OPENSHIFT_HOSTNAME            MY_APP_NAME-greeting   8080                    None
    MY_APP_NAME-name       MY_APP_NAME-name-MY_PROJECT_NAME.OPENSHIFT_HOSTNAME            MY_APP_NAME-name       8080                    None

    Pod のルート情報は、アクセスに使用するベース URL を提供します。上記の例では、アプリケーションにアクセスするためのベース URL http://MY_APP_NAME-greeting-MY_PROJECT_NAME.OPENSHIFT_HOSTNAME としてを使用します。

8.5.5. Circuit Breaker サンプルアプリケーションの OpenShift Container Platform へのデプロイ

サンプルアプリケーションを OpenShift Container Platform に作成し、デプロイするプロセスは OpenShift Online と似ています。

前提条件

手順

8.5.6. 変更されていない Spring Boot Circuit Breaker サンプルアプリケーションとの対話

Spring Boot のサンプルアプリケーションをデプロイしたら、以下のサービスが稼働状態になります。

MY_APP_NAME-name

以下のエンドポイントを公開します。

  • このサービスが動作している場合に名前を返す /api/name エンドポイントと、このサービスが失敗を実証するように設定するとエラーが発生します。
  • エンドポイント: /api/state エンドポイントの動作を制御し、サービスが正常に動作するか /api/name、または障害を実証するかを決定します。
MY_APP_NAME-greeting

以下のエンドポイントを公開します。

  • カスタマイズした応答を取得するために呼び出すことのできる /api/greeting エンドポイント。

    /api/greeting エンドポイントを呼び出すと、要求の処理の一環として、MY_APP_NAME-name サービスの /api/name エンドポイントに対する呼び出しが発行されます。/api/name エンドポイントに対して行われる呼び出しは、Circuit Breaker によって保護されます。

    リモートエンドポイントが利用可能な場合、name サービスは HTTP コード 200 (OK)で応答し、/api/greeting エンドポイントから以下の greeting を受け取ります。

    {"content":"Hello, World!"}

    リモートエンドポイントが利用できない場合、name サービスは HTTP コード 500 (Internal server error)で応答し、/api/greeting エンドポイントから事前にフォールバック応答を受け取ります。

    {"content":"Hello, Fallback!"}
  • Circuit Breaker の状態を返す /api/cb-state エンドポイント。状態は以下の通りです。

    • Open : サーキットブレーカーは、要求が失敗したサービスに到達できないようにし います。
    • closed: サーキットブレーカーは、サービスに到達できる要求を許可します。

以下の手順では、サービスの可用性の確認、障害をシミュレートし、フォールバック応答を受信する方法を示しています。

  1. MY_APP_NAME-greeting サービスに対して GET 要求 curl を実行するには、を使用します。Web インターフェースの Invoke ボタンを使用してこれを行うこともできます。

    $ curl http://MY_APP_NAME-greeting-MY_PROJECT_NAME.LOCAL_OPENSHIFT_HOSTNAME/api/greeting
    {"content":"Hello, World!"}
  2. MY_APP_NAME-name サービスの障害をシミュレートするには、以下を行います。

    • Web インターフェースの Toggle ボタンを使用します。
    • MY_APP_NAME-name サービスを実行している Pod のレプリカ数を 0 にスケールダウンします。
    • MY_APP_NAME-name サービスの /api/state エンドポイントに対して HTTP PUT 要求を実行し、その状態をに設定し failます。

      $ curl -X PUT -H "Content-Type: application/json" -d '{"state": "fail"}' http://MY_APP_NAME-name-MY_PROJECT_NAME.LOCAL_OPENSHIFT_HOSTNAME/api/state
  3. /api/greeting エンドポイントを呼び出します。/api/name エンドポイントでの複数の要求が失敗すると、以下を行います。

    1. Circuit Breaker が開きます。
    2. Web インターフェースの状態インジケーターがから CLOSED に変わります。OPEN
    3. Circuit Breaker は、/api/greeting エンドポイントの呼び出し時にフォールバック応答を発行します。

      $ curl http://MY_APP_NAME-greeting-MY_PROJECT_NAME.LOCAL_OPENSHIFT_HOSTNAME/api/greeting
      {"content":"Hello, Fallback!"}
  4. ネーム MY_APP_NAME-name サービスを可用性に復元します。これを行うには、以下を行います。

    • Web インターフェースの Toggle ボタンを使用します。
    • MY_APP_NAME-name サービスを実行している Pod のレプリカ数を 1 にスケールアップします。
    • MY_APP_NAME-name サービスの /api/state エンドポイントに対して HTTP PUT 要求を実行し、その状態をに設定し okます。

      $ curl -X PUT -H "Content-Type: application/json" -d '{"state": "ok"}' http://MY_APP_NAME-name-MY_PROJECT_NAME.LOCAL_OPENSHIFT_HOSTNAME/api/state
  5. /api/greeting エンドポイントを再度呼び出します。/api/name エンドポイントでの複数のリクエストに成功すると、以下を行います。

    1. Circuit Breaker が閉じます。
    2. Web インターフェースの状態インジケーターがから OPEN に変わります。CLOSED
    3. Circuit Breaker は /api/greeting エンドポイントの呼び出し時に Hello World! greeting を返します。

      $ curl http://MY_APP_NAME-greeting-MY_PROJECT_NAME.LOCAL_OPENSHIFT_HOSTNAME/api/greeting
      {"content":"Hello, World!"}

8.5.7. Circuit Breaker のサンプルアプリケーション統合テストの実行

このアプリケーションの例には、自己完結型の統合テストセットが含まれます。OpenShift プロジェクト内で実行される場合、テストは次のとおりです。

  • アプリケーションのテストインスタンスをプロジェクトにデプロイします。
  • そのインスタンスで個別のテストを実行します。
  • テストの完了時に、プロジェクトのインスタンスをすべて削除します。
警告

統合テストを実行すると、サンプルアプリケーションの既存のインスタンスがすべてターゲット OpenShift プロジェクトから削除します。サンプルアプリケーションを誤って削除しないようにするには、テストを実行する別の OpenShift プロジェクトを作成して選択します。

前提条件

  • 認証された oc クライアント
  • 空の OpenShift プロジェクト

手順

以下のコマンドを実行してインテグレーションテストを実行します。

$ mvn clean verify -Popenshift,openshift-it

8.5.8. Hystrix Dashboard を使用したサーキットブレーカーの監視

Hiystrix Dashboard を使用すると、イベントストリームから Histrix メトリクスデータを集計し、1 つの画面にこれらのメトリクスデータを集計することで、サービスの正常性をリアルタイムで簡単に監視できます。

前提条件

  • デプロイされたアプリケーション

手順

  1. Minishift または CDK クラスターにログインします。

    $ oc login OPENSHIFT_URL --token=MYTOKEN
  2. Web コンソールにアクセスするには、ブラウザーを使用して Minishift または CDK の URL に移動します。
  3. Circuit Breaker アプリケーションが含まれるプロジェクトに移動します。

    $ oc project MY_PROJECT_NAME
  4. Hystrix ダッシュボードアプリケーションの YAML テンプレート をインポートします。これには、Add to Project をクリックしてから Import YAML / JSON タブを選択し、YAML ファイルの内容をテキストボックスにコピーします。以下のコマンドを実行できます。

    $ oc create -f https://raw.githubusercontent.com/snowdrop/openshift-templates/master/hystrix-dashboard/hystrix-dashboard.yml
  5. Create ボタンをクリックして、テンプレートに基づいて Hiystrix ダッシュボードアプリケーションを作成します。以下のコマンドを実行できます。

    $ oc new-app --template=hystrix-dashboard
  6. Hystrix Dashboard を含む Pod がデプロイされるまで待機します。
  7. Hystrix ダッシュボードアプリケーションのルートを取得します。

    $ oc get route hystrix-dashboard
    NAME                HOST/PORT                                                    PATH      SERVICES            PORT      TERMINATION   WILDCARD
    hystrix-dashboard   hystrix-dashboard-MY_PROJECT_NAME.LOCAL_OPENSHIFT_HOSTNAME                 hystrix-dashboard   <all>                   None
  8. Dashboard にアクセスするには、ブラウザーで Dashboard アプリケーションルート URL を開きます。Web コンソールの Overview 画面に移動し、Hystrix Dashboard アプリケーションが含まれる Pod の上にあるルート URL をクリックします。
  9. Dashboard を使用して MY_APP_NAME-greeting サービスを監視するには、デフォルトのイベントストリームアドレスを以下のアドレスに置き換えて、Monitor Stream ボタンをクリックします。

    http://MY_APP_NAME-greeting-MY_PROJECT_NAME.LOCAL_OPENSHIFT_HOSTNAME/hystrix.stream

関連情報

8.5.9. サーキットブレーカーリソース

Circuit Breaker パターンの背後にある設計原則についての背景情報については、以下のリンクを参照してください。

8.6. Spring Boot のセキュアなサンプルアプリケーション

重要

以下の例は、実稼働環境で実行する予定はありません。

制限: このサンプルアプリケーションを Minishift または CDK で実行します。手動のワークフローを使用して、以下の例を OpenShift Online Pro および OpenShift Container Platform にデプロイすることもできます。この例は、現在 OpenShift Online Starter では使用できません。

修飾レベルの例: 詳細

Secured のサンプルアプリケーションは、Red Hat SSO を使用して REST エンドポイントを保護します。(この例では REST API レベル 0 の例で展開されています)。

Red Hat SSO:

  • OAuth 2.0 仕様の拡張機能である Open ID Connect プロトコルを実装します。
  • アクセストークンを発行し、クライアントにセキュアなリソースに対するさまざまなアクセス権限を付与します。

SSO でアプリケーションのセキュリティーを保護すると、セキュリティー設定を一元化する一方で、アプリケーションにセキュリティーを追加することができます。

重要

この例では、デモ目的で Red Hat SSO が事前設定されており、その原則、使用方法、または設定については説明しません。この例を使用する前に、Red Hat SSO に関連する基本概念を理解していることを確認してください。

8.6.1. Secured プロジェクト構造

SSO の例には以下が含まれます。

  • Greeting サービスのソースです。セキュリティー保護の対象となります。
  • SSO サーバーをデプロイするテンプレートファイル(service.sso.yaml)
  • サービスを保護する Keycloak アダプター設定

8.6.2. Red Hat SSO デプロイメントの設定

この例の service.sso.yaml ファイルには、事前設定された Red Hat SSO サーバーをデプロイする OpenShift 設定項目がすべて含まれています。この演習のために SSO サーバーの設定が簡素化され、事前設定されたユーザーとセキュリティー設定のある追加設定が標準で提供されます。service.sso.yaml ファイルには非常に長い行も含まれており、gedit などの一部のテキストエディターはこのファイルの読み取りに問題がある可能性があります。

警告

実稼働環境では、この SSO 設定を使用することは推奨されません。とくに、セキュリティー設定例に追加された簡素化は、実稼働環境で使用する機能に影響します。

表8.5 SSO の例の簡素化

CHANGE理由推奨事項

デフォルト設定には、yaml 設定ファイルに公開鍵と秘密鍵の 両方が含まれます。

これは、エンドユーザーが Red Hat SSO モジュールをデプロイし、可能な状態に設定できるため、内部や Red Hat SSO の設定方法を把握する必要がありません。

実稼働環境では、秘密鍵をソース制御に保存しないでください。サーバー管理者が追加する必要があります。

設定済みの クライアントはコールバック URL を受け入れ ます。

ランタイムごとにカスタム設定がないようにするには、OAuth2 仕様で必要なコールバック検証を回避します。

アプリケーション固有のコールバック URL には、有効なドメイン名を指定する必要があります。

クライアントには SSL/TLS は必要ありません。セキュアなアプリケーションは HTTPS 上で公開されません

サンプルは、ランタイムごとに生成される証明書を必要としないことで単純化されます。

実稼働環境では、セキュアなアプリケーションは単純な HTTP ではなく HTTPS を使用する必要があります。

トークンのタイムアウトは、デフォルトの 1 分から 10 分に増えました。

コマンドラインの例を使用する際に、より優れたユーザーエクスペリエンスを提供します。

セキュリティー観点から、攻撃者はアクセストークンが拡張されているかどうかを推測する必要があるウィンドウになります。攻撃者が現在のトークンを推測するのがより困難になるため、このウィンドウは短くしておくことが推奨されます。

8.6.3. Red Hat SSO レルムモデル

master レルムは、この例をセキュアにするために使用されます。コマンドラインクライアントとセキュアな REST エンドポイントにモデルを提供する事前設定されたアプリケーションクライアント定義が 2 つあります。

また、Red Hat SSO master レルムには、さまざまな認証および承認結果を検証するのに使用できる事前設定されたユーザー 2 つもあります admin alice

8.6.3.1. Red Hat SSO ユーザー

セキュリティー保護された例のレルムモデルには、以下の 2 つのユーザーが含まれます。

admin
admin ユーザーにはのパスワードがあり admin、はレルム管理者です。このユーザーは Red Hat SSO 管理コンソールに完全アクセスできますが、セキュアなエンドポイントへのアクセスに必要なロールマッピングはありません。このユーザーを使用すると、認証されていないユーザーの動作を確認することができます。
ブラジル

alice ユーザーにはのパスワードがあり password、は正規のアプリケーションユーザーです。このユーザーは、セキュアなエンドポイントへの認証および承認されたアクセスが正常に認証され、承認されます。ロールマッピングの表現例は、デコードされた JWT ベアラートークンに含まれています。

{
  "jti": "0073cfaa-7ed6-4326-ac07-c108d34b4f82",
  "exp": 1510162193,
  "nbf": 0,
  "iat": 1510161593,
  "iss": "https://secure-sso-sso.LOCAL_OPENSHIFT_HOSTNAME/auth/realms/master", 1
  "aud": "demoapp",
  "sub": "c0175ccb-0892-4b31-829f-dda873815fe8",
  "typ": "Bearer",
  "azp": "demoapp",
  "nonce": "90ff5d1a-ba44-45ae-a413-50b08bf4a242",
  "auth_time": 1510161591,
  "session_state": "98efb95a-b355-43d1-996b-0abcb1304352",
  "acr": "1",
  "client_session": "5962112c-2b19-461e-8aac-84ab512d2a01",
  "allowed-origins": [
    "*"
  ],
  "realm_access": {
    "roles": [ 2
      "example-admin"
    ]
  },
  "resource_access": { 3
    "secured-example-endpoint": {
      "roles": [
        "example-admin" 4
      ]
    },
    "account": {
      "roles": [
        "manage-account",
        "view-profile"
      ]
    }
  },
  "name": "Alice InChains",
  "preferred_username": "alice", 5
  "given_name": "Alice",
  "family_name": "InChains",
  "email": "alice@keycloak.org"
}
1
iss フィールドは、トークンを発行する Red Hat SSO レルムインスタンスの URL に対応します。トークンを検証するには、セキュアなエンドポイントデプロイメントで設定する必要があります。
2
roles オブジェクトは、グローバルレルムレベルでユーザーに付与されたロールを提供します。この場合、example-admin ロール alice が付与されています。セキュリティーが保護されたエンドポイントは、承認されたロールのレルムレベルを検索することが分かります。
3
resource_access オブジェクトにはリソース固有のロール付与が含まれます。このオブジェクトの下に、セキュアな各エンドポイントのオブジェクトを見つけます。
4
resource_access.secured-example-endpoint.roles オブジェクトには、secured-example-endpoint リソース alice のに付与されたロールが含まれます。
5
preferred_username フィールドは、アクセストークンの生成に使用されたユーザー名を提供します。

8.6.3.2. アプリケーションクライアント

OAuth 2.0 仕様を使用すると、リソース所有者の代わりにセキュアなリソースにアクセスするアプリケーションクライアントのロールを定義できます。master レルムには以下のアプリケーションクライアントが定義されています。

demoapp
これは、confidential アクセストークンの取得に使用されるクライアントシークレットを持つタイプクライアントです。トークンには、Thorntail、Eclipse Vert.x、Node.js、および Spring Boot ベースの REST アプリケーションデプロイメント alice へのアクセスを可能にする alice ユーザーの付与が含まれます。
secured-example-endpoint
secured-example-endpoint は、関連付けられたリソース(特に Greeting サービス)へのアクセスに example-admin ロールを必要とするベアラーのみのクライアントタイプです。

8.6.4. Spring Boot SSO アダプターの設定

SSO アダプターは クライアント側 または SSO サーバーのクライアントで、Web リソースのセキュリティーを強制するコンポーネントです。このケースでは、これは Greeting サービスです。

SSO アダプターとエンドポイントセキュリティーの両方がに設定され src/main/resources/application.propertiesます。

application.properties ファイルの例

$ # Adapter configuration
keycloak.realm=${realm:master} 1
keycloak.realm-key=...
keycloak.auth-server-url=${sso.auth.server.url} 2
keycloak.resource=${client.id:secured-example-endpoint} 3
keycloak.credentials.secret=${secret:1daa57a2-b60e-468b-a3ac-25bd2dc2eadc} 4
keycloak.use-resource-role-mappings=true 5
keycloak.bearer-only=true 6
# Endpoint security configuration
keycloak.securityConstraints[0].securityCollections[0].name=admin stuff 7
keycloak.securityConstraints[0].securityCollections[0].authRoles[0]=example-admin 8
keycloak.securityConstraints[0].securityCollections[0].patterns[0]=/api/greeting 9

1
使用されるセキュリティーレルム。
2
Red Hat SSO サーバーのアドレス(ビルド時の参加時)。
3
実際の keycloak クライアント 設定。
4
認証サーバーにアクセスするためのシークレット。
5
ユーザーのアプリケーションレベルのロールマッピングのトークンを確認します。
6
これを有効にすると、アダプターはユーザーを認証しようとせず、ベアラートークンのみを検証します。
7
セキュリティー制約の簡単な名前。
8
セキュリティー保護されたエンドポイントへのアクセスに必要なロール。
9
セキュリティー保護されたエンドポイントパスパターン。

8.6.5. セキュアなサンプルアプリケーションの Minishift または CDK へのデプロイ

8.6.5.1. Fabric8 Launcher ツール URL およびクレデンシャルの取得

Minishift または CDK でサンプルアプリケーションを作成してデプロイするには、Fabric8 Launcher ツール URL およびユーザー認証情報が必要です。この情報は Minishift または CDK の起動時に提供されます。

前提条件

  • Fabric8 Launcher ツールがインストールされ、設定され、実行されている。

手順

  1. Minishift または CDK を起動したコンソールに移動します。
  2. コンソール出力で、実行中の Fabric8 Launcher にアクセスするのに使用できる URL およびユーザークレデンシャルを確認します。

    Minishift または CDK の起動からのコンソールの出力例

    ...
    -- Removing temporary directory ... OK
    -- Server Information ...
       OpenShift server started.
       The server is accessible via web console at:
           https://192.168.42.152:8443
    
       You are logged in as:
           User:     developer
           Password: developer
    
       To login as administrator:
           oc login -u system:admin

8.6.5.2. Fabric8 Launcher を使用したセキュア化されたサンプルアプリケーションの作成

前提条件

手順

  • ブラウザーで Fabric8 Launcher URL に移動し、ログインします。
  • 画面の手順にしたがって、Spring Boot でサンプルを作成します。どのデプロイメントタイプを尋ねるかを尋ねられたら、I will be build and run local. を選択します。
  • 画面上の指示に従ってください。

    完了したら、ZIP ファイルとしてダウンロード ボタンをクリックして、ハードドライブにファイルを保存します。

8.6.5.3. oc CLI クライアントの認証

oc コマンドラインクライアントを使用して Minishift または CDK のアプリケーションの例を使用するには、Minishift または CDK の Web インターフェースによって提供されるトークンを使用してクライアントを認証する必要があります。

前提条件

手順

  1. ブラウザーで Minishift または CDK の URL に移動します。
  2. Web コンソールの右上隅にあるユーザー名の横にある疑問符アイコンをクリックします。
  3. ドロップダウンメニューで Command Line Tools を選択します。
  4. oc login コマンドをコピーします。
  5. ターミナルにコマンドを貼り付けます。コマンドは、認証トークンを使用して、Minishift または CDK アカウントで oc CLI クライアントを認証します。

    $ oc login OPENSHIFT_URL --token=MYTOKEN

8.6.5.4. oc CLI クライアントを使用したセキュア化されたサンプルアプリケーションのデプロイ

前提条件

手順

  1. GitHub からプロジェクトのクローンを作成します。

    $ git clone git@github.com:USERNAME/MY_PROJECT_NAME.git

    プロジェクトの ZIP ファイルをダウンロードした場合は、展開します。

    $ unzip MY_PROJECT_NAME.zip
  2. 新規 OpenShift プロジェクトを作成します。

    $ oc new-project MY_PROJECT_NAME
  3. アプリケーションのルートディレクトリーに移動します。
  4. サンプルの ZIP service.sso.yaml ファイルからファイルを使用して Red Hat SSO サーバーをデプロイします。

    $ oc create -f service.sso.yaml
  5. Maven を使用してデプロイメントを Minishift または CDK へ開始します。

    $ mvn clean fabric8:deploy -Popenshift -DskipTests \
          -DSSO_AUTH_SERVER_URL=$(oc get route secure-sso -o jsonpath='{"https://"}{.spec.host}{"/auth\n"}')

    このコマンドは Fabric8 Maven Plugin を使用して Minishift または CDK で S2I プロセス を開始し、Pod を起動します。

このプロセスでは、uberjar ファイルと OpenShift リソースを生成し、それらを Minishift または CDK サーバーの現在のプロジェクトにデプロイします。

8.6.6. セキュアなサンプルアプリケーションの OpenShift Container Platform へのデプロイ

Minishift または CDK のほかに、マイナーな違いのみで OpenShift Container Platform にサンプルを作成し、デプロイできます。最も重要な違いは、OpenShift Container Platform でデプロイする前に、Minishift または CDK でサンプルアプリケーションを作成する必要がある点です。

前提条件

8.6.6.1. oc CLI クライアントの認証

oc コマンドラインクライアントを使用して OpenShift Container Platform のアプリケーションのサンプルを使用するには、OpenShift Container Platform Web インターフェースによって提供されるトークンを使用してクライアントを認証する必要があります。

前提条件

  • OpenShift Container Platform のアカウント。

手順

  1. ブラウザーで OpenShift Container Platform URL に移動します。
  2. Web コンソールの右上隅にあるユーザー名の横にある疑問符アイコンをクリックします。
  3. ドロップダウンメニューで Command Line Tools を選択します。
  4. oc login コマンドをコピーします。
  5. ターミナルにコマンドを貼り付けます。このコマンドは、認証トークンを使用して、OpenShift Container Platform アカウントで oc CLI クライアントを認証します。

    $ oc login OPENSHIFT_URL --token=MYTOKEN

8.6.6.2. oc CLI クライアントを使用したセキュア化されたサンプルアプリケーションのデプロイ

前提条件

  • Minishift または CDK の Fabric8 Launcher ツールを使用して作成されたサンプルアプリケーション。
  • oc クライアントが認証された。詳細はoc CLI クライアントの認証」を参照してください。

手順

  1. GitHub からプロジェクトのクローンを作成します。

    $ git clone git@github.com:USERNAME/MY_PROJECT_NAME.git

    プロジェクトの ZIP ファイルをダウンロードした場合は、展開します。

    $ unzip MY_PROJECT_NAME.zip
  2. 新規 OpenShift プロジェクトを作成します。

    $ oc new-project MY_PROJECT_NAME
  3. アプリケーションのルートディレクトリーに移動します。
  4. サンプルの ZIP service.sso.yaml ファイルからファイルを使用して Red Hat SSO サーバーをデプロイします。

    $ oc create -f service.sso.yaml
  5. Maven を使用して OpenShift Container Platform へのデプロイメントを開始します。

    $ mvn clean fabric8:deploy -Popenshift -DskipTests \
          -DSSO_AUTH_SERVER_URL=$(oc get route secure-sso -o jsonpath='{"https://"}{.spec.host}{"/auth\n"}')

    このコマンドは Fabric8 Maven Plugin を使用して OpenShift Container Platform で S2I プロセス を起動し、Pod を起動します。

このプロセスでは、uberjar ファイルと OpenShift リソースを生成し、それらを OpenShift Container Platform サーバーの現在のプロジェクトにデプロイします。

8.6.7. セキュアなアプリケーション API エンドポイントの認証

Secured のサンプルアプリケーションは、呼び出し元が認証され、承認された場合に GET リクエストを受け入れるデフォルトの HTTP エンドポイントを提供します。クライアントはまず Red Hat SSO サーバーに対して認証を行い、認証手順によって返されたアクセストークンを使用して、Secured サンプルアプリケーションに対して GET リクエストを実行します。

8.6.7.1. Secured のサンプルアプリケーション API エンドポイントの取得

クライアントを使用してサンプルと対話する場合、PROJECT_ID サービスである Secured サンプルアプリケーションエンドポイントを指定する必要があります。

前提条件

  • Secured のサンプルアプリケーションでは、デプロイされ、実行されています。
  • oc クライアントが認証された。

手順

  1. ターミナルアプリケーションで oc get routes コマンドを実行します。

    以下の表には、出力例が記載されています。

    例8.1 Secured エンドポイントの一覧

    名前Host/Portパスサービスポートtermination

    secure-sso

    secure-sso-myproject.LOCAL_OPENSHIFT_HOSTNAME

     

    secure-sso

    <all>

    passthrough

    PROJECT_ID

    PROJECT_ID-myproject.LOCAL_OPENSHIFT_HOSTNAME

     

    PROJECT_ID

    <all>

     

    sso

    sso-myproject.LOCAL_OPENSHIFT_HOSTNAME

     

    sso

    <all>

     

    上記の例では、サンプルエンドポイントは http://PROJECT_ID-myproject.LOCAL_OPENSHIFT_HOSTNAMEです。PROJECT_ID は、developers.redhat.com/launch ツールまたは Fabric8 Launcher ツールを使用して例を生成する際に入力した名前を基にしています。

8.6.7.2. コマンドラインでの HTTP 要求の認証

Red Hat SSO サーバーに HTTP POST リクエストを送信してトークンを要求します。以下の例では、jq CLI ツール を使用して JSON 応答から token 値を抽出します。

前提条件

手順

  1. jq コマンドを使用して curl、、クレデンシャル、<SSO_AUTH_SERVER_URL> およびレスポンスからトークンをリクエストします。

    curl -sk -X POST https://<SSO_AUTH_SERVER_URL>/auth/realms/master/protocol/openid-connect/token \
      -d grant_type=password \
      -d username=alice\
      -d password=password \
      -d client_id=demoapp \
      -d client_secret=1daa57a2-b60e-468b-a3ac-25bd2dc2eadc \
      | jq -r '.access_token'
    
    eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJRek1nbXhZMUhrQnpxTnR0SnkwMm5jNTNtMGNiWDQxV1hNSTU1MFo4MGVBIn0.eyJqdGkiOiI0NDA3YTliNC04YWRhLTRlMTctODQ2ZS03YjI5MjMyN2RmYTIiLCJleHAiOjE1MDc3OTM3ODcsIm5iZiI6MCwiaWF0IjoxNTA3NzkzNzI3LCJpc3MiOiJodHRwczovL3NlY3VyZS1zc28tc3NvLWRlbW8uYXBwcy5jYWZlLWJhYmUub3JnL2F1dGgvcmVhbG1zL21hc3RlciIsImF1ZCI6ImRlbW9hcHAiLCJzdWIiOiJjMDE3NWNjYi0wODkyLTRiMzEtODI5Zi1kZGE4NzM4MTVmZTgiLCJ0eXAiOiJCZWFyZXIiLCJhenAiOiJkZW1vYXBwIiwiYXV0aF90aW1lIjowLCJzZXNzaW9uX3N0YXRlIjoiMDFjOTkzNGQtNmZmOS00NWYzLWJkNWUtMTU4NDI5ZDZjNDczIiwiYWNyIjoiMSIsImNsaWVudF9zZXNzaW9uIjoiMzM3Yzk0MTYtYTdlZS00ZWUzLThjZWQtODhlODI0MGJjNTAyIiwiYWxsb3dlZC1vcmlnaW5zIjpbIioiXSwicmVhbG1fYWNjZXNzIjp7InJvbGVzIjpbImJvb3N0ZXItYWRtaW4iXX0sInJlc291cmNlX2FjY2VzcyI6eyJzZWN1cmVkLWJvb3N0ZXItZW5kcG9pbnQiOnsicm9sZXMiOlsiYm9vc3Rlci1hZG1pbiJdfSwiYWNjb3VudCI6eyJyb2xlcyI6WyJtYW5hZ2UtYWNjb3VudCIsInZpZXctcHJvZmlsZSJdfX0sIm5hbWUiOiJBbGljZSBJbkNoYWlucyIsInByZWZlcnJlZF91c2VybmFtZSI6ImFsaWNlIiwiZ2l2ZW5fbmFtZSI6IkFsaWNlIiwiZmFtaWx5X25hbWUiOiJJbkNoYWlucyIsImVtYWlsIjoiYWxpY2VAa2V5Y2xvYWsub3JnIn0.mjmZe37enHpigJv0BGuIitOj-kfMLPNwYzNd3n0Ax4Nga7KpnfytGyuPSvR4KAG8rzkfBNN9klPYdy7pJEeYlfmnFUkM4EDrZYgn4qZAznP1Wzy1RfVRdUFi0-GqFTMPb37o5HRldZZ09QljX_j3GHnoMGXRtYW9RZN4eKkYkcz9hRwgfJoTy2CuwFqeJwZYUyXifrfA-JoTr0UmSUed-0NMksGrtJjjPggUGS-qOn6OgKcmN2vaVAQlxW32y53JqUXctfLQ6DhJzIMYTmOflIPy0sgG1mG7sovQhw1xTg0vTjdx8zQ-EJcexkj7IivRevRZsslKgqRFWs67jQAFQA

    <SSO_AUTH_SERVER_URL> は、secure-sso サービスの URL です。

    client_secret 通常、、username password、などの属性は秘密になりますが、上記のコマンドはデモ目的で、この例で指定されるデフォルトのクレデンシャルを使用します。

    トークンの抽出にを使用 jq しない場合は、curl コマンドのみを実行して、アクセストークンを手動で展開できます。

    注記

    -sk オプションは curl に対して、自己署名証明書から生成された障害を無視します。実稼働環境では、このオプションを使用しないでください。macOS では、curl バージョン 7.56.1 またはそれ以降がインストールされている必要があります。また、OpenSSL でビルドする必要があります。

  1. Secured サービスを呼び出します。アクセス(ベアラー)トークンを HTTP ヘッダーに追加します。

    $ curl -v -H "Authorization: Bearer <TOKEN>" http://<SERVICE_HOST>/api/greeting
    
    {
        "content": "Hello, World!",
        "id": 2
    }

    例8.2 アクセス(Bearer)トークンを GET 持つリクエストヘッダーの例

    > GET /api/greeting HTTP/1.1
    > Host: <SERVICE_HOST>
    > User-Agent: curl/7.51.0
    > Accept: */*
    > Authorization: Bearer <TOKEN>

    <SERVICE_HOST> は、セキュアなサンプルエンドポイントの URL です。詳細は「Secured のサンプルアプリケーション API エンドポイントの取得」を参照してください。

  2. アクセストークンの署名を確認します。

    アクセストークンは JSON Web Token であるため、JWT デバッガー を使用してデコードできます。

    1. Web ブラウザーで、JWT デバッガー の Web サイトに移動します。
    2. ドロップダウンメニュー RS256 から Algorithm を選択します。

      注記

      選択後に Web フォームが更新されていることを確認し、正しい RSASHA256(…​)Signature セクションの情報。作成していない場合は、HS256 に切り替えてから RS256 に戻します。

    3. 上部のテキストボックスの以下のコンテンツを VERIFY SIGNATURE セクションに貼り付けます。

      -----BEGIN PUBLIC KEY-----
      MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAoETnPmN55xBJjRzN/cs30OzJ9olkteLVNRjzdTxFOyRtS2ovDfzdhhO9XzUcTMbIsCOAZtSt8K+6yvBXypOSYvI75EUdypmkcK1KoptqY5KEBQ1KwhWuP7IWQ0fshUwD6jI1QWDfGxfM/h34FvEn/0tJ71xN2P8TI2YanwuDZgosdobx/PAvlGREBGuk4BgmexTOkAdnFxIUQcCkiEZ2C41uCrxiS4CEe5OX91aK9HKZV4ZJX6vnqMHmdDnsMdO+UFtxOBYZio+a1jP4W3d7J5fGeiOaXjQCOpivKnP2yU2DPdWmDMyVb67l8DRA+jh0OJFKZ5H2fNgE3II59vdsRwIDAQAB
      -----END PUBLIC KEY-----
      注記

      これは、Secured のサンプルアプリケーションの Red Hat SSO サーバーデプロイメントのマスターレルム公開鍵です。

    4. クライアント token 出力から Encoded ボックスに出力を貼り付けます。

      Signature Verified 記号がデバッガーページに表示されます。

8.6.7.3. Web インターフェースを使用した HTTP 要求の認証

セキュリティーが保護されたエンドポイントには、HTTP API の他に、と対話するための Web インターフェースも含まれます。

以下の手順は、セキュリティーの強制方法、認証の方法、認証トークンの使用方法を確認するための演習です。

前提条件

手順

  1. Web ブラウザーでエンドポイント URL に移動します。
  2. 認証されていないリクエストを実行します。

    1. Invoke ボタンをクリックします。

      図8.1 認証されていないセキュアなセキュアな Web インターフェースの例

      SSO main

      サービスは、HTTP 401 Unauthorized ステータスコードで応答します。

      図8.2 認証されていないエラーメッセージ

      SSO 非認証
  3. 認証されたリクエストをユーザーとして実行します。

    1. Login ボタンをクリックして Red Hat SSO に対して認証します。SSO サーバーにリダイレクトされます。
    2. 回答 ユーザーとしてログイン ます。Web インターフェースにリダイレクトされます。

      注記

      ページの下部にあるコマンドラインの出力で、アクセス(ベアラー)トークンを確認できます。

      図8.3 認証されたセキュアな Web インターフェースの例(英語)

      SSO alice
    3. 再度 Invoke をクリックして Greeting サービスにアクセスします。

      例外がなく、JSON 応答ペイロードが表示されていることを確認します。これは、サービスがアクセス(bearer)トークンを受け入れ、Wortheting サービスへのアクセスが許可されていることを意味します。

      図8.4 認証された受領要求の結果(そのまま)

      SSO invoke alice
    4. ログアウト。
  4. 認証されたリクエストを管理者として実行します。

    1. Invoke ボタンをクリックします。

      認証されていないリクエストが Greeting サービスに送信されていることを確認します。

    2. Login ボタンをクリックし admin ユーザー としてログインします。

      図8.5 Authenticationed Secured Example Web Interface(管理者)

      sso admin
  5. Invoke ボタンをクリックします。

    admin ユーザーは Greeting サービスへのアクセスが許可されていないため、サービスは HTTP 403 Forbidden ステータスコードで応答します。

    図8.6 承認されていないエラーメッセージ

    SSO の承認

8.6.8. Spring Boot でセキュア化されたアプリケーションインテグレーションテストの実行

前提条件

  • oc クライアントが認証された。

手順

警告

統合テストを実行すると、サンプルアプリケーションの既存のインスタンスがすべてターゲット OpenShift プロジェクトから削除します。サンプルアプリケーションを誤って削除しないようにするには、テストを実行する別の OpenShift プロジェクトを作成して選択します。

  1. ターミナルアプリケーションで、プロジェクトでディレクトリーに移動します。
  2. Red Hat SSO サーバーアプリケーションを作成します。

    oc create -f service.sso.yaml
  3. Red Hat SSO サーバーの準備が整うまで待ちます。Web コンソールに移動するか、の出力を表示して、Red Hat SSO サーバーを実行 oc get pods する Pod が準備状態かどうかを確認します。
  4. インテグレーションテストを実行します。

    mvn clean verify -Popenshift,openshift-it -DSSO_AUTH_SERVER_URL=$(oc get route secure-sso -o jsonpath='{"https://"}{.spec.host}{"/auth\n"}')

8.6.9. セキュアな SSO リソース

OAuth2 仕様の背後にある原則および Red Hat SSO および Keycloak を使用してアプリケーションをセキュア化するには、以下のリンクを参照してください。

8.7. Spring Boot のキャッシュの例

重要

以下の例は、実稼働環境で実行する予定はありません。

制限: このサンプルアプリケーションを Minishift または CDK で実行します。手動のワークフローを使用して、以下の例を OpenShift Online Pro および OpenShift Container Platform にデプロイすることもできます。この例は、現在 OpenShift Online Starter では使用できません。

修飾レベルの例: 詳細

Cache の例は、キャッシュを使用してアプリケーションの応答時間を長くする方法を示しています。

以下の例は、以下の方法を示しています。

  • キャッシュを OpenShift にデプロイします。
  • アプリケーション内でキャッシュを使用します。

8.7.1. キャッシュの動作およびその必要な場合

キャッシュを使用すると、一定期間にわたり情報を保存してアクセスすることができます。元のサービスを繰り返し呼び出すよりも速く、キャッシュ内の情報にアクセスできます。キャッシュの使用における欠点は、キャッシュされた情報が最新の状態ではないことです。ただし、キャッシュに保存されている各値に expiration または TTL(time to live)を設定することで、この問題を軽減できます。

例8.3 キャッシング例

service 1 と service 2 の 2 つのアプリケーションがあるとします。

  • service1 は、service2 の値に依存します。

    • service2 からの値が頻繁に変更されない場合、service1 は一定期間 service2 から値をキャッシュする可能性がありました。
    • キャッシュされた値を使用すると、service2 が呼び出される回数を減らすことができます。
  • service 1 500 ミリ秒で直接 service 2 から値を取得しますが、キャッシュされた値を取得するために 100 ミリ秒かかると、service1 はキャッシュされた各呼び出しにキャッシュされた値を使用して 400 ms を保存します。
  • service1 が 1 秒あたり 5 回キャッシュされていない呼び出しを行う場合(10 秒以上)、呼び出しは 50 になります。
  • service1 が TTL でキャッシュされた値の使用を開始すると、呼び出しは 10 秒に減ります。

Cache のサンプルの仕組み

  1. キャッシュ、Energy name、 および greeting サービスがデプロイされ、公開されます。
  2. ユーザーは greeting サービスの Web フロントエンドにアクセスします。
  3. ユーザーは、Web フロントエンドのボタンを使用して greeting HTTP API を呼び出します。
  4. greeting サービスは、Energy name サービスの値により異なります。

    • greeting サービスは、最初にその値が キャッシュ サービスに保存されているかどうかを確認します。この場合、キャッシュされた値が返されます。
    • この値がキャッシュされていない場合、greeting サービスは name サービスを呼び出して、値を TTL が 5 秒の キャッシュ サービスに格納します。
  5. Web フロントエンドは、greeting サービスからの応答と操作の合計時間を表示します。
  6. ユーザーはサービスを複数回呼び出し、キャッシュされた操作とキャッシュされていない操作の違いを確認します。

    • キャッシュされた操作は、キャッシュされていない操作よりもはるかに高速です。
    • ユーザーは、TTL の期限が切れる前にキャッシュを強制的に消去できます。

8.7.2. キャッシュサンプルアプリケーションの OpenShift Online へのデプロイ

以下のオプションのいずれかを使用して、OpenShift Online で Cache サンプルアプリケーションを実行します。

各方法では、同じ oc コマンドを使用してアプリケーションをデプロイしますが、developers.redhat.com/launch を使用すると、oc コマンドを実行する自動デプロイメントワークフローが提供されます。

8.7.2.1. developers.redhat.com/launch を使用したサンプルアプリケーションのデプロイ

前提条件

手順

  1. ブラウザーで developers.redhat.com/launch URL に移動します。
  2. 画面の手順にしたがって、Spring Boot でサンプルアプリケーションを作成し、起動します。

8.7.2.2. oc CLI クライアントの認証

oc コマンドラインクライアントを使用して OpenShift Online のアプリケーションサンプルを使用するには、OpenShift Online Web インターフェースによって提供されるトークンを使用してクライアントを認証する必要があります。

前提条件

手順

  1. ブラウザーで OpenShift Online URL に移動します。
  2. Web コンソールの右上隅にあるユーザー名の横にある疑問符アイコンをクリックします。
  3. ドロップダウンメニューで Command Line Tools を選択します。
  4. oc login コマンドをコピーします。
  5. ターミナルにコマンドを貼り付けます。このコマンドは、認証トークンを使用して、OpenShift Online アカウントで oc CLI クライアントを認証します。

    $ oc login OPENSHIFT_URL --token=MYTOKEN

8.7.2.3. oc CLI クライアントを使用したキャッシュサンプルアプリケーションのデプロイ

前提条件

手順

  1. GitHub からプロジェクトのクローンを作成します。

    $ git clone git@github.com:USERNAME/MY_PROJECT_NAME.git

    プロジェクトの ZIP ファイルをダウンロードした場合は、展開します。

    $ unzip MY_PROJECT_NAME.zip
  2. 新規プロジェクトを作成します。

    $ oc new-project MY_PROJECT_NAME
  3. アプリケーションのルートディレクトリーに移動します。
  4. キャッシュサービスをデプロイします。

    $ oc apply -f service.cache.yml
  5. Maven を使用して OpenShift へのデプロイメントを開始します。

    $ mvn clean fabric8:deploy -Popenshift
  6. アプリケーションのステータスを確認し、Pod が実行されていることを確認します。

    $ oc get pods -w
    NAME                             READY     STATUS      RESTARTS   AGE
    cache-server-123456789-aaaaa             1/1       Running     0          8m
    MY_APP_NAME-cutename-1-bbbbb       1/1       Running     0          4m
    MY_APP_NAME-cutename-s2i-1-build   0/1       Completed   0          7m
    MY_APP_NAME-greeting-1-ccccc       1/1       Running     0          3m
    MY_APP_NAME-greeting-s2i-1-build   0/1       Completed   0          3m

    3 Pod のステータス Running は、完全にデプロイされ、起動されるとのステータスになります。

  7. サンプルアプリケーションをデプロイし、起動した後に、そのルートを決定します。

    ルート情報の例

    $ oc get routes
    NAME                 HOST/PORT                                                     PATH      SERVICES        PORT      TERMINATION
    MY_APP_NAME-cutename   MY_APP_NAME-cutename-MY_PROJECT_NAME.OPENSHIFT_HOSTNAME             MY_APP_NAME-cutename   8080                    None
    MY_APP_NAME-greeting   MY_APP_NAME-greeting-MY_PROJECT_NAME.OPENSHIFT_HOSTNAME             MY_APP_NAME-greeting   8080                    None

    Pod のルート情報は、アクセスに使用するベース URL を提供します。上記の例では、をベース URL http://MY_APP_NAME-greeting-MY_PROJECT_NAME.OPENSHIFT_HOSTNAME として使用し、greeting サービスにアクセスします。

8.7.3. キャッシュサンプルアプリケーションの Minishift または CDK へのデプロイ

Minishift または CDK で Cache サンプルアプリケーションを実行するには、以下のいずれかのオプションを使用します。

各メソッドは同じ oc コマンドを使用してアプリケーションをデプロイしますが、Fabric8 Launcher を使用すると、oc コマンドを実行する自動デプロイメントワークフローが提供されます。

8.7.3.1. Fabric8 Launcher ツール URL およびクレデンシャルの取得

Minishift または CDK でサンプルアプリケーションを作成してデプロイするには、Fabric8 Launcher ツール URL およびユーザー認証情報が必要です。この情報は Minishift または CDK の起動時に提供されます。

前提条件

  • Fabric8 Launcher ツールがインストールされ、設定され、実行されている。

手順

  1. Minishift または CDK を起動したコンソールに移動します。
  2. コンソール出力で、実行中の Fabric8 Launcher にアクセスするのに使用できる URL およびユーザークレデンシャルを確認します。

    Minishift または CDK の起動からのコンソールの出力例

    ...
    -- Removing temporary directory ... OK
    -- Server Information ...
       OpenShift server started.
       The server is accessible via web console at:
           https://192.168.42.152:8443
    
       You are logged in as:
           User:     developer
           Password: developer
    
       To login as administrator:
           oc login -u system:admin

8.7.3.2. Fabric8 Launcher ツールを使用したサンプルアプリケーションのデプロイ

前提条件

手順

  1. ブラウザーで Fabric8 Launcher URL に移動します。
  2. 画面の手順にしたがって、Spring Boot でサンプルアプリケーションを作成して起動します。

8.7.3.3. oc CLI クライアントの認証

oc コマンドラインクライアントを使用して Minishift または CDK のアプリケーションの例を使用するには、Minishift または CDK の Web インターフェースによって提供されるトークンを使用してクライアントを認証する必要があります。

前提条件

手順

  1. ブラウザーで Minishift または CDK の URL に移動します。
  2. Web コンソールの右上隅にあるユーザー名の横にある疑問符アイコンをクリックします。
  3. ドロップダウンメニューで Command Line Tools を選択します。
  4. oc login コマンドをコピーします。
  5. ターミナルにコマンドを貼り付けます。コマンドは、認証トークンを使用して、Minishift または CDK アカウントで oc CLI クライアントを認証します。

    $ oc login OPENSHIFT_URL --token=MYTOKEN

8.7.3.4. oc CLI クライアントを使用したキャッシュサンプルアプリケーションのデプロイ

前提条件

手順

  1. GitHub からプロジェクトのクローンを作成します。

    $ git clone git@github.com:USERNAME/MY_PROJECT_NAME.git

    プロジェクトの ZIP ファイルをダウンロードした場合は、展開します。

    $ unzip MY_PROJECT_NAME.zip
  2. 新規プロジェクトを作成します。

    $ oc new-project MY_PROJECT_NAME
  3. アプリケーションのルートディレクトリーに移動します。
  4. キャッシュサービスをデプロイします。

    $ oc apply -f service.cache.yml
  5. Maven を使用して OpenShift へのデプロイメントを開始します。

    $ mvn clean fabric8:deploy -Popenshift
  6. アプリケーションのステータスを確認し、Pod が実行されていることを確認します。

    $ oc get pods -w
    NAME                             READY     STATUS      RESTARTS   AGE
    cache-server-123456789-aaaaa             1/1       Running     0          8m
    MY_APP_NAME-cutename-1-bbbbb       1/1       Running     0          4m
    MY_APP_NAME-cutename-s2i-1-build   0/1       Completed   0          7m
    MY_APP_NAME-greeting-1-ccccc       1/1       Running     0          3m
    MY_APP_NAME-greeting-s2i-1-build   0/1       Completed   0          3m

    3 Pod のステータス Running は、完全にデプロイされ、起動されるとのステータスになります。

  7. サンプルアプリケーションをデプロイし、起動した後に、そのルートを決定します。

    ルート情報の例

    $ oc get routes
    NAME                 HOST/PORT                                                     PATH      SERVICES        PORT      TERMINATION
    MY_APP_NAME-cutename   MY_APP_NAME-cutename-MY_PROJECT_NAME.OPENSHIFT_HOSTNAME             MY_APP_NAME-cutename   8080                    None
    MY_APP_NAME-greeting   MY_APP_NAME-greeting-MY_PROJECT_NAME.OPENSHIFT_HOSTNAME             MY_APP_NAME-greeting   8080                    None

    Pod のルート情報は、アクセスに使用するベース URL を提供します。上記の例では、をベース URL http://MY_APP_NAME-greeting-MY_PROJECT_NAME.OPENSHIFT_HOSTNAME として使用し、greeting サービスにアクセスします。

8.7.4. キャッシュサンプルアプリケーションの OpenShift Container Platform へのデプロイ

サンプルアプリケーションを OpenShift Container Platform に作成し、デプロイするプロセスは OpenShift Online と似ています。

前提条件

手順

8.7.5. 変更されていないキャッシュサンプルアプリケーションとの対話

前提条件

  • アプリケーションがデプロイされている必要があります。

手順

  1. ブラウザーを使用して greeting サービスに移動します。
  2. 一度 サービスの導入を クリックします。

    上記の duration 値は上記の値を選択してください 2000。また、キャッシュの状態がの形式がに変更になったことに注意 No cached value してください A value is cached

  3. 5 秒間待って、キャッシュの状態がに戻り No cached valueます。

    キャッシュされた値の TTL は 5 秒に設定されます。TTL の期限が切れると、値はキャッシュされなくなりました。

  4. サービスをもう 1 度クリックして値をキャッシュします。
  5. キャッシュの状態がである場合に数秒間、サービスを数回 Invoke the service をもう 1 回クリックするをクリックし A value is cachedます。

    キャッシュされた値を使用するため、duration 値が大幅に小さいことに注意してください。キャッシュ をクリアをクリックすると、キャッシュ が空になります。

8.7.6. キャッシュサンプルアプリケーションインテグレーションテストの実行

このアプリケーションの例には、自己完結型の統合テストセットが含まれます。OpenShift プロジェクト内で実行される場合、テストは次のとおりです。

  • アプリケーションのテストインスタンスをプロジェクトにデプロイします。
  • そのインスタンスで個別のテストを実行します。
  • テストの完了時に、プロジェクトのインスタンスをすべて削除します。
警告

統合テストを実行すると、サンプルアプリケーションの既存のインスタンスがすべてターゲット OpenShift プロジェクトから削除します。サンプルアプリケーションを誤って削除しないようにするには、テストを実行する別の OpenShift プロジェクトを作成して選択します。

前提条件

  • 認証された oc クライアント
  • 空の OpenShift プロジェクト

手順

以下のコマンドを実行してインテグレーションテストを実行します。

$ mvn clean verify -Popenshift,openshift-it

8.7.7. リソースのキャッシュ

キャッシュに関する背景や関連情報は、以下を参照してください。

付録A Source-to-Image(S2I)ビルドプロセス

Source-to-Image (S2I)は、アプリケーションソースを使用してオンライン SCM リポジトリーから再現可能な Docker 形式のコンテナーイメージを生成するビルドツールです。S2I ビルドを使用すると、最新バージョンのアプリケーションを実稼働に簡単に配信できます。これには、ビルド時間が短縮され、リソースおよびネットワークの使用量が短縮され、改善されたセキュリティー、およびその他の利点があります。OpenShift は複数の ビルドストラテジーおよび入力ソースをサポートします

詳細は、OpenShift Container Platform ドキュメントの Source-to-Image(S2I)ビルド の章を参照してください。

最終的なコンテナーイメージをアセンブルするには、S2I プロセスに 3 つの要素を指定する必要があります。

  • GitHub などのオンライン SCM リポジトリーでホストされるアプリケーションソース。
  • S2I Builder イメージ。アセンブルされたイメージの基盤として機能し、アプリケーションが実行しているエコシステムを提供します。
  • オプションで、S2I スクリプト が使用する環境変数およびパラメーターを指定することもできます。

このプロセスは、S2I スクリプトで指定された指示に従って、アプリケーションソースと依存関係を Builder イメージに挿入し、アセンブルされたアプリケーションを実行する Docker 形式のコンテナーイメージを生成します。詳細は、OpenShift Container Platform ドキュメントの S2I ビルド要件、ビルドオプション、および ビルドの作業 についてのセクションを参照してください。

付録B サンプルアプリケーションのデプロイメント設定の更新

サンプルアプリケーションのデプロイメント設定には、ルート情報や readiness プローブの場所などの OpenShift でのアプリケーションのデプロイおよび実行に関する情報が含まれます。サンプルアプリケーションのデプロイメント設定は YAML ファイルセットに保存されます。Fabric8 Maven Plugin を使用する例では、YAML ファイルは src/main/fabric8/ ディレクトリーにあります。Nodeshift の使用例では、YAML ファイルは .nodeshift ディレクトリーにあります。

重要

Fabric8 Maven Plugin および Nodeshift によって使用されるデプロイメント設定ファイルは、完全な OpenShift リソース定義である必要はありません。Fabric8 Maven Plugin と Nodeshift の両方がデプロイメント設定ファイルを取得し、不足している情報を追加して完全な OpenShift リソース定義を作成できます。Fabric8 Maven Plugin によって生成されたリソース定義は target/classes/META-INF/fabric8/ ディレクトリーにあります。Nodeshift によって生成されるリソース定義は tmp/nodeshift/resource/ ディレクトリーで利用できます。

前提条件

  • 既存のサンプルプロジェクト。
  • oc CLI クライアントがインストールされている。

手順

  1. 既存の YAML ファイルを編集したり、設定を更新して追加の YAML ファイルを作成します。

    • たとえば、例に YAML ファイルがすでに readinessProbe 設定されている場合、path 値を別の利用可能なパスに変更し、準備状態を確認することができます。

      spec:
        template:
          spec:
            containers:
              readinessProbe:
                httpGet:
                  path: /path/to/probe
                  port: 8080
                  scheme: HTTP
      ...
    • が既存の YAML ファイルで設定されて readinessProbe いない場合、readinessProbe 設定を使用して同じディレクトリーに新規の YAML ファイルを作成することもできます。
  2. Maven または npm を使用して、サンプルの更新バージョンをデプロイします。
  3. 設定の更新が、デプロイ済みの例のデプロイ済みバージョンに表示されることを確認します。

    $ oc export all --as-template='my-template'
    
    apiVersion: v1
    kind: Template
    metadata:
      creationTimestamp: null
      name: my-template
    objects:
    - apiVersion: v1
      kind: DeploymentConfig
      ...
      spec:
        ...
        template:
          ...
          spec:
            containers:
              ...
              livenessProbe:
                failureThreshold: 3
                httpGet:
                  path: /path/to/different/probe
                  port: 8080
                  scheme: HTTP
                initialDelaySeconds: 60
                periodSeconds: 30
                successThreshold: 1
                timeoutSeconds: 1
              ...

関連情報

Web ベースのコンソールまたは oc CLI クライアントを使用してアプリケーションの設定を直接更新した場合は、これらの変更を YAML ファイルへエクスポートし、追加します。oc export all コマンドを使用して、デプロイされたアプリケーションの設定を表示します。

付録C Fabric8 Maven Plugin でアプリケーションをデプロイするための Jenkins フリースタイルプロジェクトの設定

ローカルホストから Maven および Fabric8 Maven プラグインを使用してアプリケーションをデプロイするのと同様に、Jenkins が Maven および Fabric8 Maven Plugin を使用してアプリケーションをデプロイするように設定できます。

前提条件

  • OpenShift クラスターへのアクセス
  • 同じ OpenShift クラスター上で実行されるJenkins コンテナーイメージ
  • JDK および Maven が Jenkins サーバーにインストールされ、設定されている。
  • で Maven、Fabric8 Maven プラグイン、および Red Hat ベースイメージを使用するよう設定されたアプリケーション pom.xml

    注記

    アプリケーションを OpenShift にビルドおよびデプロイする場合、Spring Boot 2.1.x は、OpenJDK 8 および OpenJDK 11 に基づくビルダーイメージのみをサポートします。Oracle JDK および OpenJDK 9 ビルダーイメージはサポートされていません。

    pom.xml

    <properties>
      ...
      <fabric8.generator.from>registry.access.redhat.com/redhat-openjdk-18/openjdk18-openshift:latest</fabric8.generator.from>
    </properties>

  • GitHub で利用可能なアプリケーションのソース。

手順

  1. アプリケーションの新規 OpenShift プロジェクトを作成します。

    1. OpenShift Web コンソールを開き、ログインします。
    2. Create Project をクリックし、新規 OpenShift プロジェクトを作成します。
    3. プロジェクト情報を入力し、Create クリックします。
  2. Jenkins がそのプロジェクトにアクセスできることを確認します。

    たとえば、Jenkins のサービスアカウントを設定する場合は、アカウントのアプリケーションのプロジェクトに edit アクセスできることを確認します。

  3. Jenkins サーバーに新たな フリースタイルの Jenkins プロジェクト を作成します。

    1. New Item をクリックします。
    2. 名前を入力し、Freestyle プロジェクト を選択して OK をクリックし ます。
    3. Source Code ManagementGit を選択し、アプリケーションの GitHub URL を追加します。
    4. BuildAdd build step を 選択し、を選択し Invoke top-level Maven targetsます。
    5. 以下を Goals に追加し ます

      clean fabric8:deploy -Popenshift -Dfabric8.namespace=MY_PROJECT

      をアプリケーション MY_PROJECT の OpenShift プロジェクトの名前に置き換えます。

    6. 保存 をクリックします。
  4. Jenkins プロジェクトのメインページから Build Now をクリックして、アプリケーションのビルドとデプロイをアプリケーションの OpenShift プロジェクトにデプロイします。

    また、アプリケーションの OpenShift プロジェクトでルートを開くと、アプリケーションがデプロイされていることを検証することもできます。

次のステップ

付録D WAR ファイルを使用した Spring Boot アプリケーションのデプロイ

fat JAR ファイルを使用する、サポートされるアプリケーションのパッケージ化およびデプロイメントワークフローの代わりに、Spring Boot アプリケーションを WAR(Web Application Archive)ファイルとしてパッケージ化およびデプロイできます。アプリケーションのビルドおよびデプロイメント設定を OpenShift に正しくデプロイするには、ビルドおよびデプロイメントを設定する必要があります。

前提条件

  • サンプル などの Spring Boot アプリケーション。
  • アプリケーションの OpenShift へのデプロイに使用する Fabric8 Maven Plugin。
  • アプリケーションのパッケージ化に使用される Spring Boot Maven プラグイン。

手順

  1. プロジェクトの pom.xml ファイルに war パッケージ化を追加します。

    pom.xml

    <project ...>
      ...
      <packaging>war</packaging>
      ...
    </project>

  2. アプリケーションの依存関係 spring-boot-starter-tomcat としてを指定します。

    pom.xml

    <project ...>
      ...
      <dependencies>
        ...
        <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-tomcat</artifactId>
        </dependency>
        ...
      </dependencies>
      ...
    </project>

  3. Spring Boot repackage Maven プラグインの Maven ゴールが pom.xml ファイルに定義されていることを確認します。

    pom.xml

    <project ...>
    ...
      <build>
        ...
        <plugins>
          ...
          <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <executions>
              <execution>
                <goals>
                  <goal>repackage</goal>
                </goals>
              </execution>
            </executions>
          </plugin>
        </plugins>
      </build>
    ...
    </project>

    これにより、アプリケーションの起動に使用される Spring Boot クラスが WAR ファイルに含まれ、これらのクラスの対応するプロパティーが WAR MANIFEST.mf ファイルのファイルに定義されるようになります。

    • Main-Class: org.springframework.boot.loader.WarLauncher
    • Spring-Boot-Classes: WEB-INF/classes/
    • Spring-Boot-Lib: WEB-INF/lib/
    • Spring-Boot-Version: 2.1.15.RELEASE
  4. ARTIFACT_COPY_ARGS 環境変数を pom.xml ファイルに追加します。

    Fabric8 Maven プラグインはビルドプロセス時にこの変数を使用し、Build および Deploy ツールが(デフォルトの fat JAR ファイルではなく)WAR ファイルを使用してアプリケーションコンテナーイメージを作成することを確認します。

    pom.xml

        ...
        <profile>
          <id>openshift</id>
          <build>
            <plugins>
              <plugin>
                <groupId>io.fabric8</groupId>
                <artifactId>fabric8-maven-plugin</artifactId>
                <executions>
                  ...
                </executions>
                <configuration>
                    <images>
                        <image>
                            <name>${project.artifactId}:%t</name>
                            <alias>${project.artifactId}</alias>
                            <build>
                                <from>registry.access.redhat.com/redhat-openjdk-18/openjdk18-openshift:${openjdk18-openshift.version}</from>
                                <assembly>
                                    <basedir>/deployments</basedir>
                                    <descriptorRef>artifact</descriptorRef>
                                </assembly>
                                <env>
                                    <ARTIFACT_COPY_ARGS>*.war</ARTIFACT_COPY_ARGS>
                                    <JAVA_APP_DIR>/deployments</JAVA_APP_DIR>
                                </env>
                                <ports>
                                    <port>8080</port>
                                </ports>
                            </build>
                        </image>
                    </images>
                </configuration>
              </plugin>
            </plugins>
          </build>
        </profile>
        ...

  5. JAVA_APP_JAR 環境変数を src/main/fabric8/deployment.yml ファイルに追加します。

    この変数は、Fabric8 Maven Plugin に対して、コンテナーに含まれる WAR ファイルを使用してアプリケーションを起動するよう指示します。存在していない場合 src/main/fabric8/deployment.yml は、作成できます。

    deployment.yml

    spec:
      template:
        spec:
          containers:
            ...
              env:
              - name: JAVA_APP_JAR
                value: ${project.artifactId}-${project.version}.war

  6. アプリケーションをビルドし、デプロイします。

    mvn clean fabric8:deploy -Popenshift

付録E 追加の Spring Boot リソース

付録F アプリケーション開発のリソース

OpenShift でのアプリケーション開発に関する詳細は、以下を参照してください。

ネットワークの負荷を減らし、アプリケーションのビルド時間を短縮するには、Minishift または CDK に Maven の Nexus ミラーを設定します。

付録G プロファイシーレベル

それぞれの利用可能な例は、特定の最小限の知識を必要とする概念を取ります。この要件は例によって異なります。最小要件と概念は、複数のレベルの精度にまとめられています。ここで説明するレベルの他に、各例に固有の追加情報が必要になる場合があります。

foundational

この例は、一般的には、サブジェクトに関する事前知識は必要ありません。これらは、一般的な認識と主要な要素、概念、用語を提供します。この例の説明にある直接的な要件を除き、特別な要件はありません。

高度な

Advanced のサンプルを使用する場合、Kubernetes および OpenShift に加えて例の例の一般的な概念や用語を理解していることを前提とします。また、サービスやアプリケーションの設定、ネットワークの管理など、独自に基本的なタスクを実行できる必要もあります。この例では、サービスが必要なものの、サンプルの範囲にない場合、適切に設定する知識があることが前提であり、サービスの結果として生成される状態のみが本書に記載されています。

専門スタッフ

専門的な例には、問題に関する最も高い知識が必要です。機能ベースのドキュメントやマニュアルに基づいて多くのタスクを実行することが想定されており、ドキュメントは最も複雑なシナリオを対象としています。

付録H 用語

H.1. 製品およびプロジェクト名

Developer Launcher(developers.redhat.com/launch)
Developer Launcher と呼ばれるdevelopers.redhat.com/launch は、Red Hat が提供するスタンドアロンのスタート環境です。これは、OpenShift でのクラウドネイティブの開発を開始するのに役立ちます。これには、OpenShift でダウンロード、ビルド、およびデプロイできる機能的なサンプルアプリケーションが含まれます。
minishift または CDK
Minishift を使用してマシンで実行される OpenShift クラスター。

H.2. Developer Launcher に固有する用語

アプリケーション仕様( REST API を使用する web サービスなど)。

例は通常、実行する言語やプラットフォームを指定しません。説明には目的の機能のみが含まれます。

アプリケーションの例

特定の ランタイム に対する特定の の言語固有の実装。アプリケーションの例は、サンプル カタログ に一覧表示されます。

たとえば、アプリケーションは Thorntail ランタイムを使用して実装された REST API を持つ Web サービスです。

カタログの例
サンプルアプリケーションについての情報が含まれる Git リポジトリー。
Runtime
サンプルアプリケーション を実行するプラットフォーム。たとえば、Thorntail または Eclipse Vert.x のようになります。