Red Hat エンジニアリングの佐藤匡剛です。赤帽エンジニア Advent Calendar 2019 19日目のつもりで書いたのですが、もう書けちゃったのでせっかくなのでフライングで投稿します。
本ブログやRHTN、勉強会などでたびたびお伝えしていた通り、ついに先月11/28にApache Camel 3.0がGAリリースされました! Camel 2.0の登場から、10年ぶりのメジャーアップグレードだそうです。
そういえば、10年前というとオープンソースのEIP実装/ESBといえばまだまだMule ESB、Apache ServiceMixが中心だった頃に、簡潔なDSLで非常に軽量なルーティングエンジンとして登場したCamelが一部で注目を集めつつあったのを思い出します。
Camel 3の注目ポイント(Top 10)
以前のブログでも紹介しましたが、Camel 3の注目ポイントは以下の通りです。
Apache Camel 3 What's New (top 10) - Apache Camel
- 3(+ 1)プロジェクトに
- Webサイトリニューアル
- Java 11サポート
- モジュール化された
camel-core
- 起動高速化とフットプリント軽量化
- タイプセーフなエンドポイントDSLの導入
- ルーティングエンジンのリアクティブ化
- 独立した
camel-main
JAR - MicroProfile対応
- 様々な機能改善
- マイグレーションガイド
今回は、それぞれの注目ポイントを詳しく解説していきます。
なお、本記事はClaus Ibsenによる上記英文記事の翻訳ではなく、私なりに噛み砕いた紹介記事なので、興味のある方は英文記事の方も読んでみることをオススメします。
1. 3(+ 1)プロジェクトに
Camel 2まではSpring BootとKarafのランタイムサポートも含めたすべてのライブラリが1プロジェクトでリリースされてきましたが、Camel 3以降はCamel K、Camel QuarkusがApache Camelの正式なサブプロジェクトとして加わり、3プロジェクト体制になります。
(https://camel.apache.org/blog/Camel3-Whatsnew/ より)
- Camel 3 ― Apache Camelの中心ライブラリで、これまでのCamel 2と同じくあらゆるJavaアプリケーションで使えるインテグレーションフレームワーク。Camel K、Camel QuarkusはCamel 3をベースとする。
- Camel K ― CamelをKubernetes / Knative上で使えるようにするためのプロジェクト。クラウドベースのランタイムとインテグレーションOperatorを含む。
- Camel Quarkus ― QuarkusのCamelエクステンション。ネイティブコンパイルした超高速Camelアプリケーションが実行可能になる。
Camel KとCamel Quarkusの役割分担が多少分かりにくいですが、Camel QuarkusはCamelランタイム自体の超高速化、Camel KはCamelアプリケーションをクラウドネイティブにするためのOperator、という位置付けです。両者は競合するものではなく相互に連携し合います。ゆくゆくは、たとえばクラウドネイティブ(Camel K)かつネイティブコンパイルされた超高速なランタイム(Camel Quarkus)で動くCamelアプリケーション、といったものが近いうちに実現できるかもしれません。
なお、3.0リリース時点ではまだプロポーザル段階でしたが、camel-kafka-connectorも今後、正式にサブプロジェクトに加わりそうです。したがって、最終的には「3(+ 1)」プロジェクト体制に生まれ変わります。
Today we are launching another subproject of @ApacheCamel: https://t.co/dT1rljQxZQ, camel-kafka-connector is based on @apachekafka connect API and it is leveraging the available camel components. Discover more in the official repository, contributions are welcome!
— Apache Camel (@ApacheCamel) December 6, 2019
A little blog post about the new arrival in the Apache Camel's family: camel-kafka-connector. Just an introduction to the project: https://t.co/8rsqqyIv3K, we'll add more content in the future @ApacheCamel @apachekafka @TheASF
— Apache Camel (@ApacheCamel) December 14, 2019
2. Webサイトリニューアル
今ではイケてるオープンソースプロジェクトはWebサイトもモダンでカッコいいのが当たり前になっていますが、Camel 2.xまでは2000年代の古くさいApacheなWebサイトのままでした。3.0リリースを機に、ようやくWebサイトもモダンに生まれ変わりました。
個人的なオススメは、新しくなったCamelコンポーネントレファレンスです。Camelといえば300+あるコンポーネントによって色々な外部システムと連携できるのが一番の売りですが、そのコンポーネントリストが非常に参照しやすくなりました。
List of Camel components - Apache Camel
特に注目してほしいのが、この左メニューの上の "Quick lookup" 検索窓です。これで300+の中から、探したいコンポーネントを一瞬で見つけられます!
あともう1つ忘れてはいけないのが、Webサイトの各ページに "Edit" ボタンが付いたことです。Editボタンをクリックするだけで、GitHubの該当するソースに直接飛んで、そのままGitHub上で修正をプルリクできます。コミュニティへのコントリビューションの敷居がいっそう低くなりましたので、ぜひどんな小さなタイポでも見つけたらコントリビュートしてみてください!
私もこういう超細かい修正をちょくちょくコントリビュートしています。
3. Java 11サポート
Camel 3.0がJava 11を正式にサポートする最初のバージョンになります。
Java 8も当分の間はCamel 3.xでサポートされますが、Camel 2.xから3.xへマイグレーションするための補助、という位置付けなので、Java 8のEOLに合わせて将来の3.xバージョンではいずれサポートが外されることになります。
4. モジュール化されたcamel-core
Camelクラウドネイティブ化の一環でアプリケーションのフットプリントを軽量化するため、camel-core
のリファクタリング(さらに細かいJARへの分割)が行われました。このモジュール化によって、Camel 3からは本当に必要な依存JARだけをパッケージできるようになります。
細かい話は、古市さんの翻訳記事に書かれています。
Camelユーザの観点で大事なのは、camel-api
、camel-support
、camel-core-engine
の3つです。
- camel-api ― Camelの基本的なAPI(
CamelContext
、Endpoint
、Exchange
、Message
など)が含まれます。 - camel-support ― Camel APIの基本実装クラスが提供されます。
- camel-core-engine ― Camelルートエンジンの実装です。
なお、Clausの英文記事にはRouteBuilder
はcamel-support
に含まれると書いてあるのですが、見たかぎりRouteBuilder
はcamel-core-engine
に含まれています。
このモジュール化で大事なポイントの1つは、これまで組み込みコンポーネントとしてcamel-core
に同梱されていたDirectやLogなどの基本コンポーネントもすべて外だしされたことです。
- camel-bean
- camel-log
- camel-stub
- camel-browse
- camel-mock
- camel-timer
- camel-controlbus
- camel-properties
- camel-validator
- camel-dataformat
- camel-ref
- camel-vm
- camel-direct
- camel-rest
- camel-xpath
- camel-directvm
- camel-saga
- camel-xslt
- camel-file
- camel-scheduler
- camel-zip-deflater
- camel-language
- camel-seda
これからは、本当に必要なコンポーネントだけを使って可能な限り軽量にCamelアプリケーションを作っていくのが推奨スタイルになります。
もちろん、救済措置として本当にミニマルなcamel-core-engine
の他に、上記基本コンポーネントを含んだ「レガシー」なcamel-core
も提供されます。Camel 3の軽量なスタイルへ書き換えるまでの移行措置として、この従来型camel-core
を使うことができます。
5. 起動高速化とフットプリント軽量化
camel-core
モジュール化の結果として、メモリにロードされるクラスの数が削減されました。Clausの英文記事によれば、Camel 2では5200クラスロードされていたのがCamel 3では4300に減ったそうです。
それに加えて、リフレクションで実装されていた箇所を静的コード生成で置き換えるという最適化も行われています。これはCamel Quarkusの取り組みとも連動しているのですが、リフレクションを使わないことでプログラム起動の高速化を図るとともに、Quarkusでネイティブコンパイル可能にもしています。
6. タイプセーフなエンドポイントDSLの導入
個人的にCamel 3単体での一番の売りはここかなと思っています。Java DSLメインでCamelを使っている方は、すぐにCamel 3を試してみたくなるのではないでしょうか。
「タイプセーフ」なエンドポイントDSLというのは、要するに従来のテキストベースのtimer:click?period=3000&fixedRate=true
といった定義でなく、URIのパラメータも含めてメソッドチェーンでエンドポイントを定義できるDSLのことです。
テキストベースではパラメータ名が間違ってないか、パラメータの値の型(int
など)が正しいか、といったことを厳密にはコンパイル時にチェックできませんでした。
from("timer:click?period=3000&fixedRate=true") .to("seda:foo?blockWhenFull=true");
メソッドチェーンのDSLになることで、Javaのコンパイル時型チェックでそういったエラーを検査できるようになります。
from(timer("click").period(3000).fixedRate(true)) .to(seda("foo").blockWhenFull(true));
エンドポイントDSLを使うには、pom.xml
のdependencyにcamel-endpointdsl
を追加し、RouteBuilder
の代わりにEndpointRouteBuilder
を使ってルートを定義します。
return new EndpointRouteBuilder() { @Override public void configure() throws Exception { from(timer("click").period(3000).fixedRate(true)) .to(seda("foo").blockWhenFull(true)); } };
サンプルプロジェクトは以下を見てみてください。
7. ルーティングエンジンのリアクティブ化
内部実装の話で今のところユーザには直接影響ないですが、ルーティングエンジンがリアクティブに書き換えられました。実際のところ、数年前にCamel 3の計画が立てられていた時点ではこのリアクティブ化が目玉機能になる予定だったのですが、実際に蓋を開けてみると約束通りこの目標が達成はされたものの他の注目機能に比べて地味な位置付けになっています。
私も実際にどうリアクティブに書き換えられたのかまだ追えていないのですが、おそらくはスレッドを使わなくなることでリソース消費が効率的になる他に、今までのスレッドベースのエンジンではルート内で例外が発生した際にスタックトレースが冗長になっていたものがより短く簡潔になる、などの恩恵がある(はず)です。
あと、ゆくゆくはJava 8のサポートが終了してJava 11が前提になった段階で、Camel APIにJava 9 Flow APIをベースにしたリアクティブなクライアントAPIを導入する構想があります。
8. 独立したcamel-main
JAR
地味な機能追加ですが、Spring BootやKarafなどのランタイムなしにスタンドアローンでCamelアプリケーションを実行しやすいように、camel-main
ライブラリが外だしされました。これもクラウドネイティブ化の一環で、アプリケーションに不必要なランタイムの依存をなるべく取り除いていこうという方向性にあるものです。
実際の使用サンプルについては、以下を見てみてください。
9. MicroProfile対応
Camelのマイクロサービス対応の流れで、Eclipse MicroProfileとの連携も進められています。具体的には、MicroProfileの設定、メトリクス、ヘルスチェック、耐障害性などをサポートしたコンポーネントが新たに作られました。これらのMicroProfileコンポーネントはCamel Quarkusにも対応しています。
10. 様々な機能改善
Camel 3.0にはその他にも細かな修正や機能改善がいっぱい入っています。Clausの英文記事で言われている点を箇条書きするとこんなところです。
- JUnit 5サポート
- Camel Registryが書き込み可能になってテストで使いやすくなった
- プロデューサーエンドポイントの遅延初期化が可能に
- Camel Supervising Route Controllerによるルート起動時のより細やかな管理
11. マイグレーションガイド
Top 10といいつつ11個目があるのはご愛嬌です。もともとはこのCamel 2.x → 3.0マイグレーションガイドの紹介で記事を書こうと思っていたのですが、まずはCamel 3の注目ポイント紹介だけで十分お伝えすべきボリュームがあったので、予定を変更してこの記事を書きました。
Camel 3はなるべく後方互換性を尊重しつつ作られているとはいえ、10年ぶりのメジャーアップグレードなので、技術的負債の返済も含めて変わるべきところは変わっています。お手元のCamel 2.xアプリケーションを3.0にアップグレードするには、このマイグレーションガイドに沿ってプロジェクトを修正していく必要があります。
Apache Camel 2.x to 3.0 Migration Guide - Apache Camel
このガイドの紹介は年明けにでも書こうと思っているので、ご期待ください。
それでは、新しくなったCamel 3でラクダ乗りを楽しみましょう!
(クラウドへ向かうラクダのイメージ)― Photo by Federico Gutierrez on Unsplash