2011-02-07 5 views
7

あたりOSGiサービスへ:どのように提供私たちは、次のニーズを特定しているため私たちは、(イメージバンクそれを呼び出すことができます)は、Webアプリケーションを開発しているクライアント

  • アプリケーションがのセットで構成され、顧客の食料調達をユーザー。
  • 新規顧客
  • を動的に作成することができ、顧客はそれが
  • お客様が独自の機能を開発し、それらを展開することができ、動的に
  • お客様を変更することができますさまざまな機能セットを持つユーザーです管理します。
  • アプリケーションは同種で現在のバージョンですが、顧客のバージョンリフトは引き続き個別に処理できます。
  • アプリケーションは全体として管理する必要があり、顧客は拡張しやすいリソースを共有する必要があります。

質問:は、我々は標準OSGiフレームワーク上でこれを構築すべきか、私たちは新興のアプリケーションフレームワーク(乙女座、牡羊座や次期のOSGi標準)のいずれかを使用する方が良いでしょうか?

詳しい背景や、いくつかの初期の考え:

我々はすぐに、ユーザーごと(従業員)の何百もの顧客(企業)の数百を持っています思い描くウェブアプリを構築しているが、そうでない場合は、なぜわざわざ;)。 OSGiをモジュール化したいのです。将来、顧客自身がアプリケーションにコンポーネントを開発してプラグインして、顧客を分離する必要があります。また、異なる顧客が異なる機能セットを得ることを望むかもしれない。

異なるクライアントが同じバンドルを共有しているときに、異なるサービス実装をアプリケーションの異なるクライアントに提供する "正しい"方法は何ですか?

app-serverアプローチ(私たちはVirgoを見てきました)を使用して、各バンドルを顧客ごとに一度自分の「app」にロードできます。しかし、OSGiを採用する気がしません。私たちは多数のアプリケーションをホストしていません。サービスの99%は同じインプリメントを共有します。すべてのお客様に。また、アプリケーションを管理(構成、監視など)したいと考えています。

各サービスは、顧客ごとに1回、「顧客トークン」プロパティと共に登録(適切に構成)することができます。それはちょっと面倒ですし、エクステンダーパターンやManagedServiceFactoryで処理する必要がありますか?また、顧客Aのサービスを登録する前に、それぞれの依存関係のAバージョンを取得する必要があります。

「現在の」顧客は各要求に知られており、スレッドにバインドすることができます。サービスを検索するたびに顧客トークンを提供しなければならないのはちょっと難しいことです。それは青写真のようなコンポーネントフレームワークを使用するのを難しくします。この問題を回避するために、サービスフックを使用して登録済みの各サービスタイプをプロキシし、現在の顧客(スレッド)に応じて適切なインスタンスにプロキシをディスパッチさせることができます。

上記の回避策(ハック?)を実装して私たちのOSGi全体の経験を始めることは、私たちが間違った方向にいることを実際に感じるように感じます。だから何をすべきか?乙女座に戻る?上に概説したものと同様のものを試してみてください。何か全く違う?

ps。ここまで読んでくれてありがとう!;)溶液への側面がいくつかあります

+0

私はそれがより具体的な作るために、質問を編集したので、私が本当にやりたいの答えを、受け入れることを容易にする必要があります!私はかなりstackoverflowに新しいので、少し不器用であるために私を失礼に... –

答えて

5

:すべての

まず、あなたが持っているさまざまな顧客を設定する方法を見つける必要があります。既存のOSGi標準を可能な限り活用できるため、ConfigurationAdminの上にソリューションを構築することは理にかなっています。何かの上にビルドしたい理由は、ConfigurationAdminでは個々のサービスを個別に設定することができますが、一番上にレイヤーを追加して、アプリケーション全体(バンドルのアセンブリ)を一度に簡単に設定できるからです。このような構成は、サービスの個々の構成に変換できます。

カスタマ固有の実装を持つサービスにプロパティを追加することは意味があります。 ManagedServiceFactoryを使用してそれらを設定することができます。このプロパティを使用すると、フィルタを使用して適切な顧客のサービスを簡単に検索できます。顧客固有のサービスを探すフォールバックシナリオを定義することもできます(すべてのサービスが顧客固有のものではないため)。このようなフィルタを依存関係に明示的に追加する必要があるので、既存の依存関係管理ソリューションを使用して特定のユースケースに拡張することをお勧めします。私はここでもっと詳しく説明しなければならないかもしれないことを理解しています。

次の質問は、アプリケーション内の顧客の "コンテキスト"を追跡する方法です。伝統的にここにはいくつかのオプションがあり、スレッドローカルコンテキストが最もよく使用されています。しかし、一般的に、開発者がスレッド自体を作成することを禁止する必要があり、特定のタスクをワーカースレッドのプールにオフロードすることは難しいことを意味するので、実装オプションの観点からスレッドを顧客にバインドする傾向があります。それはあなたが完全にコンテキストを失うことを意味するので、リモートサービスを使用することを決定した場合、さらに悪化します。

