質問と回答のラクダ

4月6〜7日に、経験豊富な開発者向けの国際Java会議JPointがモスクワで6回開催されます。 今回は、Apacheの第一人者であるRed HatのシニアエンジニアであるClaus Ibsen(Claus Ibsen)が出席します。 以下は、彼の本「Camel in Action」の冒頭の翻訳です-ブログの読者専用です。




キャメルの紹介


複雑なシステムをゼロから作成することは、コストがかかり、ほぼ常に運命のビジネスです。 既存の実績のあるコンポーネントからパズルとして組み立てる方がはるかに効率的で安全です。 日常生活では、電話通信や金融取引から医療サービスや旅行や娯楽の計画まで、こうした統合システムにしばしば依存しています。

パズルは、すべてのフラグメントがある場合にのみ組み立てることができ、簡単かつ確実に相互に接続されます。 システム統合プロジェクトにも同じことが言えます。 しかし、1つの画像を形成するために実際のパズルのピースが作成された場合、ITシステムの場合、状況は原則として反対になります。 開発者としては、原則として、統合システムの内部構造と作業についてあまり心配せず、外部からシステムと対話する方法にもっと興味があります。 優れた統合フレームワーク(プラットフォーム)には2つのことが含まれます。1つは、複雑で統合可能なシステムを記述するためのシンプルで便利な抽象化装置、もう1つは、それらを単一の全体に結合できる接続メカニズムです。

そのようなプラットフォームの例は、Apache Camelです。 この本は、Camelの概要、使用方法、およびCamelを最高の統合プラットフォームの1つと考える理由を理解するのに役立ちます。 最初の章は、Camelの紹介とその主な機能の説明から始まります。 次に、キャメルの分布を見て、本の例に従う方法を説明します。 この章の最後で、そのアーキテクチャを理解するために必要な基本的なキャメルの概念を紹介します。

準備はいい? その後、キャメルに会います。

キャメルの紹介


Camelは、生産的かつ喜びを持って動作するように設計されたアプリケーション統合プラットフォームです。 Camelの歴史は2007年に始まり、今日ではApache 2ライセンスの下で配布されている成熟したオープンソースプロジェクトであり、その周りに強力な開発コミュニティが開発されています。

Camelの主な目標は、統合を簡素化することです。 この本を読んで、Camelの機能を評価し、必要なツールのコレクションに含めることを願っています。

CamelはApacheプロジェクトファミリーの一部であり、その簡潔さと覚えやすさからその名前を獲得しています。 プロジェクトの名前は、創業者の一人が喫煙したたばこのブランドに由来しているバージョンがあります。 他のバージョンは、プロジェクトWebサイトの質問と回答のリストにあります。

キャメルとは何ですか?


Camelプラットフォームのコアは、ルーティングメカニズム、より正確には、ルーティングメカニズムのリンカーです。 リンカを使用して、独自のルーティングルールを設定し、メッセージを受信するソースを決定し、これらのメッセージをさらに処理および送信する方法を決定できます。 Camel統合言語を使用すると、ビジネスプロセスに近い複雑なルーティングルールを設定できます。 図に示すように 1.1、キャメルは無関係なシステム間のリンクです。

Camelの基本原則の1つは、処理されるデータについて何も仮定しないということです。 開発者として、データを標準形式に変換することなくさまざまなタイプのシステムを統合できるため、これは重要なポイントです。

1.1キャメルは、無関係なシステム間のリンクです。



高レベルの抽象化により、Camelでは同じAPIを使用して、異なるプロトコルとデータ型を使用する異なるシステムと対話できます。 特定のプロトコルおよびデータ型のAPIは、適切なコンポーネントとして実装されます。 デフォルトでは、Camelは280を超えるプロトコルとデータタイプをサポートし、拡張可能なモジュールアーキテクチャのおかげで、独自のプロトコルとオープンプロトコルの両方に必要なプロトコルのサポートを個別に実装できます。 これにより、不必要なデータ変換が不要になり、Camelが高速になるだけでなく、食いしん坊も少なくなります。 結果として、Camelは高度な処理機能を必要とするプロジェクトに組み込むのに最適です。 特に、CamelはApache ServiceMix、Karaf、ActiveMQなどのオープンソースプロジェクトの統合タスクにすでに使用されています。

