it-swarm.com.de

Beschreiben Sie die Architektur, die Sie für Java Webanwendungen?

Teilen wir Java basierte Webanwendungsarchitekturen!

Es gibt viele verschiedene Architekturen für Webanwendungen, die mit Java implementiert werden sollen. Die Antworten auf diese Frage können als Bibliothek verschiedener Webanwendungsdesigns mit ihren Vor- und Nachteilen dienen. Obwohl mir klar ist, dass die Antworten subjektiv sind, wollen wir versuchen, so objektiv wie möglich zu sein und die Vor- und Nachteile, die wir auflisten, zu motivieren.

Verwenden Sie die Detailebene, die Sie für die Beschreibung Ihrer Architektur bevorzugen. Damit Ihre Antwort einen Wert hat, müssen Sie mindestens die wichtigsten Technologien und Ideen beschreiben, die in der von Ihnen beschriebenen Architektur verwendet werden. Und last but not least wann sollten wir Ihre Architektur verwenden?

Ich fange an ...


Übersicht über die Architektur

Wir verwenden eine dreistufige Architektur, die auf offenen Standards von Sun basiert, wie Java EE, Java Persistence API, Servlet und Java = Serverseiten.

  • Beharrlichkeit
  • Geschäft
  • Präsentation

Die möglichen Kommunikationsflüsse zwischen den Schichten werden dargestellt durch:

Persistence <-> Business <-> Presentation

Dies bedeutet beispielsweise, dass die Präsentationsschicht niemals Persistenzoperationen aufruft oder durchführt, sondern dies immer über die Geschäftsschicht tut. Diese Architektur soll die Anforderungen einer hochverfügbaren Webanwendung erfüllen.

Beharrlichkeit

Führt Persistenzoperationen zum Erstellen, Lesen, Aktualisieren und Löschen ( CRUD ) aus. In unserem Fall verwenden wir ( Java Persistence API ) JPA und verwenden derzeit Hibernate als unseren Persistenzanbieter und verwenden seinen EntityManager .

Diese Ebene ist in mehrere Klassen unterteilt, wobei jede Klasse eine bestimmte Art von Entitäten behandelt (dh Entitäten, die sich auf einen Einkaufswagen beziehen, werden möglicherweise von einer einzigen Persistenzklasse behandelt) und von einer und verwendet nur ein Manager.

Zusätzlich speichert diese Ebene auch JPA-Entities , die Dinge wie Account, ShoppingCart usw. sind.

Geschäft

In dieser Ebene befindet sich die gesamte Logik, die mit der Funktionalität der Webanwendung verknüpft ist. Diese Funktion kann eine Überweisung für einen Kunden initiieren, der ein Produkt online mit seiner Kreditkarte bezahlen möchte. Es könnte genauso gut sein, einen neuen Benutzer zu erstellen, einen Benutzer zu löschen oder das Ergebnis eines Kampfes in einem webbasierten Spiel zu berechnen.

Diese Ebene ist in mehrere Klassen unterteilt und jede dieser Klassen ist mit @Stateless, um ein Stateless Session Bean (SLSB) zu werden. Jedes SLSB heißt manager und ein Manager kann beispielsweise eine Klasse sein, die wie erwähnt mit AccountManager bezeichnet wird.

Wenn AccountManager CRUD-Operationen ausführen muss, ruft es eine Instanz von AccountManagerPersistence auf, einer Klasse in der Persistenzschicht. Eine grobe Skizze zweier Methoden in AccountManager könnte sein:

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

Wir verwenden Container-Manager-Transaktionen , damit wir nicht selbst die Transaktionsabgrenzung vornehmen müssen. Was im Grunde genommen unter der Haube passiert, ist, dass wir beim Aufrufen der SLSB-Methode eine Transaktion initiieren und diese unmittelbar vor dem Verlassen der Methode festschreiben (oder zurücksetzen). Es ist ein Beispiel für die Konvention über die Konfiguration, aber wir hatten noch keine Notwendigkeit für etwas anderes als die Standardeinstellung Erforderlich.

Im Java EE 5 Tutorial von Sun wird das Erforderliches Transaktionsattribut für Enterprise JavaBeans (EJBs) erläutert:

