ServiceMixCamelおよびRabbitMQに基づく統合プラットフォヌムの構築経隓

デヌタを亀換する必芁のある少なくずも2぀の情報システムが䌚瀟に珟れるずすぐに、盞互䜜甚を敎理する方法の問題が生じたす。 倚くのオプションがありたすファむル亀換、デヌタベヌス間のリンク、りェブたたは残りのサヌビス、さたざたなメッセヌゞングシステム、叀いRPCずCORBA、最新のgRPCなど。 遞択は、プロゞェクト参加者の奜みずシステムの機胜システムアヌキテクチャ、䜿甚するプラットフォヌム、既補のAPIの可甚性などに䟝存したす。 䜕らかの亀換を遞択するず、システムが盞互䜜甚し始め、すべおがうたくいくず仮定したす。 しかし、その埌、3番目のシステムが発生し、これに統合する必芁もあり、4番目などが続きたす。 すでに䜿甚されおいる技術に自分自身を制限するこずはできないずいう事実ではなく、再び座っお亀換の方法を遞択する必芁がありたす新しいシステムの制限により、どこかで開発者が別の技術を䞻匵したか、䜕か新しいこずを詊しおみたかった。 システムの数が増えるず、システム間の盞互䜜甚の数ず耇雑さが増し、䜿甚されるテクノロゞヌの数が増えたす。 その結果、䌚瀟の統合アヌキテクチャ党䜓が、色や糞のも぀れたボヌルのようになり始め、䌚瀟のシステムを䜕らかの圢でリンクしたす。 遅かれ早かれ、すべおのシステムを透過的か぀拡匵可胜にリンクする単䞀の統合環境を䜜成するこずが考えられ始めおいたす。



この蚘事では、Apache ServiceMixCamelずRabbitMQを䜿甚しおこのような統合環境を構築した経隓に぀いお説明したす。



技術スタック



うさぎ



RabbitMQは、AMQPプロトコルに基づくメッセヌゞングシステムです。 システムの詳现は説明したせん。Habréには、システムの機胜を詳现に説明する蚘事が既にいく぀かありたす。RabbitMQの䜿甚堎所ず䜿甚方法に぀いお説明したす。







RabbitMQを通じお、䌚瀟の情報システムずデヌタを亀換したす。 各システムに察しお䞀連のキュヌが䜜成されたす。 たずえば、䌚蚈システムで顧客の怜玢を名前ず生幎月日で敎理する必芁がありたす。 いく぀かのキュヌを䜜成したす。 䌚蚈システムに関しおは、クラむアントの名前ず生幎月日を瀺すリク゚ストを送信したす。 アカりンティングシステムは着信キュヌをリッスンし、着信芁求を凊理したす。 2぀目は発信です。アカりンティングシステムは、芁求の条件に䞀臎するクラむアントのリストを含む応答を送信したす。



䟿利な理由





RabbitMQず察話するようにシステムを教えるこずは難しくありたせん。 RabbitMQには、さたざたなプラットフォヌムJava、.Net、Pythonなど甚の既補のクラむアントがありたす。 クラむアントはシンプルで簡単です。 キュヌからメッセヌゞを読み取り、および/たたはキュヌにメッセヌゞを送信するコヌドは、数行かかりたす。 すべおのシステムがRabbitMQず友達になれるわけではないこずは明らかです。たずえば、レガシヌシステムやボックス化されたシステムの堎合、これは困難です。 この堎合、亀換は、これらのシステムをサポヌトするテクノロゞヌを䜿甚しお構築されたす。デヌタベヌスのストアドプロシヌゞャを呌び出す堎所、Webサヌビスず䌑憩サヌビスを䜿甚する堎所、他の堎所です。 他の倚くの統合タスクのためにこのような察話を敎理するために、Apache ServiceMix補品が䜿甚されたす。



Apache ServiceMix

ServiceMix-さたざたな統合の問題を解決するのに圹立぀事前定矩されたバンドルのセットを持぀Karafコンテナヌ。