キャメルではないものについて。 これはESBサービスバスではありませんが、ルーティング、変換、オーケストレーション、モニタリング、およびその他の機能をサポートしているため、ESBの軽量バージョンと呼ばれるものもあります。 Camelにはコンテナーと信頼できるメッセージングバスがありませんが、たとえば、既に説明したApache ServiceMixで使用できます。 したがって、CamelはESBソリューションではなく統合プラットフォームと呼ぶことを好みます。

ESBの複雑なモンスターシステムについてすぐに思い浮かぶなら、私たちは安心させようと急いでいます。

キャメルとは何かを理解するために、その主な機能を検討してください。

ラクダを使用する理由


キャメルは、統合の分野における新しいアイデアの実用的な実施形態です。 次に、Camelの機能を詳しく見ていきますが、今のところ、それらをリストします。


次に、このリストをポイント別に分析します。

調停およびルーティングメカニズム


メディエーションとルーティングのメカニズムは、Camelの中核です。 ルーティングメカニズムは、ルート構成に従ってメッセージを選択的に移動します。 Camelでは、統合テンプレートとサブジェクト言語を使用してルートが構成されます(詳細については後で説明します)。

拡張可能なコンポーネントライブラリ


Camelには280を超えるコンポーネントの広範なライブラリがあり、さまざまなトランスポートを介して接続し、異なるAPIを使用し、異なるデータ形式を理解できます。 図 1.2。 既に使用した、または使用したい技術を確実に見つけることができます。 もちろん、この本の枠組みの中で、すべてのCamelコンポーネントを検討することは不可能ですが、20個の主要なコンポーネントについて説明します。

1.2あらゆるものに接続する機能:Camelは280を超えるトランスポート、API、およびデータ形式をサポートしています。



エンタープライズアプリケーション統合テンプレート(EIP)


さまざまな統合の問題があるため、Gregor HohpeとBobby Woolfが指摘したように、それらの多くには同様の解決策があります。 これら2つは、書籍「Enterprise Integration Patterns」(ロシア語に翻訳された-「Enterprise Application Integration Templates」)をリリースしました。これは、アプリケーション統合の分野専門家であると考える人なら誰でも読んでください。 さらに、この本は、Camelの概念をより速く簡単に理解するのに役立ちます。

統合テンプレート(EIP)は、さまざまな統合の問題に対する実証済みのソリューションを提供するだけでなく、これらの問題自体の説明と表示を簡素化し、適切なセマンティクスを提供するため便利です。 キャメルは、EIPパターンに大きく基づいています。 ただし、EIPテンプレートは問題と解決策を記述し、共通の辞書も提供しますが、この辞書は形式化されていません。 Camelは、統合ソリューションを記述するための言語を提供することにより、このギャップを埋めます。 Enterprise Integration Patternsブックに記載されているパターンとCamelDSLのサブジェクト言語の間には、ほぼ1対1の関係があります。

サブジェクト指向言語(DSL)


Camelが登場した時点で、統合への主な貢献は主題指向言語(DSL)でした。 時間が経つにつれて、他の統合フレームワークがこの例に従い、現在DSLはJava、XML、およびその他のプログラミング言語になっています。 DSLを使用すると、開発者は使用するツール(プログラミング言語)の機能に気を取られることなく、統合タスクに集中できます。 異なる形式を使用するが、機能的には完全に同等なDSLの例をいくつか考えてみましょう。

Java DSL

1 from("file:data/inbox").to("jms:queue:order"); 

XML DSL

 1 <route> 2 <from uri="file:data/inbox"/> 3 <to uri="jms:queue:order"/> 4 </route> 

これは実際のコードであり、目的のフォルダーからJMS(Java Message Service)キューにファイルを送信することがどれほど簡単かを示しています。 DSLは一般的なプログラミング言語に基づいているため、開発者はコンパイラーエラーを入力または検出する際のオートコンプリートなど、IDE環境の使い慣れた便利なツールに引き続きアクセスできます。 1.3。

1.3 Camel DSL言語はJavaなどの一般的なプログラミング言語に基づいているため、IDEの便利で使い慣れた機能を使用できます。


この図は、Eclipse IDEで入力するオートコンプリート機能が、可能なDSL式のリストを提供する方法を示しています。

ペイロード形式独立ルーター


Camelは、XMLペイロードなど、1つの正規化された形式だけでなく、あらゆる形式で有用なデータをルーティングできます。 したがって、ロードをルーティングするために、標準形式に変換する必要はありません。

プラグインアーキテクチャ


