2010-03-14 3 views
2

Наше текущее приложение работает в одном JVM.Разрешить модульную разработку, продолжая работать в одном JVM?

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

Разделение выполняется для того, чтобы одна услуга могла быть изменена и развернута без воздействия на всю систему. Это уменьшает потребность в QA всей системы - просто нужно QA взаимодействовать с изменяемой услугой.

Для межсервисной связи мы используем комбинацию REST, системной шины MQ и представлений базы данных.

Что мне не нравится об этом:

  • REST означает, что мы должны мобилизовывать данные в/из XML
  • DB просмотров соедини системы вместе, которая побеждает всю концепцию отдельных услуг
  • MQ/системная шина добавлена ​​сложность
  • Существует неизбежное дублирование кода между службами
  • Вы настроили n конфигурацию сервера JBoss, мы должны выполнить n количество развертываний, n numb er setup скриптов и т. д.

Есть ли лучший способ структурировать внутреннее приложение для модульной разработки и развертывания, позволяя приложению работать в одной JVM (и достигая связанных преимуществ)?

ответ

3

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

Сказав это, вы изучили OSGi? Вы можете развернуть разные bundles (в основном, файлы jar с дополнительными метаданными, определяющими интерфейсы) на один и тот же сервер OSGi, и сервер будет прозрачно общаться между этими пакетами, поскольку все работает в одной и той же JVM - то есть вы вызываете методы на объектах в разные пучки, как обычно.

Сервер OSGi разрешает разгрузку и обновление пакетов во время выполнения, и приложения должны запускаться нормально (если деградировало) при условии соблюдения состояний OSGi bundle lifecycle.

+0

Спасибо за ответ. Как сервер «облегчает общение» между пакетами? –

+0

Я расширил это в отредактированном ответе. Вы просто вызываете необходимые методы. –

+0

То, что я получаю, это то, как вы НЕ можете разбить приложение? Чтобы он работал в одной JVM, но разработал его, чтобы вы могли развернуть отдельные «модули» приложения самостоятельно. Делая это, у вас есть уверенность, что единственная часть измененного приложения - это «модуль A», и все, что вам нужно для QA, - это связь между «модулем A» и остальной частью вашего приложения. И это также уменьшит риск того, что изменение закралось в один из ваших модулей и вызвало некоторые проблемы, когда все, что вы хотели развернуть, это «модуль A». –

0

Похоже, что ваша команда имеет ручной процесс QA, и настоящая проблема - автоматизировать регрессионные тесты, чтобы вы могли быстро и уверенно развертывать новые выпуски. Обходной путь для разрыва кода на отдельные серверы.

Если вы хотите перезапустить сервер, то одним из подходов может быть компиляция кода в отдельные файлы jar и развертывание модуля путем сброса в новую банку и перезапуск. Это в значительной степени связано с структурированием вашей базы кода, так что плохие зависимости не ползут, а вызовы между банками создаются с помощью интерфейсов, которые не меняются. (Или, альтернативно, используйте абстрактные классы, чтобы вы могли добавить новый метод с реализацией по умолчанию.) Ваша система сборки могла бы помочь, убедившись, что отдельно развернутые модули могут зависеть только от общих интерфейсов, а что-то еще - ошибка компиляции. Но учтите, что ваш компилятор не поможет вам обнаружить несовместимость при обмене в банках, с которыми вы не компилировались, поэтому я не уверен, что это действительно позволяет избежать хорошего процесса QA.

Если вы хотите развернуть новый код без перезапуска JVM, то OSGI - это стандартный способ сделать это. (Но тот, о котором я мало знаю.)

Смежные вопросы