Red Hat Fuse 再入門

こんにちは、ソリューションアーキテクトの蒸野(ムシノ)です。

前回はFuseのベースになっている Apache Camel の特徴やサンプルコードをご紹介しました。
今回はようやく Red Hat Fuse について説明していきたいと思います。

前回の振り返り

rheb.hatenablog.com

それでは Fuse をご存知無い方に向けて、製品の概要や利用する上でのメリット、どこから始めるべきか?という点のご紹介をしていきたいと思います。

Fuse 概要

Fuse は、Apache Camel 2.x をベースにし多様なインテグレーションパターンを実装したインテグレーションエンジンと位置づけています。Apache Camel の思想を受け継ぎ、様々なシステムへのコネクターやデータフォーマットに対応し、インテグレーションの課題に対応します。

ここでは大きく5つの特徴を紹介します。

Enterprise Integration Patterns(EIP)に基づいている

前回記事でも紹介しました Enterprise Integration Patterns(EIP)にですが、Fuse 開発ガイド にも記載があります。 access.redhat.com

Fuse開発ガイドでは Apache Camel のEIPパターンよりも実現できるパターンは若干少なくなっていますが、「メッセージングシステム」「メッセージングチャネル」「メッセージの構築」「メッセージルーティング」「メッセージの変換」「メッセージングエンドポイント」「システム管理」のカテゴリに分けられてインテグレーションを実現できる点は同様です。Fuse開発ガイドのほうが日本語対応している為、入りやすいかも知れません。

200以上のコンポネントを利用できる

Fuseには多くの SaaS システムなどへ接続できるコンポーネントが豊富に用意されています。 developers.redhat.com ちなみに、Apache Camel には現時点300以上のコンポーネントが存在しています。特殊な環境を除けば標準のコンポーネントだけで十分インテグレーションが可能です。

注意点:
コンポーネントによってはサポートしていないものが存在します。開発時、適用する場合には事前にご確認ください。 Chapter 1. Components Overview Red Hat Fuse 7.10 | Red Hat Customer Portal

データ変換に対応する

Fuse では様々なデータフォーマットによるデータ変換、データマッピングにも対応しています。 access.redhat.com

DSLによる素早くインテグレーションできる

DSLを理解するにはまずはFuseの開発者ガイドにある「ルート構築の基本原則」を確認いただくことをお勧めいたします。 access.redhat.com

上記URLにも書かれているようにシェルでパイプ(|)でコマンドを連結するようにEIPのパターンを組合せてルーティングをデザインできます。 単純な例ですが、ファイルを取得しContent Based Router EIPを使って、その人がロンドン出身かどうかを判定したいとします。 これを Java DSLで記述すると下記のようになります。

Java DSL

from("file:src/data?noop=true")
      .choice()
          .when(xpath(“/person/city = ‘London’”))
              .log("UK Message")
              .to(“file:target/messages/uk”)
          .otherwise()
              .log(“Other Message”)
              .to("file:target/messages/others");

参照:Java DSL :: Apache Camel

REST APIを簡単に作成できる

Fuse は Apicurio Studio がベースとなっている API Designer を使用して、REST API 定義に基づいて Camel Fuse プロジェクトを生成することができます。 access.redhat.com

その他のFuse メリット

www.redhat.com

Fuse 開発の始め方

前置きが長くなりましたが、それではFuseを始めるにあたって最も簡単なスタートポイントをご紹介したいと思います。 Fuseは、「Fuse on Spring Boot」「Fuse on Karaf」「Fuse on JBoss EAP」の3つの方法で始めれますが、今回は「Fuse on Spring Boot」でご説明したいと思います。

1. ブースタープロジェクトにアクセスする

Fuseのブースタープロジェクトは fuse アプリケーションの雛形を作成し、実行可能なサンプルを提供することにあります。Fuse開発者はここから簡単にFuseのアプリケーション開発を始めることができます。 前回の記事ではサーキットブレーカーのサンプルコードがありましたが、これと似たFuseサーキットブレーカブースターを作ってみたいと思います。

https://developers.redhat.com/launch にアクセスします。

2. ブースタープロジェクトを開始します

