こんにちは、ソリューションアーキテクトの蒸野(ムシノ)です。
前回はFuseのベースになっている Apache Camel の特徴やサンプルコードをご紹介しました。
今回はようやく Red Hat Fuse について説明していきたいと思います。
前回の振り返り
それでは 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");
REST APIを簡単に作成できる
Fuse は Apicurio Studio がベースとなっている API Designer を使用して、REST API 定義に基づいて Camel Fuse プロジェクトを生成することができます。 access.redhat.com
その他のFuse メリット
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の詳細情報を確認することができます。
Fuse IDE
最後によく聞かれる質問として開発ツールはどういうものがありますか?と尋ねられることがありますので、参考程度としてご紹介いたします。
Red Hat CodeReady Studio
注意: Red Hat CodeReady Studio は Jboss Tools のコミュニティプロジェクトに移管しました。 製品サポートは現在ご提供しておりませんのでご利用時はご承知おき下さい。
ご利用可能なもので、1つ目には Red Hat CodeReady Studio があります。
Red Hat CodeReady Studio には下記のURLから入手してください。
- https://developers.redhat.com/products/codeready-studio/download
- https://tools.jboss.org/downloads/devstudio/
Language Support for Apache Camel
注意: 下記のLanguage Support for Apache Camel はテクノロジープレビューの機能のため製品サポートは提供しておりません。 ご利用時にはご注意ください。
もしくは、Visual Studio Code の機能エクステンションとして、Language Support for Apache Camel エクステンションがあります。 marketplace.visualstudio.com
まとめ
如何でしたでしょうか? Fuse は製品マニュアルも豊富にまとまっており、スタートポイントとしては始めやすい印象を受けていただけたのではないでしょうか? この記事をご覧いただいて、まずはやってみようと思っていただけたら幸いです。
参照リンク
- Apache Camel:https://camel.apache.org/
- Fuseの記事:https://thinkit.co.jp/story/2015/03/20/5746
- Fuse製品説明:https://www.redhat.com/ja/technologies/jboss-middleware/fuse
- Apache Camel 開発者ガイド:https://access.redhat.com/documentation/ja-jp/red_hat_fuse/7.10/html/apache_camel_development_guide/index
- Fuse on Spring Boot のスタートガイド:https://access.redhat.com/documentation/ja-jp/red_hat_fuse/7.10/html/getting_started_with_fuse_on_spring_boot/index