Wenn der Client in einer Transaktion ausgeführt wird und die Enterprise-Bean-Methode aufruft, wird die Methode in der Transaktion des Clients ausgeführt. Wenn der Client keiner Transaktion zugeordnet ist, startet der Container eine neue Transaktion, bevor die Methode ausgeführt wird.

Das Required-Attribut ist das implizite Transaktionsattribut für alle Enterprise-Bean-Methoden, die mit einer vom Container verwalteten Transaktionsabgrenzung ausgeführt werden. Normalerweise legen Sie das Required-Attribut nicht fest, es sei denn, Sie müssen ein anderes Transaktionsattribut überschreiben. Da Transaktionsattribute deklarativ sind, können Sie sie später leicht ändern.

Präsentation

Unsere Präsentationsebene ist verantwortlich für ... Präsentation! Es ist für die Benutzeroberfläche verantwortlich und zeigt dem Benutzer Informationen an, indem es HTML-Seiten erstellt und Benutzereingaben über GET und POST Requests) empfängt. Wir verwenden derzeit das alte Servlet ' s + Java Serverseiten ( JSP ) Kombination.

Die Ebene ruft Methoden in Managers der Business-Ebene auf, um vom Benutzer angeforderte Vorgänge auszuführen und Informationen zu erhalten, die auf der Webseite angezeigt werden sollen. Manchmal sind die Informationen, die von der Business-Schicht empfangen werden, weniger komplexe Typen wie String und integers, und zu anderen Zeiten JPA-Entitäten .

Vor- und Nachteile der Architektur

Vorteile

  • Alles, was mit einer bestimmten Art der Persistenz in dieser Ebene zusammenhängt, bedeutet nur, dass wir von der Verwendung von JPA zu etwas anderem wechseln können, ohne etwas in der Business-Ebene neu schreiben zu müssen.
  • Es ist einfach für uns, unsere Präsentationsebene in etwas anderes zu tauschen, und es ist wahrscheinlich, dass wir es tun, wenn wir etwas Besseres finden.
  • Es ist schön, den EJB-Container Transaktionsgrenzen verwalten zu lassen.
  • Die Verwendung von Servlets + JPA ist (zu Beginn) einfach und die Technologien sind weit verbreitet und werden auf vielen Servern implementiert.
  • Die Verwendung von Java EE soll uns die Erstellung eines Hochverfügbarkeitssystems mit Lastausgleich und Failover erleichtern. Beide Wir haben das Gefühl, dass wir haben müssen.

