значение java RMI, пожалуйста?

Почему люди используют RMI или когда мне следует использовать RMI? Я прочитал эти учебники по RMI на веб-сайте оракула. Но он не дает достаточного количества практических примеров.

Насколько я понимаю, программное обеспечение должно иметь как можно более несвязанные и разделенные модули. RMI почему-то кажется мне примером высокой связанности. Почему это не плохая практика кодирования? Я думал, что клиент должен только запускать инструкции, тогда как все фактические манипуляции с объектом выполнялись сервером.


person Fermat's Little Student    schedule 14.01.2013    source источник
comment
Любая технология будет страдать от той или иной формы связи. Вы можете напрямую использовать сокеты, это форма связи - или HTTP, или FTP - вы сузили себя до возможностей протокола. RMI — это решение, которое было разработано для обеспечения передачи объектов и состояний объектов без необходимости в слое перевода. Если вам нужно общаться только с другими службами Java, RMI — неплохое решение. Однако, если вам нужно (или ваша служба хочет) общаться на других языках, есть другие доступные варианты. Это будет зависеть от ваших требований.   -  person MadProgrammer    schedule 15.01.2013
comment
Это то, для чего он был разработан, но это не то, что он на самом деле выполняет. Мечта о прозрачной сериализации произвольных графов объектов давно умерла. На самом деле RMI продвигает смущающее количество шаблонов, называемых объектами передачи данных, которые фактически имитируют ориентированное на документы взаимодействие между процессами, но по смехотворной цене.   -  person Marko Topolnik    schedule 15.01.2013
comment
Хороший вопрос @Will. Продолжайте задавать подобные вопросы на протяжении всей своей карьеры, чтобы определить все эти дерьмовые технологии, которые существуют только потому, что какой-то маркетолог подумал, что это хорошая идея.   -  person Bastian Voigt    schedule 09.11.2017
comment
ИМО, лучший значок, который вы можете получить за вопрос, это то, что он был закрыт как неконструктивный: D   -  person Bastian Voigt    schedule 09.11.2017


Ответы (4)


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

В некоторых случаях (погружение в устаревшие или «корпоративные» приложения) у вас просто нет выбора.

Однако, если вы начинаете новый проект, есть и другие варианты:

REST + JSON через HTTP

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

Теоретически это должно потребовать больше работы, чем RMI, потому что вам нужно вручную создавать доступные URL-адреса, допустимые глаголы в каждом URL-адресе и т. д. На практике я бы сказал, что шаблон RMI на самом деле никому не помогает.

Опираясь на Java, Jersey – это великолепная библиотека для написания собственных веб-сервисов RESTful.

Если вам нужно решение с включенными батареями для веб-служб RESTful с Java, Dropwizard от хороших ребят из Yammer даст вам полноценный сервер и инфраструктура, готовые просто подключить вашу бизнес-логику и обеспечивающие ведение журнала, подключение к базе данных, сериализацию, маршрутизацию запросов и даже сбор метрик из коробки.

МЫЛО

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

Бережливость

Thrift создаст клиента и заглушку сервера, выполняя большую часть работы. Связь осуществляется в эффективном бинарном протоколе. Он набирает популярность в мире Java, поскольку используется во многих проектах с открытым исходным кодом в области «больших данных». Примеры, Cassandra, HBase (переход на Avro). Scrooge — это твиттер-проект по созданию идиоматических заготовок для scala.

Акка актеры

Akka — это фреймворк, который реализует Акторная модель для Scala и Java. Включает средства для межсервисной связи и заботится о многих деталях под капотом. я


В зависимости от ваших потребностей, некоторые из них будут более подходящими, чем другие.

