Descrivere l'architettura utilizzata per le applicazioni web Java? [chiuso]


Condividiamo le architetture di applicazioni web basate su Java!

Ci sono molte architetture diverse per le applicazioni web che devono essere implementate usando Java. Le risposte a questa domanda possono servire come una libreria di vari progetti di applicazioni web con i loro pro e contro. Mentre mi rendo conto che le risposte saranno soggettive, cerchiamo di essere il più obiettivo possibile e motivare i pro ei contro che elenchiamo.

Usa il livello di dettaglio che preferisci per descrivere la tua architettura. Affinché la tua risposta sia di qualsiasi valore dovrai almeno descrivere le principali tecnologie e idee utilizzate nell'architettura che descrivi. E, ultimo ma non meno importante, quando dovremmo usare la tua architettura?

Inizierò...


Panoramica dell'architettura

Utilizziamo un'architettura a 3 livelli basata su standard aperti di Sun come Java EE, Java Persistence API, Servlet e Java Server Pagina.

  • Persistenza
  • Affari
  • Presentazione

I possibili flussi di comunicazione tra i livelli sono rappresentati da:

Persistence <-> Business <-> Presentation

Che ad esempio significa che il livello di presentazione non chiama mai o esegue operazioni di persistenza, lo fa sempre attraverso il livello aziendale. Questa architettura è pensata per soddisfare le esigenze di un'applicazione Web ad alta disponibilità.

Persistenza

Esegue la creazione, la lettura, aggiornamento ed eliminazione ( CRUD ) operazioni di persistenza. Nel nostro caso stiamo usando ( Java Persistence API ) JPA e attualmente usiamo Hibernate come fornitore di persistenza e usiamo il suo EntityManager.

Questo livello è diviso in più classi, in cui ogni classe si occupa di un determinato tipo di entità (cioè le entità relative a un carrello possono essere gestite da una singola classe di persistenza) ed è utilizzato da uno e solo uno gestore .

Inoltre questo livello memorizza anche entità JPA che sono cose come Account, ShoppingCart ecc.

Affari

Tutta la logica legata alla funzionalità dell'applicazione Web si trova in questo livello. Questa funzionalità potrebbe essere l'avvio di un trasferimento di denaro per un cliente che vuole pagare per un prodotto on-line utilizzando la sua carta di credito. Potrebbe anche essere la creazione di un nuovo utente, l'eliminazione di un utente o il calcolo dell'esito di una battaglia in un gioco basato sul web.

Questo livello è diviso in più classi e ciascuna di queste classi è annotata con @Statelessper diventare un bean di sessione Stateless (SLSB). Ogni SLSB è chiamato manager e ad esempio un manager potrebbe essere una classe annotata come detto chiamata AccountManager.

Quando AccountManager deve eseguire operazioni CRUD, effettua le chiamate appropriate a un'istanza di AccountManagerPersistence, che è una classe nel livello di persistenza. Uno schizzo approssimativo di due metodi in AccountManager potrebbe essere:

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

Usiamo transazioni di container manager quindi non dobbiamo fare la demarcazione delle transazioni da soli. Quello che succede fondamentalmente sotto il cofano è che iniziamo una transazione quando entriamo nel metodo SLSB e la commit (o rollback) immediatamente prima di uscire dal metodo. È un esempio di convenzione sulla configurazione, ma non abbiamo ancora avuto bisogno di altro che di default, Richiesto.

Ecco come il tutorial Java EE 5 di Sun spiega il Attributo di transazione richiesto per JavaBeans Enterprise (EJB):

Se il client è in esecuzione all'interno di un transazione e richiama l'impresa metodo di bean, il metodo viene eseguito all'interno della transazione del cliente. Se il client non è associato a transazione, il contenitore avvia un nuova transazione prima di eseguire il metodo.

L'attributo Richiesto è l'implicito attributo transazione per tutti metodi bean aziendali in esecuzione con transazione gestita dal contenitore demarcazione. In genere non si imposta l'attributo richiesto a meno che non sia necessario per sovrascrivere un'altra transazione attributo. Perché transazione gli attributi sono dichiarativi, puoi facilmente cambiarli in seguito.

Presentazione

Il nostro livello di presentazione è responsabile... presentazione! È responsabile dell'interfaccia utente e mostra le informazioni all'utente creando pagine HTML e ricevendo l'input dell'utente tramite GET e POST richiesta. Attualmente stiamo utilizzando la vecchia combinazione Servlet + Java Server Pages ( JSP ).

Il livello chiama i metodi in manager del livello aziendale per eseguire le operazioni richieste dall'utente e per ricevere informazioni da mostrare nella pagina web. A volte le informazioni ricevute dal livello aziendale sono tipi meno complessi come Stringe integer, e altre volte entità JPA .