Nachteile

  • Mit JPA können Sie häufig verwendete Abfragen als benannte Abfragen speichern, indem Sie @NamedQuery Anmerkung zur JPA-Entitätsklasse. Wenn Sie so viel wie möglich mit der Persistenz in den Persistenzklassen zu tun haben, wie dies in unserer Architektur der Fall ist, werden die Positionen, an denen Sie möglicherweise Abfragen finden, um auch die JPA-Entitäten einzuschließen, verteilt. Persistenzoperationen sind schwerer zu überblicken und daher schwerer zu warten.
  • Wir haben JPA-Entitäten als Teil unserer Persistenzschicht. Aber Account und ShoppingCart, sind das nicht wirklich Geschäftsobjekte? Dies geschieht auf diese Weise, da Sie diese Klassen berühren und in Entitäten umwandeln müssen, mit denen JPA umgehen kann.
  • Die JPA-Entitäten, die auch unsere Geschäftsobjekte sind, werden wie Data Transfer Objects ( DTO 's, auch als Value Objects (VOs) bezeichnet, erstellt. Dies führt zu einem anämischen Domänenmodell , da die Geschäftsobjekte außer den Zugriffsmethoden keine eigene Logik haben. Die gesamte Logik wird von unseren Managern in der Business-Schicht ausgeführt, was zu einem prozeduralen Programmierstil führt. Es ist kein gutes objektorientiertes Design, aber vielleicht ist das kein Problem? (Schließlich ist die Objektorientierung nicht das einzige Programmierparadigma, das zu Ergebnissen geführt hat.)
  • Die Verwendung von EJB und Java EE bringt ein wenig Komplexität mit sich. Und wir können nicht nur Tomcat verwenden (das Hinzufügen eines EJB-Mikrocontainers ist nicht rein Tomcat) .
  • Es gibt viele Probleme bei der Verwendung von Servlets + JPA. Verwenden Sie Google, um weitere Informationen zu diesen Problemen zu erhalten.
  • Da die Transaktionen beim Verlassen der Business-Schicht geschlossen werden, können wir keine Informationen aus JPA-Entitäten laden, die so konfiguriert sind, dass sie bei Bedarf aus der Datenbank geladen werden (mit fetch=FetchType.LAZY) aus der Präsentationsebene. Es wird eine Ausnahme ausgelöst. Vor der Rückgabe einer Entität, die diese Art von Feldern enthält, müssen wir sicherstellen, dass die relevanten Getter aufgerufen werden. Eine andere Möglichkeit ist, Java Persistence Query Language ( JPQL ) zu verwenden und ein FETCH JOIN. Beide Optionen sind jedoch etwas umständlich.
143
user14070

Ok, ich mache eine (kürzere):

  • Frontend: Tapisserie (3 für ältere Projekte, 5 für neuere Projekte)
  • Geschäftsschicht: Frühling
  • DAO's: Ibatis
  • Datenbank: Oracle

Wir verwenden die Sping-Transaktionsunterstützung und starten die Transaktionen nach dem Eintritt in die Service-Schicht, wobei die Weitergabe an die DAO-Aufrufe erfolgt. Die Service-Schicht verfügt über das meiste Modellwissen, und die DAOs erledigen relativ einfache CRUD-Arbeiten.

Einige kompliziertere Abfragen werden aus Performancegründen von komplizierteren Abfragen im Backend behandelt.

Die Verwendung von Spring in unserem Fall hat den Vorteil, dass es länderspezifische/sprachabhängige Instanzen geben kann, die sich hinter einer Spring-Proxy-Klasse befinden. Basierend auf dem Benutzer in der Sitzung wird beim Tätigen eines Anrufs die korrekte Implementierung in Land/Sprache verwendet.

Das Transaktionsmanagement ist nahezu transparent, Rollback bei Laufzeitausnahmen. Wir verwenden so oft wie möglich ungeprüfte Ausnahmen. Früher haben wir geprüfte Ausnahmen gemacht, aber mit der Einführung von Spring sehe ich die Vorteile von ungeprüften Ausnahmen, die nur behandelt werden, wenn Sie können. Es vermeidet viel Boilerplate "fangen/werfen" oder "wirft" Zeug.

Entschuldigung, es ist kürzer als dein Beitrag. Ich hoffe, du findest das interessant.

20
Rolf

Ideal Java Based Web Development Technologies Today.

Web Layer:

HTML + CSS + Ajax + JQuery

RESTFul Web Controller/Aktion/Anforderungsverarbeitungsebene:

Framework spielen

Geschäftslogik/Serviceschicht:

Verwenden Sie so lange wie möglich Pure Java Code. Hier können Webdienste zusammengeführt werden.

XML/JSon-Datenumwandlungsschicht:

XMLTool (Suche in Google Code), JSoup, Google GSon, XStream, JOOX (Suche in Google Code)

Persistenzschicht:

CRUD: JPA oder SienaProject oder QueryDSL/Complex Queries: JOOQ, QueryDSL

18
Rakesh Waghela

Hier sind meine 5 Cent

Präsentation

Android, Angular.JS WebClient, OAUTHv2

API

REST, Jersey (JAX-RS), Jackson (JSON-De-/Serialisierung), DTO-Objekte (anders als Geschäftslogikmodelle)

Geschäftslogik

Feder für DI und Eventhandling. DDD-ischer Ansatz von Modellobjekten. Länger laufende Jobs werden mit SQS in Worker-Modulen ausgelagert.

DAO

Repository-Modell mit Spring-JDBC-Vorlagen zum Speichern von Entitäten. Redis (JEDIS) für Bestenlisten mit geordneten Listen. Memcache für Token Store.

Datenbank

MySQL, Memcached, Redis

9
Pepster

Was wir in unserem Projekt verfolgt haben, ist:

Frontend-Technologie

  • AngularJS
  • HTML5
  • css3
  • Javascript
  • Bootstrap 3

API

  1. REST
  2. JERSEY (JAX-RS)
  3. SEIEN SIE VERSICHERT
  4. FRÜHLINGSSTIEFEL
  5. Jackson
  6. frühlingssicherheit

Geschäftslogik

  • FRÜHLINGSDATEN

  • SPRING-Daten MongoDB

Datenbank

  • MongoDB

Server (zum Cachen)

  • redis
6
CandleCoder

Wir verwenden immer noch den üblichen Struts-Spring-Hibernate-Stack.

Für zukünftige Apps untersuchen wir Spring Web Flow + Spring MVC + Hibernate oder Spring + Hibernate + Web Services mit Flex-Front-End.

Ein besonderes Merkmal unserer Architektur ist die Modularisierung. Wir haben eine Reihe von Modulen, von denen einige mit 3 bis maximal 30 Tabellen in der Datenbank beginnen. Die meisten Module bestehen aus Geschäfts- und Webprojekten. Das Geschäftsprojekt enthält die Geschäfts- und Persistenzlogik, während das Web die Präsentationslogik enthält.
Auf logischer Ebene gibt es drei Ebenen: Business, Persistenz und Präsentation.
Abhängigkeiten:
Die Präsentation hängt von Geschäft und Ausdauer ab.
Beharrlichkeit hängt vom Geschäft ab.
Das Geschäft hängt nicht von anderen Ebenen ab.

Die meisten Geschäftsprojekte haben drei Arten von Schnittstellen (Anmerkung: keine grafische Benutzeroberfläche, sondern eine programmatische Java Schnittstellenschicht)).

  1. Schnittstelle, die diese Präsentation als Client verwendet
  2. Schnittstelle, die andere Module verwenden, wenn sie der Client des Moduls sind.
  3. Schnittstelle, die für administrative Zwecke des Moduls verwendet werden kann.