person Alex Recarey    schedule 14.01.2013
comment
Обновил мой ответ, чтобы показать, что иногда это невозможно :) - person Alex Recarey; 16.01.2013
comment
Если я хочу создать клиент-серверное приложение, в котором клиент и сервер написаны на языке java. Должен ли я также использовать REST, JSON? - person FuryFart; 10.11.2013
comment
Даже если ваш клиент и сервер написаны на java, я бы все равно придерживался HTTP + JSON. Что, если через какое-то время вам понадобится приложение для Android или iOS? Что делать, если вам нужно предоставить доступ к сервису другому сервису, написанному не на Java? Даже если вам никогда не понадобится делать что-либо из этого, RMI - это боль, его основная предпосылка ошибочна, и я бы не стал его использовать. - person Alex Recarey; 11.11.2013

Каждый раз, когда у вас есть функция, требующая большой централизованной вычислительной мощности или какого-то дорогого ресурса (например, огромная база данных), но ваши выходные данные должны быть во многих местах, где такая рабочая нагрузка не может быть развернута, вы должны посмотреть Удаленный вызов метода . Рассмотрим Интернет, у вас нет копии Google на вашем рабочем столе для любого поиска, который вы хотите вычислить, вы удаленно вызываете серверы Google в тот момент, когда вам нужен результат. RMI — это протокол/система для распределения вашего приложения по серверам и выделения клиентов, которым необходим доступ к результатам этого кода.

RMI также может действовать как способ защиты аспектов вашего приложения (например, собственный алгоритм). RMI — не единственный подход, вы также можете использовать HTTP, SOAP и т. д. Многие из этих других подходов предлагают другие вещи, такие как истинная прозрачность языка, более простые и эффективные реализации и лучшее разделение.

Вот заявленные цели RMI из документация

Целями поддержки распределенных объектов в языке программирования Java являются:

  • Поддержка беспрепятственного удаленного вызова объектов на разных виртуальных машинах.
  • Поддержка обратных вызовов с серверов на апплеты
  • Интегрировать распределенную объектную модель в язык программирования Java естественным образом, сохраняя при этом большую часть объектной семантики языка программирования Java.
  • Сделайте очевидными различия между распределенной объектной моделью и объектной моделью локальной платформы Java.
  • Максимально упростите написание надежных распределенных приложений
  • Сохраняйте безопасность типов, обеспечиваемую средой выполнения платформы Java.
  • Поддержка различной семантики ссылок для удаленных объектов; например живые (непостоянные) ссылки, постоянные ссылки и отложенная активация
  • Поддерживать безопасную среду платформы Java, обеспечиваемую менеджерами безопасности и загрузчиками классов. В основе всех этих целей лежит общее требование, чтобы модель RMI была как простой (легкой в ​​использовании), так и естественной (хорошо вписывалась в язык).
person Jason Sperske    schedule 14.01.2013
comment
Извините, ваш пост звучит слишком позитивно в отношении RMI. Голосование за вас, чтобы подчеркнуть скептические голоса из других ответов - person Bastian Voigt; 09.11.2017
comment
Если бы я мог поговорить с самим собой 2013 года, я бы сказал почти то же самое :) - person Jason Sperske; 09.11.2017
comment
Ха-ха, сделал мой день :D - person Bastian Voigt; 09.11.2017

Вы правы, RMI является примером слишком тесной связи между поставщиком услуг и потребителем услуг. И это еще хуже, чем кажется на первый взгляд: вы никогда не знаете, какое исключение вы можете получить на стороне клиента, что приведет к ClassNotFoundException, которое маскирует реальную возникшую ошибку. RMI, а также EJB — это технологии прошлого, прошлого, верившего в иллюзию «прозрачно распределенных объектов».

Современные удаленные сервисы основаны на полной противоположности подходу RMI: REST и JSON.

person Marko Topolnik    schedule 14.01.2013

RMI предназначен для прямо противоположного случая, когда вы хотите жесткое связывание, настолько жесткое, чтобы оно выглядело как вызов локального метода. Если вы этого не хотите, не используйте его. Вся парадигма RPC не для всех, включая меня, хотя я и написал книгу по RMI, но у каждого инструмента есть свое применение. Например, Java EE построена на модели RMI.