補品に含たれるものに぀いおもう少し詳しく



  1. 実際には、バンドルが機胜し、それらを管理できるKarafコンテナ自䜓むンストヌル/アンむンストヌル/停止/開始、ログの衚瀺、コンポヌネントの䟝存関係の確認など。
  2. 怜蚌、さたざたな倉換JSONからXMLぞの倉換、XSLTを䜿甚した倉換など、匷化、ルヌティング、分割ず結合、監芖、統合プロセスの実行など、叀兞的な統合機胜を実行する幅広いバンドル。 。
  3. 幅広い皮類のアダプタヌファむルアダプタヌ、WebおよびRESTサヌビス甚アダプタヌ、JMS、RabbitMQ、Kafkaなど。 アダプタヌの完党なリストは、Camel Webサむトにありたす。


事前にむンストヌルされたバンドルのみを䜿甚するこずに限定されるこずはほずんどありたせんが、むンストヌルされたセットを起動するには十分なはずです。 なぜなら 私たちはKarafコンテナを䜿甚しおいるため、必芁なバンドルをむンストヌルできたす。これは、機胜バンドルセットをむンストヌルするか、個々のバンドルをむンストヌルするだけで実行できたす。 もちろん、独自のバンドルを䜜成するこずも、サヌドパヌティのJavaラむブラリをバンドルにラップするこずもできたす。



アパッチキャメル



ServiceMixの䞻芁なコンポヌネントはApache Camelフレヌムワヌクです。これにより、Camel甚語でルヌトず呌ばれる統合プロセスを構築できたす。

䟋を瀺したしょう-ルヌトずは䜕ですか







これは、受信するマルチフォヌマットメッセヌゞを共通の出力フォヌマットに倉換する単玔なルヌトの䟋です。 メッセヌゞの圢匏に応じお、ルヌトはメッセヌゞを適切な倉換にルヌティングしたす。倉換は、メッセヌゞを共通の圢匏に倉換し、結果を出力に送信したす。



Camelは、ルヌト、最も䞀般的なJava DSLおよびSpring XMLの蚘述のためのさたざたな衚蚘法をサポヌトしおいたす。 Spring XMLを䜿甚したす。 Spring XML衚蚘では、画像のルヌトは次のようになりたす。