Pro e contro con il architettura

Pro

  • Avere tutto ciò che riguarda un modo specifico di fare persistenza in questo livello significa solo che possiamo passare dall'uso di JPA a qualcos'altro, senza dover riscrivere nulla nel livello aziendale.
  • È facile per noi scambiare il nostro livello di presentazione in qualcos'altro, ed è probabile che lo faremo se troviamo qualcosa di meglio.
  • Lasciare che il contenitore EJB gestisca i limiti delle transazioni è bello.
  • Utilizzo di Servlet + JPA è facile (per cominciare) e le tecnologie sono ampiamente utilizzate e implementate in molti server.
  • L'utilizzo di Java EE dovrebbe facilitare la creazione di un sistema ad alta disponibilità con bilanciamento del carico e failover . Entrambi i quali sentiamo che dobbiamo avere.

Contro

  • Utilizzando JPA è possibile memorizzare le query utilizzate spesso come query denominate utilizzando l'annotazione @NamedQuery nella classe di entità JPA. Se hai il più possibile correlato per la persistenza nelle classi di persistenza, come nella nostra architettura, questo distribuirà le posizioni in cui è possibile trovare query per includere anche le entità JPA. Sarà più difficile per le operazioni di persistenza panoramica e quindi più difficile da mantenere.
  • Abbiamo entità JPA come parte del nostro livello di persistenza. Ma Account e ShoppingCart, non sono davvero oggetti di business? È fatto in questo modo poiché devi toccare queste classi e trasformarle in entità che JPA sa come gestire.
  • Le entità JPA, che sono anche i nostri business objects, vengono create come Oggetti di trasferimento dati ( DTO), noti anche come Oggetti di valore (VO). Ciò si traduce in un modello di dominio anemico poiché gli oggetti di business non hanno logica propria tranne i metodi di accesso. Tutta la logica viene eseguita dai nostri manager nel livello aziendale, il che si traduce in uno stile di programmazione più procedurale. Non è un buon design orientato agli oggetti, ma forse non è un problema? (Dopo tutto l'oggetto l'orientamento non è l'unico paradigma di programmazione che ha dato risultati.)
  • L'utilizzo di EJB e Java EE introduce un po ' di complessità. E non possiamo usare puramente Tomcat (aggiungere un micro-contenitore EJB non è puramente Tomcat).
  • Ci sono molti problemi con l'utilizzo di Servlet + JPA. Utilizzare Google per ulteriori informazioni su questi problemi.
  • Poiché le transazioni vengono chiuse quando si esce dal livello aziendale, non è possibile caricare alcuna informazione dalle entità JPA che configurato per essere caricato dal database quando è necessario (usando fetch=FetchType.LAZY) dall'interno del livello di presentazione. Attiverà un'eccezione. Prima di restituire un'entità contenente questi tipi di campi, dobbiamo essere sicuri di chiamare i getter pertinenti. Un'altra opzione è usare Java Persistence Query Language (JPQL) e fare un FETCH JOIN. Tuttavia entrambe queste opzioni sono un po ' ingombranti.
Author: user14070 , 2008-11-13

10 answers

Ok ne farò uno (più breve):

  • Frontend: Tapestry (3 per i progetti precedenti, 5 per i progetti più recenti)
  • Strato aziendale: Primavera
  • Di DAO : Ibatis
  • Dati di riferimento : Oracle

Usiamo il supporto per le transazioni Sping e iniziamo le transazioni entrando nel livello di servizio, propagandosi fino alle chiamate DAO. Il livello di servizio ha la conoscenza del modello più bussines e i DAO fanno un lavoro CRUD relativamente semplice.

Qualche query più complicata le cose sono gestite da query più complicate nel back-end per motivi di prestazioni.

I vantaggi dell'utilizzo di Spring nel nostro caso sono che possiamo avere istanze dipendenti dal paese/lingua, che si trovano dietro una classe Proxy Spring. In base all'utente nella sessione, l'implementazione corretta del paese/lingua viene utilizzata quando si esegue una chiamata.

La gestione delle transazioni è quasi trasparente, rollback sulle eccezioni di runtime. Usiamo eccezioni non controllate il più possibile. Abbiamo usato per fare controllato eccezioni, ma con l'introduzione di Spring vedo i vantaggi delle eccezioni non controllate, gestendo solo le eccezioni quando è possibile. Evita un sacco di roba da "catch/rethrow" o "getta".

Mi dispiace che sia più breve del tuo post, spero che lo trovi interessante...

 18
Author: Rolf, 2016-10-31 20:09:31

Ideale Java basato tecnologie di sviluppo Web oggi.

Livello web:

Per maggiori informazioni: ]}

