В отличие от RequestFactory, который имеет плохие возможности обработки ошибок и тестирования (поскольку он обрабатывает большую часть материала под капотом GWT), RPC позволяет использовать более сервис-ориентированный подход. RequestFactory реализует более современный подход, основанный на внедрении зависимостей, который может предоставить полезный подход, если вам нужно вызвать сложные полиморфные структуры данных. При использовании RPC ваши структуры данных должны быть более плоскими, поскольку это позволит вашим утилитам маршалинга переводить между вашими моделями json / xml и java. Использование RPC также позволяет реализовать более надежную архитектуру, как указано в разделе gwt dev на веб-сайте Google.
"Простое развертывание клиент / сервер
Первый и самый простой способ думать об определениях служб - рассматривать их как всю серверную часть вашего приложения. С этой точки зрения клиентский код является вашим «внешним интерфейсом», а весь служебный код, который выполняется на сервере, является «внутренним». Если вы воспользуетесь этим подходом, ваши реализации службы будут иметь тенденцию быть более универсальными API, которые не будут тесно связаны с одним конкретным приложением. Определения ваших служб, вероятно, будут напрямую обращаться к базам данных через JDBC или Hibernate или даже к файлам в файловой системе сервера. Для многих приложений это представление подходит и может быть очень эффективным, поскольку сокращает количество уровней.
Многоуровневое развертывание
В более сложных многоуровневых архитектурах определения ваших служб GWT могут быть просто облегченными шлюзами, которые обращаются к средам внутренних серверов, таких как серверы J2EE. С этой точки зрения ваши сервисы можно рассматривать как «серверную половину» пользовательского интерфейса вашего приложения. Вместо того, чтобы быть универсальными, службы создаются для конкретных нужд вашего пользовательского интерфейса. Ваши сервисы становятся «интерфейсом» для «серверных» классов, которые записываются путем объединения вызовов к внутреннему уровню служб более общего назначения, реализованному, например, в виде кластера серверов J2EE. Такая архитектура подходит, если вам требуется, чтобы ваши внутренние службы работали на физически отдельном компьютере от вашего HTTP-сервера ».
Также обратите внимание, что для настройки одной службы RequestFactory требуется создать около 6 классов Java, тогда как для RPC требуется только 3. Больше кода == больше ошибок и сложности в моей книге.
RequestFactory также имеет немного больше накладных расходов во время обработки запроса, поскольку он должен маршалировать сериализацию между прокси-серверами данных и фактическими моделями Java. Этот добавленный интерфейс добавляет дополнительные циклы обработки, которые действительно могут сложиться в корпоративной или производственной среде.
Я также не верю, что службы RequestFactory являются сериализацией, как службы RPC.
В общем, после использования обоих в течение некоторого времени я всегда выбираю RPC, поскольку он более легкий, легче тестировать и отлаживать и быстрее, чем при использовании RequestFactory. Хотя RequestFactory может быть более элегантным и расширяемым, чем его аналог RPC. Дополнительная сложность не делает его лучшим инструментом.
Я считаю, что лучшая архитектура - это использование двух веб-приложений, одного клиента и одного сервера. Сервер представляет собой простое легкое универсальное веб-приложение на Java, использующее библиотеку servlet.jar. Клиент - GWT. Вы делаете RESTful-запрос через GWT-RPC на стороне сервера клиентского веб-приложения. Серверная сторона клиента - это просто переход к http-клиенту apache, который использует постоянный туннель в обработчик запросов, который вы запускаете как отдельный сервлет в веб-приложении сервлета сервера. Веб-приложение сервлета должно содержать уровень приложения вашей базы данных (hibernate, cayenne, sql и т. Д.). Это позволяет вам полностью отделить объектные модели базы данных от реального клиента, обеспечивая гораздо более расширяемый и надежный способ разработки и модульного тестирования вашего приложения. Конечно, для этого требуется немного времени на первоначальную настройку, но, в конце концов, позволяет создать динамическую фабрику запросов вне GWT. Это позволяет вам использовать лучшее из обоих миров. Не говоря уже о возможности тестировать и вносить изменения на стороне сервера без необходимости компиляции или сборки клиента gwt.