Camelのモジュールアーキテクチャを使用すると、配信パッケージに含まれるコンポーネントと、サードパーティの開発者が作成したコンポーネントの両方をロードできます。 さらに、Camelのほとんどすべてを構成できます。その機能の多くは、ID生成、フロー制御、完了シーケンス、ストリームキャッシングなど、プラグインおよびカスタマイズ可能です。

モデルPOJO


CamelのJava(またはPlain Old Java Object、POJO)のBeanコンポーネントは一流の市民であるため、ほぼいつでもどこでも統合プロジェクトで使用できます。 多くの場合、コードでCamelの組み込み機能を拡張することもできます。

設定が簡単


キャメルの構成は可能な限り最小限に抑えられます。 ルートでエンドポイントを直接定義するには、わかりやすいURI構成を使用します。

たとえば、次のように記述するだけで、ファイルエンドポイントから開始し、.txtファイルのサブフォルダーを再帰的にスキャンするキャメルルートを構成できます。

 1 from("file:data/inbox?recursive=true&include=.*txt$")... 

自動型コンバーター


Camelには、350を超えるコンバーターを備えたタイプ変換エンジンが組み込まれています。 バイト配列を文字列に変換するなど、変換ルールを構成する必要がなくなりました。 また、Camelに必要なコンバーターがない場合でも、いつでも自分で作成できます。 そして、最良の部分は、これらすべてがあなたの参加なしで自律的に機能することです。

Camelコンポーネントも自動型変換を使用するため、ほとんどのデータ型を受け入れて、使用可能な型に変換できます。 Camelコミュニティでは、この機能は最も人気のある機能の1つであり、なぜJavaにないのか疑問に思う人もいます。

マイクロサービスへの統合に適した軽量コア


Camelカーネルの実際の重量はごくわずかです。ライブラリのサイズは約4.9 MBで、実行時の依存関係は約1.3 MBを占有します。 そのため、Camelは、スタンドアロンアプリケーション、マイクロサービス、Webアプリケーション、Springアプリケーション、Java EE、OSGi、Spring Boot、WildFlyアプリケーション、AWS、Kubernetes、Cloud Foundryなどのクラウドプラットフォームなど、どこにでも簡単に組み込み、どこにでも展開できます。 Camelは元々、サーバーシステムやESBソリューションとしてではなく、Javaが存在する実行可能なものに埋め込むことができるものとして作成されました。

クラウドサポート


Camelはクラウドの使用に焦点を合わせているだけでなく、次のようなクラウドサービスに接続するための多くのコンポーネントも提供しています。


テストツールキット


Camelには、アプリケーションをテストするためのパッケージが含まれています。 このパッケージはCamel自体のテストにも積極的に使用され、18,000以上のユニットテストがあります。 パッケージには、たとえば、実際のエンドポイントをシミュレートしたり、アプリケーションが指定された要件を満たしているかどうかをCamelが確認できるように期待される結果を設定できる特別なコンポーネントが含まれています。

アクティブな開発コミュニティ


Camelプロジェクトには活発で活発なコミュニティがあり、この本を執筆している時点で10年以上にわたって生活と発展を続けています。 このようなコミュニティを持つことは、独自のアプリケーションを構築するためのオープンソースソフトウェアを選択する際の重要な要素です。 プロジェクトが非アクティブの場合、コミュニティのサポートに頼ることはほとんどできず、問題に直面することはできません。 そしてその逆に、開発者と一般ユーザーの両方であるキャメルなどのアクティブなプロジェクトの参加者は、いつでも支援する準備ができています。

Camelの主な機能を簡単に確認したので、次は練習に移りましょう。配布キットを入手して、いくつかの例を検討します。

はじめに


このセクションでは、Camelディストリビューションの入手方法と、その内容について簡単に説明します。 次に、Apache Mavenを使用してこの本のソースコードの例を実行する方法を示します。

配布から始めましょう。

Camelのダウンロードとインストール


CamelはApache CamelプロジェクトのWebサイトで入手できます。 そこには、すべてのバージョンのリストと、最新のCamelリリースのダウンロードリンクがあります。

この本では、Camel 2.20.1を使用します。 このバージョンを入手するには、ダウンロードページの適切なリンクを使用してください。 このページの最後には、Windows用のzipファイルとmacOS / Linux用のtar.gzという2つのディストリビューションへのリンクがあります。 目的のファイルをダウンロードし、ローカルドライブに解凍します。