<route id="Normalizer"> <from uri=" endpoint" /> <!--           --> <choice> <when> <xpath>/*[local-name()='Format_1']</xpath> <to uri="xslt:classpath:xslt/Format_1_Transformation.xslt" /> </when> <when> <xpath>/*[local-name()='Format_2']</xpath> <to uri="xslt:classpath:xslt/Format_2_Transformation.xslt" /> </when> <when> <xpath>/*[local-name()='Format_3']</xpath> <to uri="xslt:classpath:xslt/Format_3_Transformation.xslt" /> </when> </choice> <to uri=" endpoint" /> </route>
      
      





非垞に玠晎らしい远加機胜は、CamelがSpringず完党に統合されおいるこずです。 Beanを定矩する䜿い慣れたSpring XMLを䜿甚し、同じSpring XMLでCamelルヌトを定矩できたす。 同時に、ビンはルヌトから呌び出すこずができ、ルヌトはビンから呌び出すこずができたす。 ルヌトからのビンの呌び出しはCamel固有の柔軟性で実装され、メッセヌゞ本文をBeanメ゜ッドに枡すか、ヘッダヌ+本文を枡すこずができたす。たたは、XPATH匏で指定された特定のXMLメッセヌゞタグの倀のみを枡すこずができたす。ルヌト。 そしお、これらはすべお実質的に1行にたずめられおいたす。



キャメルスタむルの゚レガンスの䟋を次に瀺したす。



 <camel:camelContext> <route id="Bean method invocation"> <from uri=" endpoint" /> <when> <simple>${bean:authManager?method=checkToken(${body})}</simple> <to uri=" " /> </when> </route> </camel:camelContext> <bean id="authManager" class="pachage.AuthManager" />
      
      





 public class AuthManager { public boolean checkToken(@Body Document xml, @XPath("/Root/Token/@Value") String token) { return checkSessionToken(token); } }
      
      





Camelのもう1぀の重芁な抂念は、゚ンドポむント以降、゚ンドポむントです。 ルヌトぱンドポむントからメッセヌゞを読み取り、゚ンドポむントにメッセヌゞを送信できたす。 ゚ンドポむントは、たずえば、RabbitMQキュヌ、ディレクトリ内のファむル、公開された䌑憩サヌビスなどです。 ルヌトが゚ンドポむントを読み取る堎合、メッセヌゞがその゚ンドポむントに到着するず、ルヌトはそれを凊理し始めたす。 これにより、ルヌトを公開できたす。 倖郚システムにアクセスする機胜を提䟛したす。 たずえば、アンケヌトに入力されたデヌタの正確性を確認するなど、タスクを実行するルヌトがある堎合は、それをWebサヌビスずしお公開するか、JMSを介しおアクセスできるようにするか、倖郚に䞡方を行うこずができたすシステムは、ルヌトの機胜を利甚できたす。Webサヌビスぞの呌び出しを介したものず、JMSキュヌを介したメッセヌゞングを介したものがありたす。



ルヌトが盞互にやり取りできるように、゚ンドポむントも䜿甚されたす。 あるルヌトは、別のルヌトが読み取る゚ンドポむントにメッセヌゞを送信し、凊理のためにメッセヌゞを枡すこずができたす。 これにより、アプリケヌションのさたざたな堎所で芁求されるさたざたな機胜を実装するルヌトの独自のパレットを䜜成できたす。 たずえば、ログメッセヌゞ。 毎回同じ䞀連のログアクションを実行する代わりに、特別に蚭蚈されたルヌトにメッセヌゞ凊理を単玔に転送できたす。



統合アヌキテクチャ



圓瀟は倚くの情報システムを䜿甚しおいたす。 システムがデヌタを亀換するための統合環境を線成するには、たずシステムを統合プラットフォヌムに接続する必芁がありたす。 このため、ServiceMix䞊の各システムに察しおアダプタヌが開発されおおり、システムずのデヌタ亀換およびデヌタ圢匏の倉換を担圓したす。





システムごずに、システムずServiceMixの間で1぀のデヌタ亀換テクノロゞヌが遞択されたす。 耇数遞択できたすが、これによりシステム偎ずServiceMix偎の䞡方で実装が耇雑になりたす。 䞀般的な堎合、いく぀かの異なる技術の䜿甚は正圓化されたせんが、技術的に実装するこずができたす。 システムずの亀換には䞻にRabbitMQを䜿甚したすServiceMixが統合システムずメッセヌゞを亀換するキュヌのセットを䜜成したす。 ただし、ServiceMixの䞀郚である既補のアダプタヌのセットが本圓に圹立぀堎合がありたす。 たずえば、䌚蚈システムの堎合、デヌタベヌス内のストアドプロシヌゞャを䜿甚したす。 ストアドプロシヌゞャを呌び出すには、MyBatisコンポヌネントを䜿甚したす。これにより、ServiceMixを経由するメッセヌゞをストアドプロシヌゞャパラメヌタにマップできたす。 以䞋に、IDによるナヌザヌぞのログむンのむンストヌルのマッピングの䟋を瀺したす。



 <select id="setLogin" statementType="CALLABLE" parameterType="java.util.Map"> {call esb.SetLogin ( @UserId=#{UserId, mode=IN}, @LoginId=#{LoginId, mode=IN} )} </select>
      
      





アダプタは、システムが統合プラットフォヌムず察話する圢匏を内郚圢匏に倉換する圹割も果たしたす。 誰かが独自のXML圢匏を䜿甚するJSON圢匏での亀換を奜む人もいたすが、統合プラットフォヌム内では、コンポヌネントは内郚暙準XML圢匏でデヌタを亀換したす。 珟圚、XMLは、その重さず、JSON、Protobufなどの新しい代替手段により人気を倱っおいたす。 しかし、私の意芋では、XMLは䟝然ずしお統合の問題を解決するのに䟿利です。 XSLTやXPATHなど、生掻を倧幅に簡玠化する倚くの䟿利なテクノロゞヌがありたすが、完党に人間が読むこずができたす。



コンポヌネントアダプタヌ間のメッセヌゞルヌティングは、ルヌティングルヌルに基づいおいたす。 統合プラットフォヌムの1぀のコンポヌネント内のルヌトは、Camelの内郚゚ンドポむント盎接、sedaを介しお盞互䜜甚したす。 盞互間で、コンポヌネントはRabbitMQキュヌを介しお亀換したす。 これにより、統合プラットフォヌムのコンポヌネントを独立させるこずができたす。 1぀のコンポヌネントが萜ちおも、他のコンポヌネントのパフォヌマンスには圱響したせん。 負荷が䞀時的に増加するず、メッセヌゞはコンポヌネントキュヌに蓄積され、残りの亀換には圱響したせん。







このようなアヌキテクチャが、ポむントツヌポむントベヌスのシステム間の盎接的な察話よりも優れおいる理由





耐障害性







RabbitMQレベルでのフェヌルオヌバヌは、クラスタヌを䜜成し、キュヌを同期するこずにより実珟されたす。 RabbitMQノヌドの1぀でキュヌに入る各メッセヌゞは、同期ポリシヌに埓っお他のノヌドに耇補されたすクラスタヌのすべおのノヌドに耇補できたす。特定の数のノヌドに耇補できたすが、たったく耇補できたせん。 すべおのノヌドに察しおメッセヌゞレプリケヌションを備えた3ノヌド構成を䜿甚したす。 これにより、3぀のノヌドのうち2぀が萜ちた堎合にクラスタヌの完党な操䜜性を維持できたす。 ただし、これは各メッセヌゞの凊理時間ず占有ディスク容量の点で最もコストのかかるオプションでもあるこずを理解する必芁がありたす。 3぀のノヌドはすべおクラむアント䞊でRabbitMQに登録されたすが、接続はノヌドの1぀ず開きたすが、接続が切断された堎合、クラむアントは透過的に他のノヌドに切り替えお動䜜し続けたす。



ServiceMixのフォヌルトトレランスは、2぀のServiceMixノヌドのクラスタヌを䜿甚しお実珟されたす。 同時に、これが蚱容される堎合、バンドルの䞀郚は䞊行しお動䜜したす。 たずえば、1぀のRabbitMQキュヌを読み取るアダプタヌは、䞊行しお実行できたす。そのうちの1぀だけが垞に1぀のメッセヌゞを受信したすが、同時にメッセヌゞは2぀のノヌド間で均等に分散されたす。 ノヌドの1぀が萜䞋した堎合、2番目のノヌドが党負荷を匕き受けたす。 䞀郚のバンドルは1぀のノヌドでのみアクティブになりたすが、フォヌルダりンするず、2番目のノヌドでバンドルがアクティブになりたす。 たずえば、アダプタが共有ネットワヌクディレクトリを読み取る堎合、同じファむルを同時に読み取るず、耇補ず衝突が発生する可胜性がありたす。 この動䜜モヌドは、Hazelcastに基づく共有ロックを䜿甚しお実珟されたす。 最初にロックをキャプチャしたバンドルはアクティブモヌドになり、その機胜を実行し、2番目のバンドルはロックが解陀されるのを埅っおハングしたす。



ハロヌワヌルド



結論ずしお、ServiceMixで実行するCamelのHello worldアプリケヌションの簡単な䟋を挙げたいず思いたす。 アプリケヌションは、バンドルの開始時バンドルのデプロむ時やServiceMixの再起動時などにServiceMixログに「Hello world」ずいうフレヌズを1回曞き蟌むだけです。



  1. ServiceMixディストリビュヌションをダりンロヌドし、servicemix.shbatを解凍しお実行したす。
  2. 新しいMavenプロゞェクトを䜜成しお構成したす。

    src / main / resourcesで、springサブディレクトリを䜜成するMETA-INFディレクトリを䜜成する必芁がありたす。

    なぜなら バンドルをビルドする必芁がありたす-pom.xmlを線集したすパッケヌゞ化ずビルドの手順を远加



     <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>HelloWorld</groupId> <artifactId>HelloWorld</artifactId> <version>1.0.0-SNAPSHOT</version> <name>HelloWorld</name> <description>HelloWorld</description> <packaging>bundle</packaging> <build> <plugins> <plugin> <groupId>org.apache.felix</groupId> <artifactId>maven-bundle-plugin</artifactId> <version>3.0.1</version> <extensions>true</extensions> <configuration> <instructions> <Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName> <Import-Package>*</Import-Package> <Export-Package>${project.groupId};version=${project.version}</Export-Package> </instructions> </configuration> </plugin> </plugins> </build> </project>
          
          





    Mavenの䟝存関係を远加する必芁はありたせん。

  3. Camelコンテキストずルヌトを構成したす。

    springディレクトリでcamel-context.xmlファむルを䜜成する必芁がありたすロヌダヌはMETA-INF / springでCamelコンテキスト蚘述ファむルを自動的に怜玢し、ルヌトを開始したす。 camel-context.xmlファむルに、次のコンテンツを挿入したすテキストに沿っおコメントが衚瀺されたす。



     <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:osgi="http://www.springframework.org/schema/osgi" xmlns:camel="http://camel.apache.org/schema/spring" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd http://www.springframework.org/schema/osgi http://www.springframework.org/schema/osgi/spring-osgi.xsd http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd"> <!--  Camel  --> <camel:camelContext xmlns="http://camel.apache.org/schema/spring" id="HelloWorldContext"> <!--   --> <route id="HelloWorldRoute"> <!--          --> <from uri="timer://startTimer?repeatCount=1" /> <!--      Hello world --> <setBody> <constant>Hello world</constant> </setBody> <!--      --> <log message="${body}"/> </route> </camel:camelContext> </beans>
          
          





    ルヌトがタスクを完了する「Hello world」ずいうテキストを蚘録するために、メッセヌゞを送信する必芁がありたす。 この堎合、このタスクはtimer <from uri = "timer// startTimerRepeatCount = 1" />によっお解決されたす。これは、 repeatCount = 1呜什に続いお、ルヌト入力にメッセヌゞを1回送信したす。 なぜなら タむマヌは空のメッセヌゞをルヌト入力に送信したす。それを䜕かで埋める必芁がありたす-メッセヌゞ本文に「Hello world」 <setBody>ずいうテキストを入れたす。 ルヌトの最埌で、メッセヌゞ本文の内容をログ<log message = "$ {body}">に衚瀺したす。

  4. プロゞェクトをたずめる  mvnパッケヌゞ
  5. 展開されたバンドル。

    ServiceMixでバンドルを展開する1぀の方法は、jarファむルをdeployディレクトリにコピヌするこずです。 組み立おたjarをServiceMix / deployディレクトリにコピヌしたす。


ServiceMixログを芋おください ServiceMix / data / log / servicemix.log 新しいバンドルをむンストヌルしお起動した情報に加えお、「Hello world」ずいう碑文が衚瀺されたす。



HelloWorldRoute | 43-org.apache.camel.camel-core-2.16.3 | ハロヌワヌルド



sshコン゜ヌルにログむンしお、コンテキストリストコンテキストのキャメルリストずルヌトリストルヌトのリストを衚瀺しおみおください。 コマンドの出力には、HelloWorldContextずHelloWorldRouteがありたす。



結論



結論ずしお、ServiceMixずCamelは統合゜リュヌションを構築するための優れた補品であるず蚀いたいず思いたす。 ほずんどすべおのタスクで、゚レガントでシンプルな゜リュヌションが芋぀かりたす。 補品は非垞によく考えられおおり、開発者は本圓に䞀生懞呜働いおいるこずがわかりたす。 圓瀟のServiceMixは2幎間䜿甚されおおり、珟時点では玄16の情報システムを統合し、150以䞊の統合サヌビスを開発しおいたす。 䞀郚のコンポヌネントにはただ問題がありたしたが、垞に同様のコンポヌネントがあり、そこから遞択したり、極端な堎合には独自のコンポヌネントを開発したりできたす。 䞀般的に、補品は安定しお確実に動䜜したす。個人的には、私の印象は最もポゞティブです。 玛れもない利点は、゜ヌスコヌドのオヌプン性ずラむセンスを賌入する必芁がないこずです。 さらに、これらの補品は、商業的な同等品より絶察に劣っおいたせん。 たた、ServiceMixずCamelは、統合の問題を解決するためだけでなく䜿甚できるこずにも泚意しおください。 たずえば、KarafはWebアプリケヌションを展開するのに最適です。 この機䌚を利甚しお、管理者が統合プラットフォヌムを構成するためのWebむンタヌフェむスを提䟛したす。 Camelは、さたざたなビゞネスコンポヌネントずシヌムレスに統合したす。 たずえば、Droolsビゞネスルヌル゚ンゞンを䜿甚しお、特定のルヌルポヌトフォリオを䜿甚したトランザクション匷化に埓っお着信トランザクションを適切なポヌトフォリオに割り圓おたす。これはミドルオフィスのナヌザヌによっお構成されたす。 非垞に興味深い補品はActivitiBPM゚ンゞンです。これはKarafコンテナヌで動䜜し、Camelず統合できたす。 これにより、統合ずビゞネス機胜を組み合わせた非垞に興味深い゜リュヌションを䜜成できたす。



All Articles