Häufig wird 1 durch 2 erweitert. Auf diese Weise kann eine Implementierung des Moduls leicht durch eine andere ersetzt werden. Dies hilft uns, uns an verschiedene Kunden anzupassen und einfacher zu integrieren. Einige Kunden kaufen nur bestimmte Module, und wir müssen bereits vorhandene Funktionen integrieren. Da die Schnittstelle und die Implementierungsebene voneinander getrennt sind, ist es einfach, die Ad-Hock-Modulimplementierung für diesen bestimmten Client zu implementieren, ohne abhängige Module zu beeinträchtigen. Mit Spring Framework ist es einfach, verschiedene Implementierungen zu implementieren.

Unsere Business-Schicht basiert auf POJOs. Eine Tendenz, die ich beobachte, ist, dass diese POJOs DTOs ähneln. Wir leiden unter anämisches Domänenmodell . Ich bin mir nicht ganz sicher, warum dies passiert, aber es kann an der Einfachheit der Problemdomäne vieler unserer Module liegen, die meiste Arbeit ist CRUD oder daran, dass Entwickler es vorziehen, Logik an einem anderen Ort zu platzieren.

4
Dan

Hier ist eine weitere Web-Architektur, an der ich gearbeitet habe:

Eine Hauptanforderung war, dass die Anwendung Handys/andere Geräte unterstützen sollte. Die Anwendung sollte auch erweiterbar oder flexibel auf Änderungen bei der Auswahl der Technologie sein.

Präsentationsebene:

  • JSP/JQuery (clientseitige MVC)
  • Natives Android
  • Einheimisches iPhone
  • Mobiles Web (HTML5/CSS3/Responsive Design)

  • Spring REST Controller (können zu JAX-RS wechseln)

Business Service Tier:

Spring @Service (Kann zu Stateless EJB wechseln)

Datenzugriffsebene:

Spring @Repository (Kann zu Stateless EJB wechseln)

Ressourcenstufe:

Objekte im Ruhezustand (JPA) (Kann in ein beliebiges ORM geändert werden)

Weitere Informationen zu diesem Buch finden Sie hier .

3
Amritendu De

Meiner Meinung nach haben die meisten von uns einen gemeinsamen Nenner. Zumindest im Back-End haben wir eine Art IOC/DI-Container und ein Persistenz-Framework. Persönlich benutze ich Guice und Mybatis dafür. Die Unterschiede bestehen darin, wie wir die Ansichts-/UI-/Präsentationsschicht implementieren. Hier gibt es 2 Hauptoptionen (können mehr sein). Aktionsbasiert (URLs werden Controllern zugeordnet) und komponentenbasiert. Derzeit verwende ich komponentenbasierte Präsentationsebene (mit Wicket). Es ahmt perfekt eine Desktop-Umgebung nach, in der ich Komponenten und Ereignisse anstelle von URLs und Controllern verwende. Bin gerade auf der Suche nach einem Grund, warum ich auf diese Art von URL-Controller-Architektur migrieren sollte (so bin ich auf dieser Seite gelandet). Warum der Hype um RESTful- und Stateless-Architekturen?.

