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

Author: user14070 , 2008-11-13

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...

 18
Author: Rolf,
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

 18
Author: Rakesh Waghela,
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

 9
Author: Pepster,
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

  1. reszta
  2. JERSEY (JAX-RS)
  3. BĄDŹ PEWNY
  4. SPRING BOOT
  5. Jackson
  6. spring security

Logika Biznesowa

  • DANE ŹRÓDŁOWE

  • Wiosenne dane MongoDB

Baza Danych

  • MongoDB

Serwer (do buforowania)

  • redis
 7
Author: CandleCoder,
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).

  1. interfejs, którego prezentacja używa jako klienta
  2. interfejs, który inny moduły są używane, gdy są klientem modułu.
  3. 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.

 4
Author: Dan,
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 .

 3
Author: Amritendu De,
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.

 2
Author: joshua,
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:

  1. Sprężyna ws/Rest / JSP front end
  2. Spring MVC for business service logic, zawierający logikę warstwy prezentacji oraz transakcje Spring
  3. 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.
  4. implementacje usług komponentowych, znowu Wiosna komponenty
  5. warstwa integracyjna, MyBatis do integracji baz danych, Spring ws do integracji usług internetowych, inne technologie integracji dla innych usług
  6. 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.

 1
Author: eis,
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.

 0
Author: nsfyn55,
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

 0
Author: iCrazybest,
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