Свяжите разных поставщиков и потребителей с одним потребителем, используя OSGI - PullRequest
1 голос
/ 26 марта 2020

Я пытаюсь создать приложение погоды, используя OSGI framewrok. Я создал поисковик по стране с потребителем и поставщиком, и городской поисковик с потребителем и поставщиком, и, наконец, поставщик погоды и потребитель.

  1. В потребителе страны я разрешаю пользователю проверять, доступна ли страна для проверки погоды.
  2. В потребителе города я разрешаю пользователю проверять, доступен ли город проверьте погоду в провайдере города. Я использовал страну хеш-карты в качестве ключа и город в качестве значения.
  3. В пакете погоды после запуска потребителя я хочу, чтобы пользователь мог ввести город, и страна должна проверить с помощью созданного выше набора стран и, если есть страна, затем пользователю нужно будет ввести город, следует проверить город с помощью набора городов, и, если такой город существует, наконец, поставщик погоды должен использовать это город и укажите данные о погоде.

Я не могу понять, как связать комплект погоды с комплектами как страны, так и города

Ответы [ 2 ]

2 голосов
/ 26 марта 2020

Я думаю, что ключевое понимание - сплоченность . В вашем описании, ваше смешивание очень разные аспекты вашего приложения . Т.е. вы смешиваете взаимодействие пользователя (я хочу пользователя ..) с низкоуровневыми механическими деталями поиска информации c.

Основная идея OSGi состоит в том, чтобы разделить эти части на сервисы . Служба предоставляет низкоуровневую функцию , которая обладает высокой связностью. Т.е. он делает одну вещь и только одну вещь. Если вы посмотрите на службу Event Admin, вы увидите, что она публикует sh и подписывается. Идея состоит в том, что вы получаете разные сервисы, которые хорошо выполняют свою работу и не имеют никакого отношения (или связи) с другими сервисами. Эта стратегия позволяет повторно использовать их во многих различных приложениях. В тот момент, когда вы ослабите сплоченность go, вы обнаружите, что их становится труднее использовать в других приложениях. Это звучит проще, чем есть, часто требуется несколько итераций, чтобы получить действительно сплоченный сервис.

Компоненты - это вещи OSGi, которые могут предоставлять сервисы. Как правило, компоненты потребляют другие услуги. В вашем примере вы можете иметь базу данных, которая содержит города. Чтобы сохранить целостность вашего компонента, он не должен напрямую манипулировать базой данных, а должен использовать сервис. Ваш компонент должен быть экспертом только в городах, но не иметь представления о базе данных. Всякий раз, когда вы пишете компонент, и вам становится известно, что вы пишете код, не связанный с городами, делегируйте его другому сервису. Также убедитесь, что ваша служба баз данных не имеет понятия о городах, она знает только о базе данных. Компонент city имеет удобный способ получить доступ к своим городам из компонента, который вообще не знает городов.

Если вы будете так думать, у вас будет множество служб, которые ничего не делают. Вам нужно где-то, где вы координируете эти услуги. Это приложение . Приложение отвечает за общую функциональность. Его цель - собрать все свободные концы вместе. В вашем случае он будет потреблять город, погоду и другие услуги. Это также будет взаимодействовать с пользователем. Чтобы взаимодействовать с пользователем, он должен уметь искать город. Поэтому такой сервисный интерфейс был бы полезен:

 public interface Geo {
     List<String> countries();
     List<String>    cities(String country);
     Country         city(String country);
     City            city(String city);
 }

Я объединяю ваш город и страну, потому что я нахожу их чрезвычайно сплоченными. Разрушение их увеличивает сложность. Этот сервис позволяет мне создавать всплывающее окно в пользовательском интерфейсе со странами, и из выбранной страны я могу выбрать город.

Далее идет служба погоды:

 public interface Weather {
       boolean hasWeather( String country, String city);
       Report getShortReport(String country, String city);
 }

После выбрав страну и город, я могу запросить отчет у службы погоды.

Причина, по которой я использую String в этих интерфейсах, заключается в предотвращении связи между службой Geo и службой погоды. Это одна из главных ошибок ладьи ie, которую я часто вижу. Создавайте типы City & Country, которые затем используются повсеместно (или, что еще хуже, CityKey), эффективно превращая систему в один большой шарик грязи , где все привязано ко всему остальному некоторыми классами, которые просто действуют как строка.

Так что теперь компонент приложения может выбрать GUI (HTML, gogo, Swing, SWT и т. д. c.). Он может эффективно сосредоточиться на GUI, а детали низкого уровня заботятся поставщики услуг. Приложение должно быть единственным компонентом в вашей системе, который никто не может использовать повторно. Если это так, разделите его между повторно используемой частью и определенной c частью. Поскольку этот компонент нельзя использовать повторно, это единственное место в вашем программном обеспечении, где вам не нужно заботиться о связи.

Резюме. Идея состоит в том, что если вы посмотрите на диаграмму сервисов приложения OGSi, должно быть кристально ясно, где что-то происходит, и компонент приложения (часто не сам сервис) связывает все это вместе.

Надеюсь, это поможет .

1 голос
/ 26 марта 2020

Обычный способ подключения между пакетами - сервисы OSGi. Вы можете опубликовать sh сервис с интерфейсом или с классом. Затем потребитель может привязаться к интерфейсу или классу. На самом низком уровне это можно сделать с помощью OSGi API, но не рекомендуется использовать его напрямую. Вместо этого я рекомендую использовать декларативные сервисы с аннотациями.

См. Пример микросервиса OSGi enroute .

Он показывает внутреннюю проводку, а также использует и предлагает услуги REST.

...