Um diese Frage kurz zu beantworten: Ich schreibe zustandsbehaftete Webanwendungen mit einem komponentenorientierten Framework auf Guice IOC= Container und füge Daten mit Mybatis in relationale Datenbanken ein.

2
joshua

Ein bisschen anders, und ich würde mehr modulare Java Architektur hier behaupten. Wir haben:

  1. Spring WS/Rest/JSP Frontend
  2. Spring MVC für Business-Service-Logik, die Präsentationslogik sowie Spring-Transaktionen enthält
  3. Kommunikationsschnittstelle für Komponentendienste, die von Unternehmensdiensten über EJB nachgeschlagen wird. EJBs legen ihre eigenen Transaktionsgrenzen fest, die Spring-Transaktionen beitreten können.
  4. Komponenten-Service-Implementierungen, wieder Spring-Komponenten
  5. Integrationsschicht, MyBatis für Datenbankintegrationen, Spring WS für Webdienstintegrationen, andere Integrationstechnologien für andere Dienste
  6. Mainframes, Datenbanken, andere Dienste auf anderen Servern ...

Zusätzlich zu den oben genannten Funktionen verfügen wir über die gemeinsam genutzten Bibliotheksmodule, die ein gemeinsamer Funktionsanbieter für alle Services sind.

Die Verwendung verschiedener Schichten ermöglicht uns die vollständige Entkopplung und die erforderliche Modularität. Wir können auch die Leistung von Java EE sowie Spring voll ausnutzen. Nichts hindert uns daran, JSF beispielsweise für das Front-End zu verwenden, falls dies erforderlich ist.

Im Vergleich zur Beispielarchitektur von OP kann dies, wenn auch mit einer gewissen Wendung, als vier statt drei Hauptschichten aufweisend beschrieben werden.

1
eis

Ich habe an Projekten gearbeitet, die dieses starre Manager-Muster verwenden. Historisch gesehen war ich ein großer Befürworter der starren Hierarchie, in der alles in eine ordentliche Schachtel passt. Im Laufe meiner Karriere sehe ich mich in vielen Fällen gezwungen. Ich glaube, dass eine agilere Einstellung zum Anwendungsdesign zu einem besseren Produkt führt. Was ich damit meine, eine Reihe von Klassen zu erstellen, die das vorliegende Problem lösen. Anstatt zu sagen "Hast du einen Manager für dies und das gebaut?"

Das aktuelle Projekt, an dem ich arbeite, ist eine Web-App mit einer Kombination aus Spring MVC- und RestEasy JSON/Ajax-Aufrufen. Auf der Serverseite ist in unseren Controllern eine sinnvolle fassadenbasierte Datenschicht mit JPA/Hibernate für den direkten Datenbankzugriff, einige EJB-Zugriffe und einige SOAP basierte Webdienstaufrufe. Dies alles zusammenzubinden ist Benutzerdefinierter Java Controller-Code, der festlegt, was als JSON serialisiert und an den Client zurückgegeben werden soll.

Wir verbringen fast keine Zeit damit, ein einheitliches Muster zu erstellen, statt uns für die "Schlimmer ist besser" -Idee der Unix-Designphilosophie zu entscheiden. Es ist viel besser, außerhalb der Linien zu färben und etwas Vernünftiges zu bauen, als etwas zu bauen, das sich an eine Reihe strenger Designaufträge hält.

0
nsfyn55

Die Komponenten in Web Application Architecture umfassen:

1: Browser: Client-Interaktion

        HTML
        JavaScript
        Stylesheet

2: Internet

3: Webserver

        CSS
        Image
        Pages(Java render )

4: Anwendungsserver

        App Webapp (Java interaction)
        Others WebApps

5: Datenbankserver

        Oracle, SQL, MySQL

6: Daten

0
iCrazybest