В последнее время в моей компании был большой интерес к Сервис-Ориентированная Архитектура (SOA). Всякий раз, когда я пытаюсь понять, как мы можем это использовать, я всегда сталкиваюсь с ментальным блоком. Грубо:
Объектная ориентация гласит: «храните вместе данные и методы, управляющие данными (бизнес-процессами)»;
Сервис-ориентированность гласит: «держите бизнес-процесс в сервисе и передавайте ему данные».
Предыдущие попытки разработки SOA закончились преобразованием объектно-ориентированного кода в структуры данных и отдельные процедуры (службы), которые ими манипулируют, что кажется шагом назад.
Мой вопрос: Какие шаблоны, архитектуры, стратегии и т. д. позволяют SOA и OO работать вместе?
Редактировать: Ответы «ОО для внутренних компонентов, SOA для границ системы» великолепны и полезны, но это не совсем то, что я имел в виду.
Допустим, у вас есть объект Account, бизнес-операция которого называется Merge, которая объединяет его с другой учетной записью. Типичный объектно-ориентированный подход будет выглядеть так:
Account mainAccount = database.loadAccount(mainId);
Account lesserAccount = database.loadAccount(lesserId);
mainAccount.mergeWith(lesserAccount);
mainAccount.save();
lesserAccount.delete();
В то время как эквивалент SOA, который я видел, выглядит так:
Account mainAccount = accountService.loadAccount(mainId);
Account lesserAccount = accountService.loadAccount(lesserId);
accountService.merge(mainAccount, lesserAccount);
// save and delete handled by the service
В случае объектно-ориентированного подхода бизнес-логика (и осведомленность о сущности благодаря шаблону ActiveRecord) встроены в класс Account. В случае SOA объект Account на самом деле является просто структурой, поскольку все бизнес-правила скрыты в службе.
Могу ли я иметь одновременно многофункциональные функциональные классы и сервисы многократного использования?


Я действительно думаю, что SOA полезен только для внешних интерфейсов (вообще говоря, для тех, кто находится за пределами вашей компании), и даже тогда, только в тех случаях, когда производительность действительно не имеет значения, вам не нужна упорядоченная доставка сообщений.
В свете этого, я думаю, они могут сосуществовать. Следите за тем, чтобы ваши приложения работали и обменивались данными, используя философию объектно-ориентированного программирования, и только когда требуются внешние интерфейсы (для третьих сторон), предоставляйте их через SOA (это не обязательно, но это один способ).
Я действительно чувствую, что SOA используется слишком часто, или, по крайней мере, слишком часто предлагаются архитектуры с SOA. На самом деле я не знаю ни одной крупной системы, использующей SOA для внутренних целей, и сомневаюсь, что она могла бы. Похоже, что вы могли бы просто использовать для создания гибридных приложений или простых запросов типа прогноза погоды, а не создавать на их основе серьезные системы.
Спустя 8 лет после публикации этого ответа сервис-ориентированные архитектуры стали очень популярными, многие компании, такие как Netflix, Amazon, Uber, eBay и другие, перевели свои продукты из монолитов в микросервисы. Масштабируемость - причина номер один.
Да, за эти 8 лет изменилось то, из чего обычно состоит SOA. Раньше это означало синхронные API-интерфейсы запроса-ответа без гарантированной упорядоченной доставки. Ситуация изменилась, и теперь это означает асинхронные API-интерфейсы, которые позволяют осуществлять потоковую передачу и значительно улучшают пропускную способность и общую производительность.
Я считаю, что SOA может быть полезна на макроуровне, но каждая служба, вероятно, все равно будет достаточно большой, чтобы потребовалось несколько внутренних компонентов. Внутренние компоненты могут выиграть от объектно-ориентированной архитектуры.
API SOA следует определять более тщательно, чем внутренние API, поскольку это внешний API. Типы данных, передаваемые на этом уровне, должны быть максимально простыми, без внутренней логики. Если есть какая-то логика, относящаяся к типу данных (например, проверка), предпочтительно должна быть одна служба, отвечающая за выполнение логики для этого типа данных.
SOA - хорошая архитектура для связи между системами или приложениями.
Каждое приложение определяет "служебный" интерфейс, который состоит из запросов, которые оно будет обрабатывать, и ожидаемых ответов.
Ключевыми моментами здесь являются четко определенные службы с четко определенным интерфейсом. То, как на самом деле реализуются ваши сервисы, не имеет значения для SOA.
Таким образом, вы можете свободно внедрять свои услуги, используя все новейшие и лучшие методы объектно-ориентированного проектирования или любую другую методологию, которая работает для вас. (Я видел крайние случаи, когда «услуга» реализовывалась реальными людьми, вводящими данные на экран - но все было по-прежнему учебным SOA!).
Я считаю, что это неправильное понимание объектной ориентации. Даже в Java методы обычно являются частью не объекты, а их класс (и даже это «членство» не обязательно для объектной ориентации, но это другой предмет). Класс - это просто описание типа, поэтому на самом деле это часть программы, а не данные.
SOA и OO не противоречат друг другу. Сервис может принимать данные, организовывать их во внутренние объекты, работать с ними и, наконец, возвращать их в любом желаемом формате.
Я слышал, как Джеймс Гослинг говорил, что SOA можно реализовать на COBOL.
Если вы прочитаете собственное описание Алана Кея происхождения ООП, оно описывает группу маленьких компьютеров, взаимодействующих для выполнения чего-то полезного.
Рассмотрим это описание:
Your X should be made up of Ys. Each Y should be responsible for a single concept, and should be describable completely in terms of its interface. One Y can ask another Y to do something via an exchange of messages (per their specified interfaces).
In some cases, an X may be implemented by a Z, which it manages according to its interface. No X is allowed direct access to another X's Z.
Думаю, возможны следующие замены:
Term Programing Architecture
---- --------------- ------------
X Program System
Y Objects Services
Z Data structure Database
---- --------------- ------------
result OOP SOA
Если вы думаете в первую очередь об инкапсуляции, сокрытии информации, слабой связи и интерфейсах «черный ящик», между ними есть немало общего. Если вы увязли в полиморфизме, наследовании и т. д., Вы думаете о программировании / реализации, а не об архитектуре, ИМХО.
Если вы позволите своим службам запоминать состояние, то их можно будет рассматривать как большие объекты с возможно медленным временем вызова.
Если им не разрешено сохранять состояние, тогда они просто, как вы сказали, - операторы данных.
Похоже, вы разделяете свою систему на слишком много служб. У вас есть письменные взаимно согласованные критерии разделения?
Принятие SOA означает, что нет означает выбросить все свои предметы, но речь идет о разделении вашей системы на большие многократно используемые блоки.
Привет, спасибо за отличный пост! В наши дни это меня смущает. Есть ли у вас дальнейшие выводы через 5 лет? На самом деле хочу знать. - Тони