Как предоставлять услуги OSGi для каждого клиента

Мы разрабатываем веб-приложение (назовем его банком изображений), для которого определили следующие потребности:

  • Приложение обслуживает клиентов, состоящих из множества пользователей.
  • Новый клиент может быть создан динамически, и клиент управляет своими пользователями.
  • У клиентов есть разные наборы функций, которые можно динамически изменять.
  • Заказчики могут разработать свои собственные функции и развернуть их.
  • Приложение является однородным и имеет текущую версию, но отмена версии для клиентов все еще может выполняться индивидуально.
  • Приложение должно управляться как единое целое, а клиенты должны совместно использовать ресурсы, которые должны легко масштабироваться.

Вопрос: Должны ли мы строить это на стандартной платформе OSGi или лучше использовать одну из новых платформ приложений (Virgo, Aries или будущий стандарт OSGi)?

Дополнительная информация и некоторые начальные мысли:

Мы создаем веб-приложение, которое, как мы предполагаем, скоро будет иметь сотни клиентов (компаний) с сотнями пользователей (сотрудников) в каждой, иначе зачем беспокоиться;). Мы хотим сделать его модульным, следовательно, OSGi. В будущем клиенты могут сами разрабатывать и добавлять компоненты к своим приложениям, поэтому нам потребуется изоляция клиентов. Мы также можем захотеть, чтобы разные клиенты получали разные наборы функций.

Каков «правильный» способ предоставить разные реализации услуг разным клиентам приложения, когда разные клиенты используют одни и те же пакеты?

Мы могли бы использовать подход «приложение-сервер» (мы рассмотрели Virgo) и загружать каждый пакет один раз для каждого клиента в его собственное «приложение». Однако это не похоже на принятие OSGi. Мы не размещаем множество приложений, 99% сервисов будут использовать один и тот же имп. для всех клиентов. Также мы хотим управлять (настраивать, контролировать и т. Д.) Приложением как единым целым.

Каждую услугу можно зарегистрировать (правильно настроить) один раз для каждого клиента вместе с некоторым свойством «токен клиента». Это немного беспорядочно, и нужно будет обрабатывать его с помощью шаблона расширения или, возможно, ManagedServiceFactory? Также перед регистрацией услуги для клиента A необходимо будет приобрести A-версию каждой из его зависимостей.

«Текущий» клиент будет известен каждому запросу и может быть привязан к потоку. Это немного беспорядок, когда нужно предоставлять токен клиента каждый раз, когда вы ищете услугу. Это затрудняет использование компонентных фреймворков, таких как blueprint. Чтобы обойти проблему, мы могли бы использовать служебные перехватчики для прокси-сервера каждого зарегистрированного типа службы и позволить прокси-серверу отправляться в нужный экземпляр в соответствии с текущим клиентом (потоком).

Начало всего нашего опыта работы с OSGi с реализации обходного пути (взлома?), Описанного выше, действительно кажется указанием на то, что мы на ложном пути. так что нам делать? Вернуться к Деве? Попробуйте что-то похожее на то, что описано выше? Что-то совсем другое ?!

пс. Спасибо, что дочитали до конца! ;)


person andreas k    schedule 07.02.2011    source источник
comment
Я отредактировал вопрос, чтобы сделать его более конкретным, чтобы было легче принять ответ, что я действительно хочу сделать! Я новичок в stackoverflow, так что извините за неуклюжесть ...   -  person andreas k    schedule 10.02.2011


Ответы (3)


У решения есть пара аспектов:

Прежде всего, вам нужно найти способ настроить различных клиентов, которые у вас есть. Здесь имеет смысл построить решение на основе ConfigurationAdmin, потому что тогда вы сможете максимально использовать существующий стандарт OSGi. Причина, по которой вы можете создать что-то поверх, заключается в том, что ConfigurationAdmin позволяет настраивать каждую отдельную службу, но вы можете добавить слой поверх, чтобы вам было удобнее настраивать все приложение (сборку пакетов) за один раз. Такая конфигурация затем может быть преобразована в индивидуальные конфигурации служб.

Добавление свойства к сервисам, реализация которых зависит от клиента, имеет большой смысл. Их можно настроить с помощью ManagedServiceFactory, и это свойство упрощает поиск службы для нужного клиента с помощью фильтра. Вы даже можете определить резервный сценарий, в котором вы будете искать либо конкретную услугу для клиента, либо общую (потому что не все услуги, вероятно, будут зависеть от клиента). Поскольку вам нужно явно добавить такие фильтры к вашим зависимостям, я бы рекомендовал взять существующее решение для управления зависимостями и расширить его для вашего конкретного варианта использования, чтобы зависимости автоматически добавляли нужные фильтры для конкретных клиентов без необходимости указывать это вручную. Я понимаю, что мне, возможно, придется остановиться здесь подробнее, просто дайте мне знать ...

Следующий вопрос: как отслеживать «контекст» клиента в вашем приложении. Традиционно здесь есть только несколько вариантов, из которых наиболее часто используется локальный контекст потока. Однако привязка потоков к клиентам имеет тенденцию ограничивать вас с точки зрения вариантов реализации, поскольку в целом это, вероятно, означает, что вы должны запретить разработчикам создавать сами потоки, а также сложно переложить определенные задачи на пулы рабочих потоков. Будет еще хуже, если вы когда-нибудь решите использовать удаленные службы, поскольку это означает, что вы полностью потеряете контекст.