上部中央にある、「Start」をクリックします。

Red Hat アカウントを求められるのでアカウントがない場合は事前に作成しておきます。 Red Hat アカウントはこちらから作成できます。https://access.redhat.com/

3. Launcherを開始する

ランチャーページで「Deploy an Example Application」をクリックします。

5. Example Application の作成

Create Example Application ページの名前を「fuse-circuit-breaker」とします。この名称でアプリケーションが作成されます。 名前を決めたら次はサンプルアプリケーションタイプを指定します。「Select an Example」をクリックします。

6. Example Application タイプの指定

Exampleにはいくつかのサンプルアプリケーションタイプが並んでいます。今回はFuseのサンプルを動作させますので、右上にあるメニューからFuseを選択します。5つのアプリケーションタイプに絞られたと思います。この中から「Circuit Breaker」を選択します。Fuseのバージョンを選ぶプルダウンメニューが表示されますので、ここでは「7.9.0 sb2 (Red Hat Fuse)」を選択します。その後「Save」をクリックしてください。

7. Example Application の ダウンロード

サンプルアプリケーションができたと思いますので、中央のダウンロードをクリックします。

8. Example Application のビルド

ダウンロードしたサンプルアプリケーションをUnZipし、任意の場所に配置します。

注意: ビルドにはJava Developer Kit (JDK) とApache Maven 3.3以上が必要です。サポートされる構成は下記をご覧ください https://access.redhat.com/ja/articles/522893

ls
LICENSE                 greetings-service/      mvnw*                   name-service/
README.adoc             itest/                  mvnw.cmd*               pom.xml
8.1. プロジェクトビルド

サンプルアプリケーションの位置まで移動し、MVNコマンドでプロジェクトをビルドします。

cd fuse

❯ cd fuse-circuit-breaker

❯ mvn clean -DskipTests=true package 
[INFO] Scanning for projects...
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Build Order:
[INFO] 
[INFO] Fuse :: Boosters :: Springboot :: Circuit Breaker                  [pom]
[INFO] Fuse :: Boosters :: Springboot :: Circuit Breaker :: Name service  [jar]
[INFO] Fuse :: Boosters :: Springboot :: Circuit Breaker :: Greetings service [jar]
[INFO] Fuse :: Boosters :: Springboot :: Circuit Breaker :: Integration Tests [jar]
[INFO] 
[INFO] ------------< com.yourcompany.newapp:fuse-circuit-breaker >-------------
[INFO] Building Fuse :: Boosters :: Springboot :: Circuit Breaker 1.0.0   [1/4]
[INFO] --------------------------------[ pom ]---------------------------------
...省略...
INFO] Compiling 1 source file to /.../fuse-circuit-breaker/itest/target/test-classes
[INFO] 
[INFO] --- maven-surefire-plugin:2.22.0:test (default-test) @ itest ---
[INFO] Tests are skipped.
[INFO] 
[INFO] --- maven-jar-plugin:2.4:jar (default-jar) @ itest ---
[WARNING] JAR will be empty - no content was marked for inclusion!
[INFO] Building jar: /Users/nmushino/Development/fuse/fuse-circuit-breaker/itest/target/itest-1.0.0.jar
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Summary for Fuse :: Boosters :: Springboot :: Circuit Breaker 1.0.0:
[INFO] 
[INFO] Fuse :: Boosters :: Springboot :: Circuit Breaker .. SUCCESS [  0.090 s]
[INFO] Fuse :: Boosters :: Springboot :: Circuit Breaker :: Name service SUCCESS [  3.201 s]
[INFO] Fuse :: Boosters :: Springboot :: Circuit Breaker :: Greetings service SUCCESS [  1.336 s]
[INFO] Fuse :: Boosters :: Springboot :: Circuit Breaker :: Integration Tests SUCCESS [  0.993 s]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  5.957 s
[INFO] ------------------------------------------------------------------------
8.2. name サービスを起動します

このサンプルでは呼び名を返すバックエンドサービスである「name」サービスがあります。このサービスを8081ポートで起動させます。

cd name-service

