2016-05-07 4 views
2

私たちは、ポートXでリッスンする埋め込みJettyサーバにデプロイされたSpringブートアプリケーションを用意しました。この既存のアプリケーションでは、ルートを定義することでApache Camelを統合します。 目標は、いくつかの他のサービスにプロキシされるラクダルートにほとんど休止するエンドポイントを移動させることではありません。ルートエンドポイントの1つとして:私は「http://localhost:Y/myapp桟橋」を使用すると、私はCamelをJettyサーバで使用する

  • 次の点を理解することができません。それは何の誤りもなく働いた。それは、キャメルが独自の桟橋のインスタンスを作成したことを意味しますか?

  • 私は「桟橋:http://localhost:X/myapp」を使用する場合 - それは、再び、私は彼らがいたとして桟橋サーバー構成の制御を維持したいとラクダを聞く聞かせアドレスXが使用中

であるというエラーを与えることなく働いていました既存の残りの終点に追加する。

+0

あなたは「既存のRESTエンドポイント」について言及しています。私はサーブレットレベルに落とさずに、既存のRESTエンドポイントをCamelと直接統合することを検討したいと考えています。 CXFRSとCXF BeanのコンポーネントをチェックアウトしてApache CXFを使ってJAX-RSを使用するのはかなり簡単ですが、既存のコントローラでCamel ProducerTemplateを使用してCamelルートにメッセージを送信することもできます。ユースケース(URLパスの幅広い範囲をリダイレクトするか、特定のURLパスのみをリダイレクトするなど)と既存のRESTエンドポイントについて詳しく説明すると役立ちます。 –

+0

お時間をいただきありがとうございます。以前は私たちのアプリケーションが単一のバックエンド(original.comと呼んでいました)と連絡を取りました。ここでいくつかの機能を抽出し、それらのためのマイクロサービスを作成しました。つまり、original.com/moved-context-pathを新しいバックエンドnew.com/moved-context-pathにリダイレクトする必要があります。選択したREST API – DanglingPointer

+0

のプロキシとしてApache Camelを使用してデプロイしたいと思います。同じアプリケーションにいくつかのRESTサービス実装(これまでに抽出されていないもの)と外部RESTサービスへのリダイレクト(新しいキャメルルート)。あなたは残りのRESTサービスを公開するために何を使用しますか? JAX-RS(そうなら、それはCXFですか?)、spring-mvc、Restlet、多分何か?また、 'original.com/foo/*'のようなパスや 'original.com/foo/bar1'や' original.com/foo/bar2'のような特定のパスだけを盲目的にリダイレクトしたいのですか? –

答えて

1

キャメルはあなたが期待している方法で「既存の」エンドポイントを聞きません。スキーム指示されたコンポーネントを使用してそれ自身を作成する。 Jettyエンドポイント(つまり「jetty:...」)を作成しました。そのため、CamelはCamel Jettyコンポーネントをスピンアップして、そのエンドポイントでHTTPリクエストを処理します。

Camelをリダイレクトするプロキシとして使用する場合(ネットワークロードバランサを使用する方が簡単な場合)、Camelのルートをに変更して既存のエンドポイントをに置き換えて新しいエンドポイント。 from( "jetty:http://oldendpoint.com") .to( "jetty:http://newendpoint.com");

2

リダイレクトする必要があるすべてのパスに一致するサーブレットマッピングを設定できる場合(たとえば、foo/*のようなパスは常にリダイレクトされます)、非常に簡単です。これで問題が解決しない場合は、後で回答を編集しようとします。

公式ドキュメントの関連ページis here。サーブレットコンテナ(Jetty)を既に設定して実行しているので、興味深い例はservlet componentを使用した例です。

まず、Camelサーブレットを設定する必要があります。既存のサーブレットの構成方法によって異なります。あなたが持っていると、とにかく

@Bean 
public ServletRegistrationBean servletRegistrationBean() { 
    CamelHttpTransportServlet servlet = new CamelHttpTransportServlet("CamelServlet"); 
    servlet.setServletName(); 
    return new ServletRegistrationBean(servlet,"/foo/*"); 
} 

:例えば、web.xmlファイルを使用して、追加:あなたは春ブートを使用している場合は、

<servlet> 
    <servlet-name>CamelServlet</servlet-name> 
    <servlet-class>org.apache.camel.component.servlet.CamelHttpTransportServlet</servlet-class> 
    <load-on-startup>1</load-on-startup> 
</servlet> 

<servlet-mapping> 
    <servlet-name>CamelServlet</servlet-name> 
    <url-pattern>/foo/*</url-pattern> 
</servlet-mapping> 

をそれとも、あなただけの、次のBeanを登録することができますあなたのJettyのインスタンスに登録キャメルサーブレットは、あなたは、サーブレット・コンポーネントを使用して、すべてをリダイレクトすることができます。

from("servlet:foo?matchOnUriPrefix=true") 
.to("http4://new.com/foo?bridgeEndpoint=true&throwExceptionOnFailure=false"); 
  • http4はです、Apache HTTPClient 4.xに基づいています。 (必要に応じて、HTTPClient 3.xで引き続きHTTP componentベースを使用できます)。
  • matchOnUriPrefix=trueは、ワイルドカード
  • bridgeEndpoint=trueたちは
  • throwExceptionOnFailure=falseがちょうどキャメルによって処理されず、呼び出し側に中継されますnewサーバから返されたエラーを意味し、プロキシとして動作していることと一致します。

http://old.com/foo/some/crazy/path/i/just/made/upへの要求は(単に最初の発信者に転送されるnew.comサーバーから404エラーで、おそらく結果)http://new.com/foo/some/crazy/path/i/just/made/upにリダイレクトされるべきです。

関連する問題