コンソールを開き、Camelディストリビューションを解凍したフォルダーに移動します。 次のファイルが含まれます。

 1 [janstey @ ghost apache-camel-2.20.1] $ ls
 2 docサンプルlib LICENSE.txt NOTICE.txt README.txt


ご覧のとおり、ディストリビューションの構造はシンプルでわかりやすいものになっています。


では、この本のラクダの例に従う方法を見てみましょう。

キャメルの最初の打ち上げ


そのため、上記では、Camelディストリビューションの入手方法について説明し、その内容について簡単に説明しました。 とりわけ、あなたが勉強することをお勧めする説明と指示がある例があります。

ただし、この本では、ディストリビューションをまったく使用しません。 ここのすべてのソースコード例では、必要なすべてのCamelライブラリを自動的にダウンロードするApache Mavenを使用しています。 したがって、クラスパスに登録されることを制御する必要はありません。

この本のすべてのサンプルコードは、 GitHub Webサイトにあります。

最初に検討する例は、統合の現実、つまりファイルルーティングにおける「ハローワールド」です。 あるフォルダー(データ/受信ボックス)のファイルを読み取り、それらを特定の方法で処理し、結果を別のフォルダー(データ/送信ボックス)に書き込む必要があるとします。 簡単にするために、処理を省略します。図4に示すように、タスクはソースファイルのコピーに削減されます。 1.4。

1.4 data / inboxフォルダーからdata / outboxフォルダーにファイルをルーティングします。


簡単なところはありませんか? 以下に、Camelを使用しないピュアJavaでのこのタスクの実装を示します。

リスト1.1 Pure Javaで1つのフォルダーから別のフォルダーにファイルをルーティングする

 1 import java.io.File; 2 import java.io.FileInputStream; 3 import java.io.FileOutputStream; 4 import java.io.IOException; 5 import java.io.OutputStream; 6 7 public class FileCopier { 8 9 public static void main(String args[]) throws Exception { 10 File inboxDirectory = new File("data/inbox"); 11 File outboxDirectory = new File("data/outbox"); 12 outboxDirectory.mkdir(); 13 File[] files = inboxDirectory.listFiles(); 14 for (File source : files) { 15 if (source.isFile()) { 16 File dest = new File( 17 outboxDirectory.getPath() 18 + File.separator 19 + source.getName()); 20 copyFile(source, dest); 21 } 22 } 23 } 24 25 private static void copyFile(File source, File dest) 26 throws IOException { 27 OutputStream out = new FileOutputStream(dest); 28 byte[] buffer = new byte[(int) source.length()]; 29 FileInputStream in = new FileInputStream(source); 30 in.read(buffer); 31 try { 32 out.write(buffer); 33 } finally { 34 out.close(); 35 in.close(); 36 } 37 } 38 } 

非常に単純なタスクのように思えますが、FileCopierにはすでに37行ものコードがあります。 さらに、低レベルのファイルAPIを使用する必要がありました。そして、重要なことに、リソースを正しく閉じることを忘れないでください。 ここで、data / inboxフォルダから新しいファイルをコピーするだけでよいと想像してください。 次に、タイマーを設定し、どのファイルが既にコピーされたかを追跡する必要があります。 目の前で複雑さが増しています。

幸いなことに、今検討したような統合タスクはすでに数千回解決されています。 したがって、車輪を再発明してコードを手で書く必要はありません。 Apache Camelなどの統合フレームワークを使用して、このすべての機能がどのように実装されるかを見てみましょう。

リスト1.2 Apache Camel上のあるフォルダーから別のフォルダーへのファイルのルーティング

 1 import org.apache.camel.CamelContext; 2 import org.apache.camel.builder.RouteBuilder; 3 import org.apache.camel.impl.DefaultCamelContext; 4 5 public class FileCopierWithCamel { 6 7 public static void main(String args[]) throws Exception { 8 CamelContext context = new DefaultCamelContext(); 9 context.addRoutes(new RouteBuilder() { 10 public void configure() { 11 from("file:data/inbox?noop=true") 12 .to("file:data/outbox"); 13 } 14 }); 15 context.start(); 16 Thread.sleep(10000); 17 context.stop(); 18 } 19 } 

この例のコードのほとんどはテンプレートです。 すべてのCamelアプリケーションはCamelContextを使用します。CamelContextはその後起動し、停止します。 また、Camelアプリケーションにファイルをコピーする時間を与えるスリープメソッドを追加しました。 リスト1.2で注意すべき主なことはルートです。

