Jestem bardzo nowy w Javie EE i staram się zrozumieć koncepcję interfejsów lokalnych i interfejsów zdalnych.
W początkowych wersjach specyfikacji EJB „EJB” były „zakładane” jako komponenty zdalne, a jedynym sposobem na ich wywołanie było nawiązanie zdalnego połączenia przy użyciu semantyki RMI i całego związanego z tym narzutu (połączenie sieciowe i serializacja obiektu dla każdego wywołanie metody). Klienci EJB musieli ponieść tę karę wydajności, nawet gdy byli umieszczeni na tej samej maszynie wirtualnej z kontenerem EJB.
Później firma Sun zdała sobie sprawę, że większość aplikacji biznesowych nie dystrybuuje EJB na innym poziomie i naprawiła specyfikację (w EJB 2.0), wprowadzając koncepcję interfejsów lokalnych, dzięki czemu klienci kolokowani na tej samej maszynie wirtualnej z kontenerem EJB mogą wywoływać EJB za pomocą bezpośrednie wywołanie metody, całkowicie omijając semantykę RMI (i związane z tym koszty ogólne).
Powiedziano mi, że jedną z wielkich zalet Java EE jest łatwość skalowania (co moim zdaniem oznacza, że możesz wdrażać różne komponenty na różnych serwerach)
Java EE można skalować, ale niekoniecznie oznacza to dystrybucję komponentów. Możesz uruchomić aplikację Web + EJB w klastrze bez oddzielania warstwy Web i warstwy EJB.
Czy powinieneś używać interfejsów zdalnych, jeśli spodziewasz się, że Twoja aplikacja będzie mieć różne komponenty na różnych serwerach? I użyj Lokalnych interfejsów, jeśli Twoja aplikacja będzie znajdować się tylko na jednym serwerze?
Powiedziałbym to w ten sposób: użyj zdalnych interfejsów, jeśli klient nie jest w tej samej maszynie JVM (nie oznacza to, że używasz tylko jednego serwera / maszyny JVM).
(...) Zacznij od korzystania z interfejsów lokalnych i, w stosownych przypadkach, stopniowo przechodź na interfejsy zdalne?
Prawdopodobnie zacznę od korzystania z lokalnych interfejsów. I jak już wspomniano, przejście na zdalne interfejsy nie zawsze jest obowiązkowe (można grupować skolokowaną strukturę).
Sugeruję sprawdzenie zasobów wymienionych poniżej (2 pierwsze są dość stare, ale wciąż aktualne, pozostałe 2 są nowsze).
Zasoby
It seems like there are a couple ways of scaling a web application (...) and I suppose you could use a combination of both?
Tak, właśnie o to chodzi.Do you, by chance know of good books on this topic?
Niestety nie, nie znam absolutnego zasobu „ZE”, jeśli taki istnieje. Dodałem jednak więcej zasobów z kilkoma referencjami.Chociaż zgadzam się z większością tego, co jest napisane powyżej, chciałbym nieco dopracować pomysły „jak zacząć”.
Sugeruję ci, abyś nigdy nie programował bezpośrednio do interfejsów EJB w swoim kodzie. Zawsze używaj zwykłego interfejsu biznesowego, programu do niego (co oznacza, że masz metody wywoływania kodu w interfejsie biznesowym) i podaj kod „kleju” EJB jako implementację wtykową. Twój program powinien koncentrować się na logice biznesowej, a nie na szczegółach implementacji, takich jak EJB.
W ten sposób możesz łatwo przełączać się między implementacjami zdalnymi i lokalnymi - a jeśli korzystasz z kontenera IoC, takiego jak Spring, możesz to zrobić tylko za pomocą konfiguracji.
Specjalna uwaga na temat przełączania z lokalnego na zdalny: zauważ, że istnieje kilka różnic semantycznych między nimi. Na przykład wywołanie metody EJB przez „zdalny interfejs” powoduje przekazanie argumentów według wartości, podczas gdy wywołanie przez „interfejs lokalny” powoduje przekazanie argumentów przez odwołanie. To jest główna różnica; więc jeśli „zaczynasz od lokalnego”, upewnij się, że projektujesz system w taki sposób, aby uwzględniał również „zdalną” semantykę.
Jeśli twój projekt opiera się na metodach EJB zmieniających przekazane obiekty, później trudno byłoby „przełączyć się na zdalne”; może nawet niemożliwe.
Powodzenia.
źródło
Zgodnie z EJB Spec 3.2 EJB może być lokalny lub zdalny . Interfejs biznesowy nie może być jednocześnie lokalny ani zdalny.
@Local
do fasoli z adnotacjami można uzyskać dostęp tylko wtedy, gdy są w tej samej aplikacji.@Remote
do ziaren z adnotacjami można uzyskać dostęp do różnych aplikacji, znajdujących się w różnych środowiskach Jvms lub na różnych serwerach aplikacji.Ważnymi rzeczami do zapamiętania są:
@Remote
adnotację, wszystkie zaimplementowane interfejsy mają być zdalne.@Local
adnotacja jest określona, zakłada się, że wszystkie zaimplementowane interfejsy są lokalne.źródło
@Local
do wywołania EJB w innej aplikacji (JAR, WAR, EAR), ale w tej samej JVM?To może odpowiedzieć na twoje obawy:
Źródło: http://www.onjava.com/pub/a/onjava/2004/11/03/localremote.html?page=last&x-showcontent=text
źródło