❯ mvn spring-boot:run -DskipTests -Dserver.port=8081
[INFO] Scanning for projects...
...省略...

2022-06-02 18:39:05.077  INFO 30925 --- [           main] o.a.camel.spring.SpringCamelContext      : Apache Camel 2.23.2.fuse-790054-redhat-00001 (CamelContext: camel-1) started in 0.181 seconds
2022-06-02 18:39:05.080  INFO 30925 --- [           main] com.redhat.fuse.boosters.cb.Application  : Started Application in 2.568 seconds (JVM running for 2.839)
8.3. greetings サービスを起動します

次に名前を取得するよう name サービスを呼び出し、文字列 Hello, 「NAME」 を返すフロントエンドサービスである greetings サービスを起動させます。このサービスは8080ポートで起動させます。

cd greetings-service

❯ mvn spring-boot:run -DskipTests -Dserver.port=8080
[INFO] Scanning for projects...

...省略...
2022-06-02 18:42:53.980  INFO 31447 --- [           main] o.a.camel.spring.SpringCamelContext      : Apache Camel 2.23.2.fuse-790054-redhat-00001 (CamelContext: camel-1) started in 0.246 seconds
2022-06-02 18:42:53.981  INFO 31447 --- [           main] com.redhat.fuse.boosters.cb.Application  : Started Application in 2.822 seconds (JVM running for 3.16)
8.4. greetings リクエストを行う

ブラウザーで 「http://localhost:8080/camel/greetings」にリクエストします。

{
"greetings": "Hello, Jacopo"
}

とレスポンスが返却されれば問題なく実行されていることになります。「greetings-service」サービスのログには下記のように name サービスが呼ばれている結果が表示されているはずです。

2022-06-02 18:47:03.204  INFO 31447 --- [-CamelHystrix-6] route1                                   :  Try to call name Service
2022-06-02 18:47:03.216  INFO 31447 --- [-CamelHystrix-6] route1                                   :  Successfully called name Service
8.5. サーキットブレーカーを確認する

それでは name サービス側を「Ctrl−C」などで停止します。

2022-06-02 18:51:05.663  INFO 30925 --- [extShutdownHook] o.a.c.c.s.CamelHttpTransportServlet      : Destroyed CamelHttpTransportServlet[CamelServlet]
2022-06-02 18:51:05.667  INFO 30925 --- [extShutdownHook] o.s.s.concurrent.ThreadPoolTaskExecutor  : Shutting down ExecutorService 'applicationTaskExecutor'
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  12:05 min
[INFO] Finished at: 2022-06-02T18:51:05+09:00
[INFO] ------------------------------------------------------------------------

次にもう一度ブラウザーで 「http://localhost:8080/camel/greetings」にリクエストします。

{
"greetings": "Hello, default fallback"
}

とレスポンスがあれば、サーキットブレーカーが動作していることを示しています。同様に「greetings-service」サービスのログを見ると「We are falling back!!!!」という内容が表示されているはずです。

2022-06-02 18:54:00.337  INFO 31771 --- [-CamelHystrix-6] route1                                   :  We are falling back!!!!
2022-06-02 18:54:03.200  INFO 31771 --- [-CamelHystrix-7] route1                                   :  Try to call name Service
2022-06-02 18:54:03.204  INFO 31771 --- [-CamelHystrix-7] o.a.c.httpclient.HttpMethodDirector      : I/O exception (java.net.ConnectException) caught when processing request: Connection refused
2022-06-02 18:54:03.204  INFO 31771 --- [-CamelHystrix-7] o.a.c.httpclient.HttpMethodDirector      : Retrying request
2022-06-02 18:54:03.207  INFO 31771 --- [-CamelHystrix-7] o.a.c.httpclient.HttpMethodDirector      : I/O exception (java.net.ConnectException) caught when processing request: Connection refused
2022-06-02 18:54:03.207  INFO 31771 --- [-CamelHystrix-7] o.a.c.httpclient.HttpMethodDirector      : Retrying request
2022-06-02 18:54:03.211  INFO 31771 --- [-CamelHystrix-7] o.a.c.httpclient.HttpMethodDirector      : I/O exception (java.net.ConnectException) caught when processing request: Connection refused
2022-06-02 18:54:03.211  INFO 31771 --- [-CamelHystrix-7] o.a.c.httpclient.HttpMethodDirector      : Retrying request