Livello di elaborazione del controller Web RESTful/azione/richiesta:

Gioca Quadro

Logica aziendale/livello di servizio:

Usa il codice Java puro il più a lungo possibile. Si può fare fusione di servizi web qui.

Livello di trasformazione dei dati XML/JSon:

XMLTool (Ricerca sul codice Google), JSoup, Google GSon, XStream, JOOX (Ricerca su Google Codice)

Livello di persistenza:

CRUD: JPA o SienaProject o QueryDSL / Query complesse: JOOQ, QueryDSL

 18
Author: Rakesh Waghela, 2011-08-22 12:08:54

Ecco i miei 5 centesimi

Presentazione

Android, Angolare.JS WebClient, OAUTHv2

API

REST, Jersey (JAX-RS), Jackson (de-/serializzazione JSON), oggetti DTO (diversi dai modelli di logica di business)

Logica aziendale

Molla per DI e la gestione degli eventi. Approccio DDD-ish degli oggetti modello. I lavori in esecuzione più lunghi vengono scaricati con SQS nei moduli worker.

DAO

Modello di repository con primavera JDBC-modelli per memorizzare le entità. Redi (JEDIS) per le classifiche, utilizzando liste ordinate. Memcache per negozio Token.

Banca dati

MySQL, Memcached, Redis

 9
Author: Pepster, 2015-08-23 16:42:44

Quello che abbiamo seguito nel nostro progetto è:

Tecnologia front end

  • AngularJS
  • HTML5
  • css3
  • Javascript
  • Bootstrap 3

API

  1. RIPOSO
  2. MAGLIA (JAX-RS)
  3. STAI TRANQUILLO
  4. AVVIO A MOLLA
  5. Jackson
  6. molla di sicurezza

Logica aziendale

  • DATI DI PRIMAVERA

  • Dati di PRIMAVERA MongoDB

Base di dati

  • MongoDB

Server (Per la memorizzazione nella cache)

  • redis
 7
Author: CandleCoder, 2015-09-28 11:38:40

Stiamo ancora usando il solito stack Struts-Spring-Hibernate.

Per le applicazioni future, stiamo esaminando Spring Web Flow + Spring MVC + Hibernate o Primavera + Ibernazione + Servizi Web con front-end Flex.

Una caratteristica distintiva della nostra architettura è la modularizzazione. Abbiamo un numero di moduli, alcuni a partire da 3 a max 30 tabelle nel database. La maggior parte dei moduli sono costituiti da business e web project. Il progetto di business tiene la logica di business e persistenza mentre il web tiene logica di presentazione.
A livello logico, ci sono tre livelli: Business, Persistenza e Presentazione.
Dipendenze:
La presentazione dipende dal business e dalla persistenza.
La persistenza dipende dal business.
Il business non dipende da altri livelli.

La maggior parte dei progetti di business hanno tre tipi di interfacce (nota: non GUI, è un livello di interfaccia java programatic).

  1. Interfaccia che la presentazione utilizza come client
  2. Interfaccia che altro i moduli vengono utilizzati quando sono il client del modulo.
  3. Interfaccia che può essere utilizzata per scopi amministrativi del modulo.

Spesso, 1 estende 2. In questo modo, è facile sostituire un'implementazione del modulo con un'altra. Questo ci aiuta ad adottare a diversi clienti e integrare più facilmente. Alcuni clienti compreranno solo determinati moduli e abbiamo bisogno di integrare funzionalità che già hanno. Poiché l'interfaccia e il livello di implementazione sono separati, è facile da rotolare out implementazione del modulo ad-hock per quel client specifico senza influenzare i moduli dipendenti. E Spring Framework rende facile iniettare diverse implementazioni.

Il nostro livello di business è basato su POJO. Una tendenza che sto osservando è che questi POJO assomigliano a DTO. Soffriamo di modello di dominio anemico . Non sono abbastanza sicuro perch sta succedendo questo ma pu essere dovuto a semplicit di dominio di problema di molti dei nostri moduli, la maggior parte del lavoro CRUD o dovuto a sviluppatori preferendo posizionare la logica da qualche altra parte.

 4
Author: Dan, 2009-03-17 16:37:05

Ecco un'altra architettura web su cui ho lavorato:

Un requisito importante era che l'applicazione dovesse supportare i cellulari / altri dispositivo. L'applicazione dovrebbe anche essere estensibile o flessibile per cambiamenti nelle scelte tecnologiche.

Livello di presentazione:

  • JSP / jQuery (MVC lato client)
  • Android nativo
  • iPhone nativo
  • Web mobile (HTML5 / CSS3 / Reattivo progettazione)

  • Controller di RIPOSO a molla (può cambiare in JAX-RS)