person user207421    schedule 14.01.2013
comment
› «Java EE построена на модели RMI» звучит несколько спорно. Я имею в виду, что Java EE состоит из многих частей, и большинство из них не имеют ничего общего с RMI. Даже EJB, который изначально был построен как абстракция RMI более высокого уровня, в настоящее время редко использует его, вплоть до того, что руководитель Java EE предложил полностью удалить его. - person Arjan Tijms; 17.01.2013
comment
@ArjanTijms Хорошо, был построен на модели RMI, по крайней мере, в том, что касается EJB. Еще очень большая часть работы с количеством размещений. Я не знаю о предложении, которое вы цитируете: у вас есть ссылка? - person user207421; 03.02.2013
comment
at least as far as EJB are concerned - это уже немного точнее ;) Опять же, Java EE - это гораздо больше, чем просто EJB. Во всяком случае, это ссылка: java.net/jira/browse/JAVAEE_SPEC-16 это часть сокращения CORBA, и в качестве залога весь @Remote и, таким образом, RMI/IIOP находится на столе для сокращения. - person Arjan Tijms; 04.02.2013
comment
@ArjanTijms Неработающая ссылка. - person user207421; 28.09.2017
comment
да, все эти ссылки не работают :( Новая здесь: github.com/javaee/javaee -спецификация/вопросы/16 - person Arjan Tijms; 28.09.2017
comment
@ArjanTijms Вы полностью искажаете ситуацию. Предлагается убрать требование совместимости CORBA. В вашей ссылке ничего не говорится о его полном удалении или удалении @Remote: фактическое предложение, которое встречает значительное сопротивление в вашей ссылке, состоит в том, чтобы «значительно упростить удаленное взаимодействие EJB»; и утверждение «Текущее использование CORBA настолько мало, что имеет смысл сократить поддержку CORBA в будущем» является чистой спекуляцией. - person user207421; 09.11.2017
comment
Разве это не считается предложением об удалении @Remote: реализации вообще не должны поддерживать удаленные EJB? - person Arjan Tijms; 10.11.2017
comment
Я не вижу, где Rest и Soap связаны менее тесно, чем RMI, единственная разница в том, что RMI соединяется за кулисами и компилятор проверяет интерфейс клиент-сервер, тогда как Rest и Soap заставляют вас соединяться и проверять код приложения. Если клиент-серверный интерфейс не соблюдается в Json или XML, это ломает ваше приложение, поэтому вам нужно все проверять в коде или xsd. - person weberjn; 26.03.2019
comment
Если я правильно помню, бинарные коммуникационные протоколы RMI/DCOM начали терять популярность, когда Интернет в целом осознал большую гибкость и функциональную совместимость использования формата text-based в передаче данных, которая проходит через общеизвестные общепринятые порты 80 и 443. Это значительно уменьшило необходимость настройки брандмауэра инфраструктуры. Это понимание было реализовано, когда html процветал, а CORBA не набирал обороты. - person eigenfield; 21.10.2019
comment
@typelogic Конечно, вы имеете в виду HTTP, а не HTML, но в целом ваш комментарий читается как чистый мегатренд 1980-х годов без фактов. - person user207421; 15.04.2020
comment
@weberjn Поскольку в этом ответе не упоминается ни REST, ни SOAP, и комментарии к нему то же самое, и вопрос то же самое, я не вижу актуальности вашего комментария. - person user207421; 15.04.2020
comment
@ user207421 ответ был о жесткой привязке, и я утверждал, что привязка RMI не более и не менее жесткая, чем очевидные альтернативы. - person weberjn; 16.04.2020
comment
@weberjn Это значительно надежнее, чем REST или SOAP. Для начала он определяет язык реализации на обоих концах. - person user207421; 26.06.2020