Итак, для передачи идентификации клиента от одного компонента к другому я лично предпочитаю решение, в котором:

  1. Как только запрос приходит (например, в вашем HTTP-сервлете) каким-то образом определите идентификатор клиента.
  2. Явно передайте этот идентификатор по цепочке зависимостей службы.
  3. Используйте только такие решения, как использование локальных переменных потока в пределах одного пакета, если, например, вы используете стороннюю библиотеку внутри вашего пакета, которая нуждается в этом для отслеживания клиента.
person Marcel Offermans    schedule 09.02.2011
comment
Приятно читать ваш ответ, потому что он в значительной степени соответствует тому, что я думал изначально. А как насчет безопасности? Если мы продолжим путь, по которому все пакеты будут одинаковыми в стандартной структуре OSGi, не будет ли в конечном итоге очень трудно сохранить разделение? Например, мы должны действительно охранять токен службы поддержки клиентов, если он просочится, будет действительно легко получить доступ к данным других клиентов .. Пожалуйста, также развивайте свои идеи по расширению другой компонентной структуры. - person andreas k; 09.02.2011
comment
Что касается безопасности, вы, по крайней мере, должны поставить барьер для входящих HTTP-запросов. Этот аспект защиты приложения не имеет ничего общего с OSGi, вам все равно придется это делать. Второй вопрос: хотите ли вы установить определенные ограничения безопасности в рамках OSGi? В конечном итоге, если вы это сделаете, вам нужно будет использовать часть безопасности спецификации OSGi (не включена по умолчанию, например, отдельное расширение для Apache Felix). Что касается токена безопасности клиента, если вы собираетесь раскрыть его за пределами OSGi, его определенно необходимо охранять. - person Marcel Offermans; 19.02.2011
comment
Что касается расширения другой компонентной инфраструктуры (я предполагаю, что вы говорите об управлении зависимостями), я бы, например, возьму Apache Felix Dependency Manager, который использует Java API для объявления зависимостей компонентов и построит слой поверх этого. Вы можете использовать свой собственный формат XML или аннотации, или даже другой API Java, который автоматизирует большую часть создания зависимостей (например, добавляя фильтры в контекстах клиентов). Обратите внимание, что я написал этот диспетчер зависимостей, поэтому, очевидно, я предвзято. :) - person Marcel Offermans; 19.02.2011

Я уже некоторое время думал об этой же проблеме (я думаю) и хотел бы узнать ваше мнение по следующей аналогии.

Рассмотрим серию веб-приложений, в которых вы обеспечиваете контроль доступа с помощью инфраструктуры единого входа (SSO). Пользователь проходит аутентификацию один раз, используя SSO-сервер, и - когда поступает запрос - целевое веб-приложение спрашивает SSO-сервер, аутентифицирован ли пользователь (все еще), и определяет себя, авторизован ли пользователь. Информация для авторизации также может быть предоставлена ​​сервером SSO.

Теперь думайте о своих пакетах приложений как о мини-приложениях. Хотя они и не являются веб-приложениями, разве не имеет смысла иметь какой-то пакет SSO, использующий методы SSO для аутентификации и предоставления информации для авторизации? Каждый пакет приложений должен быть разработан или настроен для использования пакета SSO для проверки аутентификации (токен SSO) и проверки авторизации, запрашивая пакет SSO, разрешен ли пользователю доступ к этому пакету приложений.

Пакет SSO поддерживает своего рода репозиторий сеансов, а также предоставляет свойства пользователя, например информация для идентификации хранилища данных (некоторого вида) этого пользователя. Таким образом, вы также не будете передавать (значимый) «токен обслуживания клиентов», а скорее будете передавать загадочный токен SSO, который предоставляется и управляется пакетом SSO.

person Jan Uyttenhove    schedule 09.02.2011
comment
Да, но настоящий вопрос в том, как вы сопоставите это с моделью OSGi? Я вижу это как два региона. С одной стороны, ваши расширения фреймворка, то есть управление видимостью сервисов с помощью ServiceHooks и прокси-сервисов. А с другой стороны - связки приложений. Вы не хотите, чтобы интерфейс между этими регионами был максимально свободным и чистым OSGi. Я думал о многих решениях проблемы предоставления услуг, где в конце концов понимаю, что более или менее спроектировал свой собственный реестр услуг, и мне придется самостоятельно обрабатывать большую часть динамики. - person andreas k; 10.02.2011

Обратите внимание на то, что Virgo - это контейнер OSGi, основанный на Equinox, поэтому, если вы не хотите использовать какую-либо особенность Virgo, вам не нужно этого делать. Однако вы получите множество преимуществ, если действительно используете Virgo, даже для базового OSGi. применение. Однако это звучит так, будто вам нужна веб-поддержка, которая идет прямо из коробки с веб-сервером Virgo и избавит вас от необходимости самостоятельно собирать все вместе.

Полное раскрытие: я веду проект Девы.

person Glyn Normington    schedule 13.02.2011
comment
Вау, ты должен быть идеальным мужчиной, чтобы ответить! Возьмем, к примеру, службу поставщика данных. В модели Virgo все ее классы будут загружаться отдельно для каждого клиента, тогда как на самом деле (динамическая) конфигурация - единственное, что различается между экземплярами службы. Есть ли в Деве способ обойти это и при этом добиться разделения обслуживания экземпляров на клиентов? - person andreas k; 13.02.2011
comment
Я не думаю, что Virgo или OSGi в этом отношении заставляют вас загружать все классы отдельно для каждого клиента. Я не разработчик приложений, но я подумал бы, что вы могли бы предоставить фабрику общих услуг, а затем заставить каждого клиента создавать отдельную услугу на основе своих требований. - person Glyn Normington; 03.05.2011