Livello di servizio aziendale:

Spring @ Service (può cambiare in Stateless EJB)

Livello di accesso ai dati:

Spring @Repository (può cambiare in EJB Stateless)

Livello risorse:

Hibernate(JPA) entità (Può cambiare a qualsiasi ORM)

Puoi trovare maggiori informazioni sul libro che segue questa architettura qui.

 3
Author: Amritendu De, 2014-11-02 18:17:32

IMHO, la maggior parte di noi ha un denominatore comune. Almeno nel back-end, abbiamo una qualche forma di contenitore IOC/DI e un framework di persistenza. Personalmente uso Guice e Mybatis per questo. Le differenze sono nel modo in cui implementiamo il livello vista / UI / presentazione. Ci sono 2 opzioni principali qui (potrebbe essere più).. Basato su azioni (URL mappati ai controller) e basato su componenti. Attualmente sto usando il livello di presentazione basato su componenti (usando wicket). Imita perfettamente un ambiente desktop in cui uso componenti ed eventi al contrario di URL e controller. Attualmente sto cercando un motivo per cui dovrei migrare a questo tipo di architettura URL-controller (è così che sono finito su questa pagina). Perché l'hype sulle architetture RESTful e Stateless.

Per rispondere a questa domanda in breve: scrivo applicazioni Web stateful utilizzando un framework orientato ai componenti in cima al contenitore IOC Guice e inserisco i dati nel database relazionale usando Mybatis.

 2
Author: joshua, 2013-12-17 18:56:55

Un po ' diverso, e rivendicherei un'architettura java più modulare qui. Abbiamo:

  1. Molla WS/Rest/JSP front end
  2. Spring MVC per la logica del servizio business, contenente la logica del livello di presentazione e le transazioni Spring
  3. Component service communication interface, guardato attraverso EJB da servizi alle imprese. Gli EJB impostano i propri limiti di transazione che sono in grado di unire le transazioni Spring.
  4. Implementazioni del servizio componenti, di nuovo Primavera componenti
  5. Livello di integrazione, MyBatis per integrazioni di database, Spring WS per integrazioni di servizi web, altre tecnologie di integrazione per altri servizi
  6. Mainframe, database, altri servizi su altri server...

In aggiunta a quanto sopra, abbiamo i moduli di libreria condivisa che è un provider di funzionalità comune per tutti gli srevices.

L'uso di diversi livelli ci consente il disaccoppiamento completo e la modularità di cui abbiamo bisogno. Siamo anche in grado di utilizzare pienamente il potenza di Java EE così come la primavera. Nulla ci impedisce di usare JSF, ad esempio, per il front-end se necessario.

Rispetto all'architettura di esempio di OP, penso che questo possa essere descritto come avente quattro livelli principali invece di tre, anche se con una torsione.

 1
Author: eis, 2014-06-02 20:21:47

Ho lavorato su progetti che utilizzano quel modello di gestore rigido. Storicamente, ero un enorme sostenitore della rigida gerarchia in cui tutto si inseriva in una scatola ordinata. Mentre progredisco nella mia carriera trovo che sia costretto in molti casi. Credo che l'adozione di una mentalità più agile verso la progettazione delle applicazioni porti a un prodotto migliore. Cosa intendo con questo creando un insieme di classi che risolvono il problema in questione. Piuttosto che dire " Hai costruito un manager per questo e quello?"

Il il progetto corrente su cui sto lavorando è un'app web con una combinazione di Spring MVC e RestEasy chiamate JSON/Ajax. Sul lato server incorporato nei nostri controller è un livello di dati basato su facciata sensibile con JPA / Hibernate per l'accesso diretto al database, alcuni accessi EJB e alcune chiamate di servizio Web basate su SOAP. Legare tutto questo insieme è un codice di controller java personalizzato che determina cosa serializzare come JSON e tornare al client.

Non passiamo quasi tempo a cercare di creare un pattern invece optando per adottare l'idea" Peggio è meglio " della filosofia di progettazione Unix. Essendo che è molto meglio colorare al di fuori delle linee e costruire qualcosa di sensato, rapidamente di quanto non sia costruire qualcosa che aderisca a un gruppo di rigidi mandati di progettazione.

 0
Author: nsfyn55, 2011-08-22 12:41:52

I componenti in Web Application Architecture includono:

1: Browser: Interazione con il client

        HTML
        JavaScript
        Stylesheet

2: Internet

3: Webserver

        CSS
        Image
        Pages(Java render )

4: Server delle applicazioni

        App Webapp (Java interaction)
        Others WebApps

5: Server di database

        Oracle, SQL, MySQL

6 : Dati

 0
Author: iCrazybest, 2014-09-14 16:36:05