その後再度「name」サービスを起動しましょう。先程同様に文字列 Hello, 「NAME」が返ってくることが分かります。

8.6. Hystrix ダッシュボードを確認する。

このサンプルアプリケーションではHystrix ダッシュボードを備えています。ブラウザーで 「http://localhost:8080/」にアクセスします。

アクセスすると1秒毎に「greetings」サービスにリクエストするのが分かります。この中で「name」サービスを停止・起動してみましょう。リクエスト結果は常に上位に表示されるため、「name」サービスが停止したときには、「Hello, default fallback」が上位に表示され、「name」サービスが再開したときには代わって「Hello, Jacopo」が上位に表示されることが分かります。

停止

起動

注意:
このサンプルアプリケーションに含まれる、Netflix/Hystrix はメンテナンスモードになっています。 実運用時の場合に採用する場合いおいては、十分ご検討・ご配慮いただくようにお願いします。

Fuse の管理UI

Fuse Console は、HawtIO をベースとする Web コンソールです。Fuse Console は、Fuse の詳細を確認および管理するインターフェースを提供し、 Fuse のシステムリソースの監視、更新の実行、およびサービスの開始と停止を行うこともできます。ここではスタンドアローンアプリケーションにFuse Console を導入する方法を説明します。

1. hawtio-springboot を pom.xml に追加

サンプルアプリケーションの pom.xml ファイルに hawtio-springboot の dependency に追加します

<dependency>
  <groupId>io.hawt</groupId>
  <artifactId>hawtio-springboot</artifactId>
</dependency>

2. application.properties に各種プロパティを追加

src/main/resources/application.properties ファイルを編集し次のように追加・変更します。

  • endpoints.jolokia.sensitive = false
  • endpoints.hawtio.sensitive = false
  • hawtio.authenticationEnabled = false
  • endpoints.hawtio.enabled = true
  • endpoints.jolokia.enabled = true

編集後、以下のような設定になっていると思います。

management.port=10001

# enable management endpoints for healthchecks and hawtio
endpoints.enabled = false
endpoints.hawtio.enabled = true
endpoints.jolokia.enabled = true
endpoints.health.enabled = true
management.health.defaults.enabled=false
camel.health.enabled=false
camel.health.indicator.enabled=true
endpoints.jolokia.sensitive=false
endpoints.hawtio.sensitive=false
hawtio.authenticationEnabled=false

3. Fuse Console へアクセス

先程実施したように greetings サービスを起動させます。 その後、src/main/resources/application.properties ファイルで指定した management.port のポート番号にアクセスします。これでFuseの詳細情報を確認することができます。

http://localhost:10001/hawtio

Fuse IDE

最後によく聞かれる質問として開発ツールはどういうものがありますか?と尋ねられることがありますので、参考程度としてご紹介いたします。

Red Hat CodeReady Studio

注意: Red Hat CodeReady Studio は Jboss Tools のコミュニティプロジェクトに移管しました。 製品サポートは現在ご提供しておりませんのでご利用時はご承知おき下さい。

ご利用可能なもので、1つ目には Red Hat CodeReady Studio があります。

Red Hat CodeReady Studio には下記のURLから入手してください。

Language Support for Apache Camel

注意: 下記のLanguage Support for Apache Camel はテクノロジープレビューの機能のため製品サポートは提供しておりません。 ご利用時にはご注意ください。

もしくは、Visual Studio Code の機能エクステンションとして、Language Support for Apache Camel エクステンションがあります。 marketplace.visualstudio.com

まとめ

如何でしたでしょうか? Fuse は製品マニュアルも豊富にまとまっており、スタートポイントとしては始めやすい印象を受けていただけたのではないでしょうか? この記事をご覧いただいて、まずはやってみようと思っていただけたら幸いです。

参照リンク

* 各記事は著者の見解によるものでありその所属組織を代表する公式なものではありません。その内容については非公式見解を含みます。