W przeciwieństwie do RequestFactory, który ma słabą obsługę błędów i możliwości testowania (ponieważ przetwarza większość rzeczy pod maską GWT), RPC pozwala na zastosowanie podejścia bardziej zorientowanego na usługi. RequestFactory implementuje bardziej nowoczesne podejście stylizowane na iniekcję zależności, które może zapewnić przydatne podejście, jeśli musisz wywołać złożone polimorficzne struktury danych. Podczas korzystania z RPC struktury danych będą musiały być bardziej płaskie, ponieważ umożliwi to narzędziom kierującym tłumaczenie między modelami json / xml i java. Korzystanie z RPC pozwala również na implementację bardziej niezawodnej architektury, o której mowa w sekcji gwt dev w witrynie Google.
„Proste wdrożenie klienta / serwera
Pierwszym i najprostszym sposobem myślenia o definicjach usług jest traktowanie ich jako całego zaplecza aplikacji. Z tego punktu widzenia kod po stronie klienta jest „interfejsem użytkownika”, a cały kod usługi działający na serwerze jest „zapleczem”. Jeśli zastosujesz takie podejście, implementacje usług będą miały tendencję do bardziej ogólnego przeznaczenia interfejsów API, które nie są ściśle powiązane z jedną konkretną aplikacją. Definicje usług prawdopodobnie miałyby bezpośredni dostęp do baz danych przez JDBC lub Hibernate lub nawet do plików w systemie plików serwera. W przypadku wielu aplikacji ten widok jest odpowiedni i może być bardzo wydajny, ponieważ zmniejsza liczbę warstw.
Wdrożenie wielopoziomowe
W bardziej złożonych, wielowarstwowych architekturach definicje usług GWT mogą być po prostu lekkimi bramami, które łączą się ze środowiskami serwerów zaplecza, takimi jak serwery J2EE. Z tego punktu widzenia usługi można postrzegać jako „połowę serwera” interfejsu użytkownika aplikacji. Zamiast pełnić funkcję ogólnego przeznaczenia, usługi są tworzone pod kątem konkretnych potrzeb interfejsu użytkownika. Twoje usługi stają się „frontendem” dla klas „zaplecza”, które są zapisywane przez zszywanie razem wywołań do warstwy usług zaplecza bardziej ogólnego przeznaczenia, zaimplementowanej, na przykład, jako klaster serwerów J2EE. Ten rodzaj architektury jest odpowiedni, jeśli chcesz, aby usługi zaplecza działały na fizycznie oddzielnym komputerze od serwera HTTP ”.
Zauważ również, że skonfigurowanie pojedynczej usługi RequestFactory wymaga stworzenia około 6 klas java, podczas gdy RPC wymaga tylko 3. Więcej kodu == więcej błędów i złożoności w mojej książce.
RequestFactory ma również nieco większy narzut podczas przetwarzania żądania, ponieważ musi organizować serializację między serwerami proxy danych a rzeczywistymi modelami Java. Ten dodany interfejs dodaje dodatkowe cykle przetwarzania, które mogą naprawdę sumować się w przedsiębiorstwie lub środowisku produkcyjnym.
Nie wierzę również, że usługi RequestFactory są serializacją, tak jak usługi RPC.
Podsumowując, po tym, jak od jakiegoś czasu używam obu, zawsze wybieram RPC, ponieważ jest lżejszy, łatwiejszy do testowania i debugowania oraz szybszy niż przy użyciu RequestFactory. Chociaż RequestFactory może być bardziej elegancki i rozszerzalny niż jego część odpowiadająca RPC. Dodatkowa złożoność nie sprawia, że jest to potrzebne lepsze narzędzie.
Moim zdaniem najlepszą architekturą jest wykorzystanie dwóch aplikacji internetowych, jednego klienta i jednego serwera. Serwer jest prostą, lekką, ogólną aplikacją internetową java, która korzysta z biblioteki servlet.jar. Klient jest GWT. Wysyłasz żądanie RESTful za pośrednictwem GWT-RPC po stronie serwera aplikacji internetowej klienta. Strona serwera klienta jest tylko przejściem do klienta HTTP Apache, który używa trwałego tunelu do procedury obsługi żądań, którą uruchomiłeś jako pojedynczy serwlet w aplikacji WWW serwletu serwera. Aplikacja internetowa serwletu powinna zawierać warstwę aplikacji bazy danych (hibernacja, cayenne, sql itp.). Pozwala to w pełni oddzielić modele obiektów bazy danych od rzeczywistego klienta, zapewniając znacznie bardziej rozszerzalny i niezawodny sposób tworzenia i testowania jednostkowego aplikacji. To prawda, wymaga trochę czasu na wstępną konfigurację, ale ostatecznie umożliwia utworzenie dynamicznej fabryki żądań znajdującej się poza GWT. Pozwala to wykorzystać to, co najlepsze z obu światów. Nie wspominając o możliwości testowania i wprowadzania zmian po stronie serwera bez konieczności kompilowania lub budowania klienta gwt.