だから、別のコンポーネントから、顧客の識別に渡すために、私は個人的に解決策を好む場所:

  1. とすぐにリクエストが(あなたのHTTPサーブレットの例のために)入って来て何とか顧客を決定ID。
  2. 明示的にそのIDをサービスの依存関係のチェーンに渡します。
  3. たとえば、バンドル内にサードパーティのライブラリを使用して顧客を追跡する必要がある場合など、単一のバンドルの境界内でスレッドローカルを使用するようなソリューションを使用します。
+0

それは私が元々考えていたものとほぼ並んでいるので、あなたの答えを読むことはいいです。 しかし、セキュリティはどうですか?私たちが標準的なOSGiフレームワークと同等のすべてのバンドルの道を続けるならば、分離を維持することは結局は非常に難しくありませんか?例えば、私たちは本当に "顧客サービストークン"を漏らしてしまった場合、他の顧客データにアクセスするのは本当に簡単です。 別のコンポーネントフレームワークの拡張についてのアイデアも開発してください。 –

+1

セキュリティに関しては、少なくとも、着信HTTP要求に対する障壁を設ける必要があります。アプリケーションを保護するという側面は、OSGiとほとんど関係がありません。とにかくそれをやる必要があります。 2番目の質問は、OSGiフレームワーク内で特定のセキュリティ制約を適用するかどうかです。最終的には、OSGi仕様のセキュリティー部分を使用する必要があります(デフォルトでは有効ではありません。例えば、Apache Felixの別の拡張機能など)。顧客のセキュリティトークンに関して、OSGiの外部に公開しようとするものなら、確実に守る必要があります。 –

+1

別のコンポーネントフレームワーク(私はあなたが依存関係管理の話をしていると仮定しています)私は、たとえばコンポーネントの依存関係を宣言するためのJava APIを使用してApacheのフェリックス依存性マネージャを取り、その上に層を建設するの延長について。独自のXML形式、注釈、または依存関係生成の多くを自動化する別のJava API(たとえば、顧客コンテキストでのフィルタの追加)を使用することもできます。その依存マネージャーを書いたので、明らかに私は偏っています。 :) –

1

私はこの同じ問題について考えていましたが(私は考えています)、次のアナロジーについてあなたの意見を聞きたいと思います。

シングルサインオン(SSO)インフラストラクチャを使用してアクセス制御を提供する一連のWebアプリケーションを検討してください。ユーザーはSSOサーバーを使用して一度認証し、要求が到着するとSSOサーバーにユーザーが(まだ)認証されているかどうかを確認し、ユーザーが承認されていればそれを判断します。認可情報は、SSOサーバーによっても提供される場合があります。

あなたのアプリケーションバンドルは、ミニアプリケーションと考えることができます。 Webアプリケーションではありませんが、SSO技術を使用して認証を行い、認証情報を提供するために何らかの種類のSSOバンドルを使用することは、まだ意味がありませんか?すべてのアプリケーションバンドルは、SSOバンドルを使用して認証(SSOトークン)を検証し、SSOバンドルにこのアプリケーションバンドルにアクセスすることが許可されているかどうかを確認することによって承認を検証するように開発または構成する必要があります。

SSO束は、例えば、セッション・リポジトリのいくつかの並べ替えを維持し、また、ユーザのプロパティを提供このユーザーの(何らかの種類の)データリポジトリを識別するための情報。このようにして、(意味のある)「顧客サービストークン」をトラフとして渡すのではなく、むしろSSOバンドルによって供給および管理される秘密のSSOトークンを渡すことになります。

+0

はい、実際の質問は、これをOSGiモデルにどのようにマップしているかです。私はそれを2つの地域と見る。一方では、フレームワークの拡張、つまりServiceHooksとプロキシサービスによるサービスの可視性の制御。そして、反対側にはアプリケーションバンドルがあります。あなたは、これらの地域間のインターフェースを、妨げられないように、そして可能な限りクリーンなOSGiにすることを望んでいません。私は最終的に自分のサービスレジストリを多かれ少なかれ設計しており、多くのダイナミクスを自分自身で処理しなければならない "サービスプロビジョニング"問題に対する多くのソリューションを考えました。 –

1

乙女座は春分に基づいたOSGiコンテナではないということなので、あなたには、いくつかの乙女座特有の機能を使用したくない場合は、あなたがする必要はありませんしてください。しかし、基本的なOSGiアプリケーションであっても、Virgoを使用する場合は、benefitsがたくさんあります。しかし、Virgo Webサーバーの箱から出てきたWebサポートが必要なのと同じように聞こえて、あなた自身でそれを共に抱くという手間を省くことができます。

全開示:私は乙女座のプロジェクトをリードしています。

+0

うわー、あなたは完璧な人になるはずです!たとえば、データプロバイダサービスを利用します。 Virgoモデルでは、実際の(動的な)構成がサービスインスタンス間で異なる唯一のものであるとき、すべてのクラスは各顧客ごとに個別にロードされます。乙女座を迂回し、依然としてサービス**インスタンス**の顧客分離を得る方法はありますか? –

+0

私はVirgo、つまりOSGiは、各顧客ごとにすべてのクラスを個別にロードするようには思っていません。私はアプリケーション開発者ではありませんが、一般的なサービスファクトリを提供し、各顧客にそれぞれの要件に基づいて別々のサービスをインスタンス化させることができると思いました。 –

関連する問題

 関連する問題