Camelのルートは、読み取られるのと同じ順序で定義されます。 たとえば、上記の例のルートは次のように読み取ることができます:noopパラメーターを使用してdata / inboxフォルダーのファイル(from file)からメッセージを受信し、data / outboxフォルダーのファイル(to file)に送信します。 noopパラメーターは、ソースファイルをそのままにしておく必要があることを意味します。そうしないと、Camelがそれらを転送します。 キャメルに出会ったことがないほとんどの人は、このルートが何をするかをよく理解しているかもしれません。 また、定型コードを削除すると、タスク全体が2行のJavaコードになります。

この例を実行するには、 Apache Mavenをダウンロードしてインストールする必要があります。 準備ができたら、コンソールを開いて、このマニュアルの例のソースディレクトリにあるchapter1 / file-copyフォルダーに移動します。 その中にあります:




この本を書いているとき、Maven 3.5.0が使用されました。 Mavenの他のバージョンは、ここに示すように正確に動作しない場合があります。

POMファイルの内容を以下のリストに示します。

リスト1.3。メインCamelライブラリを使用するために必要なMaven POMファイル

 1 <project xmlns="http://maven.apache.org/POM/4.0.0" 2 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 3 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 4 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 5 <modelVersion>4.0.0</modelVersion> 6 <parent> 7 <groupId>com.camelinaction</groupId> 8 <artifactId>chapter1</artifactId> 9 <version>2.0.0</version> 10 </parent> 11 12 <artifactId>chapter1-file-copy</artifactId> 13 <name>Camel in Action 2 :: Chapter 1 :: File Copy Example</name> 14 15 <dependencies> 16 <dependency> 17 <groupId>org.apache.camel</groupId> 18 <artifactId>camel-core</artifactId> 19 </dependency> 20 <dependency> 21 <groupId>org.slf4j</groupId> 22 <artifactId>slf4j-log4j12</artifactId> 23 </dependency> 24 </dependencies> 25 </project> 

Mavenは別の大きなトピックです。ここでは、例を使用して作業できるように、最小限に触れます。

リスト1.3のMaven POMファイルは、ほとんどすべてのデフォルトPOM設定を使用するため、おそらくあなたの人生で最も短いPOMファイルの1つです。 それらに加えて、いくつかの設定は親POMで設定されます。 おそらくここで最も重要な部分は、Camelライブラリーへの依存性です。 このPOMを使用して、Mavenは次のことを行います。

  1. groupId、artifactId、およびバージョンに基づいて検索パスを作成します。 バージョン要素には、親要素によって参照されるPOMで定義されているcamel-versionプロパティがあり、これは合計で2.20.1です。 依存関係タイプは定義されていないため、JARファイルと見なされます。 したがって、検索パスはorg / apache / camel / camel-core / 2.20.1 / camel-core-2.20.1.jarになります。
  2. リスト1.3はCamelの依存関係を探す場所に関するガイダンスを提供していないため、Mavenはの中央リポジトリそれらを探します。
  3. 検索パスとリポジトリURLを組み合わせることにより、Maven はファイルダウンロードしようとします
  4. JARファイルは、通常は.m2 /リポジトリのホームディレクトリにあるローカルMavenキャッシュに保存されます。 Linux / macOSでは、これは〜/ .m2 / repositoryフォルダーで、WindowsではC:\ Users \ [Username] \。M2 \ repositoryです。
  5. リスト1.2のアプリケーションコードを実行すると、Camel JARファイルがクラスパスに追加されます。

リスト1.2の例を実行するには、chapter1 / file-copyフォルダーに移動し、次のコマンドを実行します。

 1 mvn compile exec:java


その結果、Mavenはsrcディレクトリ内のソースをコンパイルし、クラスパス内のキャメルコアJARファイルを使用してFileCopierWithCamelクラスを実行します。



Apache MavenはJAR依存関係を積極的にダウンロードするため、この本のすべての例はインターネットに接続するように設計されています。 この本のすべての例の結果としてダウンロードされるライブラリの合計サイズは、数百メガバイトになります。

chapter1 / file-copyフォルダーからMavenコマンドを実行し、完了後にdata / outboxフォルダーに移動して、ファイルがコピーされていることを確認します。 おめでとうございます、最初の例を完了しました。 はい、それは非常に簡単ですが、この本の他のほとんどすべての例を実行する方法を知っています。

</翻訳の終わり>

Source: https://habr.com/ru/post/J352188/


All Articles