Opisz architekturę, której używasz w aplikacjach internetowych Java? [zamknięte]
Podzielmy się architekturami aplikacji internetowych opartych na Javie!
Istnieje wiele różnych architektur dla aplikacji internetowych, które mają być zaimplementowane przy użyciu Javy. Odpowiedzi na to pytanie mogą służyć jako biblioteka różnych projektów aplikacji internetowych z ich zaletami i wadami. Chociaż zdaję sobie sprawę, że odpowiedzi będą subiektywne, postarajmy się być tak obiektywni, jak tylko możemy i zmotywować za i przeciw, które wymieniamy.
Użyj preferowanego poziomu szczegółowości do opisywania twoja Architektura. Aby Twoja odpowiedź była wartościowa, musisz przynajmniej opisać główne technologie i pomysły używane w opisywanej architekturze. I wreszcie, kiedy powinniśmy użyć Twojej architektury?
Ja zacznę...Przegląd architektury
Używamy 3-warstwowej architektury opartej na otwartych standardach firmy Sun, takich jak Java EE, Java Persistence API, Servlet i Java Server Stron.
- trwałość
- biznes
- Prezentacja
Możliwe przepływy komunikacji między warstwami są reprezentowane przez:
Persistence <-> Business <-> Presentation
Co na przykład oznacza, że warstwa prezentacji nigdy nie wywołuje ani nie wykonuje operacji trwałości, zawsze robi to za pośrednictwem warstwy biznesowej. Ta architektura ma spełniać wymagania aplikacji webowej o wysokiej dostępności.
Trwałość
Wykonuje tworzenie, odczyt, operacje update and delete (CRUD) persistence. W naszym przypadku używamy (Java Persistence API) JPA i obecnie używamy Hibernate jako naszego dostawcy persistence i używamy jego EntityManager.
Ta warstwa jest podzielona na wiele klas, gdzie każda klasa zajmuje się określonym typem encji (np. encje związane z koszykiem mogą być obsługiwane przez jedną klasę persistence) i jest używana przez jedną i tylko jedną manager .
Dodatkowo warstwa ta przechowuje również encje JPA które są takimi rzeczami jak Account
, ShoppingCart
itd.
Biznes
Cała logika związana z funkcjonalnością aplikacji webowej znajduje się w tej warstwie. Ta funkcjonalność może być inicjowaniem przelewu dla klienta, który chce zapłacić za produkt on-line za pomocą swojej karty kredytowej. Równie dobrze może to być tworzenie nowego użytkownika, usuwanie użytkownika lub obliczanie wyniku bitwy w gra internetowa.
Ta warstwa jest podzielona na wiele klas, a każda z tych klas jest adnotowana @Stateless
, aby stać się Stateless Session Bean (SLSB). Każdy SLSB nazywa się menedżerem i na przykład menedżer może być klasą z adnotacją, jak wspomniano o nazwie AccountManager
.
Gdy AccountManager
musi wykonać operacje CRUD, wykonuje odpowiednie wywołania do instancji AccountManagerPersistence
, która jest klasą w warstwie persistence. Szorstki szkic dwóch metod w AccountManager
może być:
...
public void makeExpiredAccountsInactive() {
AccountManagerPersistence amp = new AccountManagerPersistence(...)
// Calls persistence layer
List<Account> expiredAccounts = amp.getAllExpiredAccounts();
for(Account account : expiredAccounts) {
this.makeAccountInactive(account)
}
}
public void makeAccountInactive(Account account) {
AccountManagerPersistence amp = new AccountManagerPersistence(...)
account.deactivate();
amp.storeUpdatedAccount(account); // Calls persistence layer
}
Używamy container manager transactions , więc nie musimy rozgraniczać transakcji. to, co w zasadzie dzieje się pod maską, to inicjowanie transakcji podczas wprowadzania metody SLSB i zatwierdzanie jej (lub wycofywanie jej) bezpośrednio przed opuszczeniem metody. Jest to przykład konwencji nad konfiguracją, ale nie potrzebowaliśmy jeszcze niczego poza domyślnym, wymaganym.
Oto jak samouczek Java EE 5 od Sun wyjaśnia wymagany atrybut transakcji Dla Enterprise JavaBeans (EJB):
Jeśli klient działa w ramach transakcji i wywołuje Przedsiębiorstwo metoda Beana, metoda ta wykonuje w ramach transakcji klienta. Jeśli klient nie jest związany z transakcji, kontener rozpoczyna nowa transakcja przed uruchomieniem metoda.
Wymagany atrybut to implicit atrybut transakcji dla wszystkich uruchamianie metod Bean firmy z transakcja zarządzana kontenerowo rozgraniczenie. Zazwyczaj nie ustawiasz wymagany atrybut, chyba że potrzebujesz aby zastąpić inną transakcję atrybut. Ponieważ transakcja atrybuty są deklaratywne, można łatwo je później zmienić.
Prezentacja
Nasza warstwa prezentacji jest za... prezentacja! Odpowiada za interfejs użytkownika i wyświetla informacje użytkownikowi poprzez budowanie stron HTML i odbieranie danych wejściowych przez GET I POST prośby. Obecnie używamy starej kombinacji Servlet s + Java Server Pages (JSP ).
Warstwa wywołuje metody w menedżerach warstwy biznesowej, aby wykonywać operacje żądane przez użytkownika i otrzymywać informacje do wyświetlenia na stronie internetowej. Czasami informacje otrzymane z warstwy biznesowej są mniej złożonymi typami jak egery String
i int
, a w innym czasie jednostki JPA .
Plusy i minusy z Architektura
Plusy
- posiadanie wszystkiego, co jest związane z konkretnym sposobem wykonywania persistence w tej warstwie oznacza tylko, że możemy zamienić z używania JPA na coś innego, bez konieczności ponownego pisania czegokolwiek w warstwie biznesowej.
- łatwo jest nam zamienić naszą warstwę prezentacji na coś innego i prawdopodobnie tak się stanie, jeśli znajdziemy coś lepszego.
- pozwolenie kontenerowi EJB na zarządzanie granicami transakcji jest miłe.
- Using Servlet ' s + JPA jest łatwa (na początek), a technologie są szeroko stosowane i implementowane w wielu serwerach.
- Korzystanie z Java EE ma ułatwić nam stworzenie systemu wysokiej dostępności z load balancing i fail over. Oboje uważamy, że musimy to mieć.
Cons
- używając JPA możesz przechowywać często używane zapytania jako zapytania nazwane, używając adnotacji
@NamedQuery
w klasie encji JPA. Jeśli masz jak najwięcej związanych aby uporczywość w klasach uporczywości, tak jak w naszej architekturze, rozdzieli to lokalizacje, w których możesz znaleźć zapytania dotyczące również jednostek JPA. Trudniej będzie przejrzeć operacje trwałości, a tym samym trudniej je utrzymać. - jako część naszej warstwy trwałości mamy jednostki JPA. Ale
Account
iShoppingCart
, czy to nie są naprawdę obiekty biznesowe? Odbywa się to w ten sposób, ponieważ musisz dotknąć tych klas i przekształcić je w byty, które JPA wie, jak uchwyt.
Encje JPA, które są również naszymi obiektami biznesowymi, są tworzone jak obiekty transferu danych (DTO ), znane również jako obiekty wartości (Vo). Powoduje to powstanie anemicznego modelu domeny, ponieważ obiekty biznesowe nie mają własnej logiki z wyjątkiem metod accessora. Cała logika jest wykonywana przez naszych menedżerów w warstwie biznesowej, co skutkuje bardziej proceduralnym stylem programowania. Nie jest to dobry obiektowy projekt, ale może to nie problem? (Wszakże obiekt orientacja nie jest jedynym paradygmatem programowania, który przyniósł rezultaty.)
- używanie EJB i Java EE wprowadza nieco złożoności. I nie możemy używać wyłącznie Tomcat(dodanie mikro-kontenera EJB nie jest czysto Tomcat).
- jest wiele problemów z używaniem Serwleta + JPA. Użyj Google, aby uzyskać więcej informacji na temat tych problemów.
- ponieważ transakcje są zamykane po wyjściu z warstwy biznesowej, nie możemy załadować żadnych informacji z jednostek JPA, które są skonfigurowany do ładowania z bazy danych, gdy jest to potrzebne (za pomocą
fetch=FetchType.LAZY
) z wnętrza warstwy prezentacji. Wywoła wyjątek. Przed zwróceniem encji zawierającej tego typu pola musimy mieć pewność, że wywołamy odpowiedni getter. inną opcją jest użycie Java Persistence Query Language (JPQL) i wykonanieFETCH JOIN
. Jednak obie te opcje są nieco uciążliwe.
10 answers
Ok zrobię (krótszy):
- Frontend : Tapestry (3 dla starszych projektów, 5 dla nowszych projektów)
- warstwa Biznesowa: Wiosna
- DAO ' s : Ibatis
- Baza Danych: Oracle
Korzystamy z obsługi transakcji Sping i rozpoczynamy transakcje po wejściu na warstwę usług, propagując się aż do wywołania DAO. warstwa usług ma najwięcej wiedzy o modelach, a DAO wykonują stosunkowo prostą pracę CRUD.
Kilka bardziej skomplikowanych zapytań rzeczy są obsługiwane przez bardziej skomplikowane zapytania w backendzie ze względu na wydajność.
Zaletą używania Springa w naszym przypadku jest to, że możemy mieć instancje zależne od kraju/języka, które są za klasą Spring Proxy. W zależności od użytkownika w sesji, podczas wykonywania połączenia używana jest prawidłowa implementacja kraju/języka.
Zarządzanie transakcjami jest prawie przejrzyste, wycofywanie WYJĄTKÓW w środowisku wykonawczym. Używamy WYJĄTKÓW niezaznaczonych w jak największym stopniu. Kiedyś sprawdzaliśmy wyjątki, ale wraz z wprowadzeniem Springa widzę korzyści z niezaznaczonych WYJĄTKÓW, obsługa wyjątków tylko wtedy, gdy możesz. Unika wielu rzeczy typu "catch/rethrow" lub "throws".
Przepraszam, że jest krótszy niż twój post, mam nadzieję, że uznasz to za interesujące...
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-10-31 20:09:31
Idealne Technologie Tworzenia Stron Internetowych Oparte Na Javie.
Warstwa Www:
HTML+CSS + Ajax + JQuery
RESTFul Web Controller/Action / Request Processing Layer:
Play Framework
Logika Biznesowa/Warstwa Usług:
Używaj jak najdłużej czystego kodu Javy. Tutaj można zrobić fuzję usług internetowych.
Warstwa transformacji danych XML / JSon:
XMLTool (Szukaj w Google Code),JSoup,Google GSon,XStream,JOOX (Szukaj w Google Kod)
Warstwa Trwałości:
CRUD: JPA lub SienaProject lub QueryDSL / Złożone zapytania: JOOQ, QueryDSL
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-08-22 12:08:54
Oto moje 5 centów
Prezentacja
Android, Angular.JS WebClient, OAUTHv2
API
REST, Jersey (JAX-RS), Jackson (JSON de-/serializacja), Dto-objects (różne od modeli logiki biznesowej)
Logika Biznesowa
Sprężyna do DI i obsługi zdarzeń. DDD-podejście do obiektów modelu. Dłuższe zadania są odciążane za pomocą SQS w modułach roboczych.
DAO
Model repozytorium ze Spring JDBC-templates do przechowywania encji. Redis (JEDIS) dla liderów, za pomocą uporządkowanych list. Memcache dla Token Store.
Baza danych
MySQL, Memcached, Redis
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-08-23 16:42:44
To, co wykonaliśmy w naszym projekcie to:
Technologia Front end
- AngularJS
- HTML5
- css3
- Javascript
- Bootstrap 3
API
- reszta
- JERSEY (JAX-RS)
- BĄDŹ PEWNY
- SPRING BOOT
- Jackson
- spring security
Logika Biznesowa
-
DANE ŹRÓDŁOWE
-
Wiosenne dane MongoDB
Baza Danych
- MongoDB
Serwer (do buforowania)
- redis
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-28 11:38:40
Nadal używamy zwykłego stosu Struts-Spring-Hibernate.
Dla przyszłych aplikacji, szukamy Spring Web Flow + Spring MVC + Hibernate lub Spring + Hibernate + Web Services with flex front end.
Charakterystyczną cechą naszej architektury jest modularyzacja. Mamy wiele modułów, niektóre zaczynają się od 3 do max 30 tabel w bazie danych. Większość modułów składa się z projektu biznesowego i internetowego. Projekt biznesowy trzyma logikę biznesu i wytrwałości, podczas gdy Internet trzyma logika prezentacji.
Na poziomie logicznym istnieją trzy warstwy: biznes, trwałość i prezentacja.
Zależności:
Prezentacja zależy od biznesu i wytrwałości.
Wytrwałość zależy od biznesu.
Biznes nie zależy od innych warstw.
Większość projektów biznesowych posiada trzy typy interfejsów (uwaga: nie GUI, jest to programowa warstwa interfejsu java).
- interfejs, którego prezentacja używa jako klienta
- interfejs, który inny moduły są używane, gdy są klientem modułu.
- interfejs, który może być używany do celów administracyjnych modułu.
Często, 1 rozszerza 2. W ten sposób łatwo jest zastąpić jedną implementację modułu inną. Pomaga nam to zaadoptować się do różnych klientów i łatwiej się zintegrować. Niektórzy klienci kupują tylko niektóre moduły i musimy zintegrować funkcjonalność, którą już posiadają. Ponieważ warstwa interfejsu i implementacji są oddzielone, łatwo jest to rolować implementacja modułu ad-hock dla tego konkretnego klienta bez wpływu na moduły zależne. A Spring Framework ułatwia wprowadzanie różnych implementacji.
Nasza warstwa biznesowa opiera się na Pojo. Jedną z tendencji, którą obserwuję, jest to, że te Pojo przypominają Dto. Cierpimy na anemiczny model domeny . Nie jestem do końca pewien, dlaczego tak się dzieje, ale może to wynikać z prostoty problemowej domeny wielu naszych modułów, większość pracy jest CRUD lub ze względu na programistów wolę umieścić logikę gdzie indziej.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-03-17 16:37:05
Oto jeszcze jedna architektura sieci, nad którą pracowałem:
Jednym z głównych wymagań było to, że aplikacja powinna obsługiwać telefony komórkowe/inne urządzenia. Aplikacja powinna być również rozszerzalna lub elastyczna do zmiany w wyborze technologii.
Poziom Prezentacji:
- JSP / JQuery (Client-side MVC)
- Natywny Android
- natywny iPhone
-
Mobile web (HTML5/CSS3 / Responsive design)
-
Regulatory sprężyny (można zmienić na JAX-RS)
Poziom Usług Biznesowych:
Spring @Service (można zmienić na Stateless EJB)
Warstwa Dostępu Do Danych:
Spring @Repository (można zmienić na stateless EJB)
Warstwa Zasobów:
Encje Hibernate (JPA) (można zmienić na dowolny ORM)
Więcej informacji na temat książki, która podąża za tą architekturą znajdziesz tutaj .
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-11-02 18:17:32
IMHO, większość z nas ma wspólny mianownik. Przynajmniej w back-endzie mamy jakąś formę kontenera IOC/DI i ramy trwałości. Osobiście używam do tego Guice i Mybatis. Różnice dotyczą sposobu implementacji warstwy view / UI / presentation. Istnieją 2 główne opcje tutaj (może być więcej).. Oparte na akcjach (adresy URL mapowane do kontrolerów) i oparte na komponentach. Obecnie używam warstwy prezentacji opartej na komponentach(za pomocą wicket). Doskonale naśladuje środowisko graficzne, w którym używam komponenty i zdarzenia w przeciwieństwie do adresów URL i kontrolerów. Obecnie Szukam powodu, dla którego powinienem przenieść się do tego typu architektury URL-controller (tak wylądowałem na tej stronie). Skąd ten szum o spokojnych i Bezpaństwowych architekturach.
Aby odpowiedzieć na to pytanie w skrócie: piszę stateful web applications using a component oriented framework on top of Guice IoC container and put data in relational database using Mybatis.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-12-17 18:56:55
Trochę inaczej, a ja bym tu stwierdził bardziej modułową architekturę Javy. Mamy:
- Sprężyna ws/Rest / JSP front end
- Spring MVC for business service logic, zawierający logikę warstwy prezentacji oraz transakcje Spring
- Interfejs komunikacyjny usługi komponentowej, sprawdzany przez EJB przez usługi biznesowe. EJB ustalają własne granice transakcji, które mogą dołączać do transakcji Spring.
- implementacje usług komponentowych, znowu Wiosna komponenty
- warstwa integracyjna, MyBatis do integracji baz danych, Spring ws do integracji usług internetowych, inne technologie integracji dla innych usług Mainframe, bazy danych, inne usługi na innych serwerach...
Oprócz powyższego, mamy Moduły biblioteki współdzielonej, która jest dostawcą wspólnej funkcjonalności dla wszystkich srevices.
Użycie różnych warstw pozwala nam na pełne odsprzęgnięcie i potrzebną modułowość. Jesteśmy również w stanie w pełni wykorzystać moc Java EE jak i Spring. Nic nie stoi na przeszkodzie, aby używać JSF, na przykład, w razie potrzeby dla przodu.
W porównaniu z przykładową architekturą op, myślę, że można to opisać jako posiadanie czterech głównych warstw zamiast trzech, aczkolwiek z pewnym zwrotem akcji.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-06-02 20:21:47
Pracowałem nad projektami, które używają sztywnego wzorca menedżera. Historycznie, byłem wielkim zwolennikiem sztywnej hierarchii, gdzie wszystko mieści się w zgrabnym pudełku. W miarę postępów w mojej karierze uważam, że w wielu przypadkach jest to wymuszone. Uważam, że przyjęcie bardziej zwinnego podejścia do projektowania aplikacji prowadzi do lepszego produktu. Co mam na myśli tworząc zestaw klas, które rozwiązują problem pod ręką. Zamiast mówić: "czy zbudowałeś menedżera do tego i tamtego?"
The obecnie pracuję nad aplikacją internetową z połączeniem Spring MVC i RestEasy JSON / Ajax. Po stronie serwera wbudowany w nasze kontrolery jest sensowna Warstwa danych oparta na fasadach z JPA / Hibernate dla bezpośredniego dostępu do bazy danych, dostępu EJB i niektórych wywołań usług internetowych opartych na SOAP. Wiązanie tego wszystkiego jest niestandardowym kodem kontrolera Javy, który określa, co serializować jako JSON i wrócić do klienta.
Prawie nie spędzamy czasu na próbach stworzenia jakiegoś zunifikowanego pattern zamiast tego zdecydował się przyjąć ideę "gorsze jest lepsze" filozofii projektowania Uniksa. Ponieważ znacznie lepiej jest pokolorować poza liniami i zbudować coś sensownego, szybko niż zbudować coś, co przylega do kilku ścisłych mandatów projektowych.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-08-22 12:41:52
Komponenty w Architektura aplikacji webowych obejmują:
1 : przeglądarka: interakcja z Klientem
HTML
JavaScript
Stylesheet
2 : Internet
3 : Webserver
CSS
Image
Pages(Java render )
4: Serwer Aplikacji
App Webapp (Java interaction)
Others WebApps
5: Serwer Bazy Danych
Oracle, SQL, MySQL
6: Dane
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-09-14 16:36:05