2011-11-02 20 views
5

Ho un'applicazione Grails abbastanza convenzionale. È monolitico; anche se è un po 'diviso in plugin lungo le linee di funzionalità, è incorporato in una singola guerra per la distribuzione. A causa dei vincoli architettonici dell'azienda, devo considerare di isolare la persistenza dell'app in un servizio Web (o una serie di servizi Web). Qual è l'approccio migliore per dividere un'applicazione Grails in un servizio di persistenza e un'applicazione di presentazione?Qual è il modo migliore per dividere un'applicazione Grails in servizi Web e una presentazione?

+0

hai risposto a molte delle tue domande già nell'affermazione che devi prendere in considerazione servizi Web e un livello di presentazione :) Stai cercando una guida più sull'architettura o sulle scelte tecnologiche?Immagino che la presentazione verrà distribuita su una DMZ e separata dal livello dei servizi da un firewall .. hai altri vincoli architettonici che potrebbero influenzare materialmente una risposta? – darrend

+0

Sto cercando una soluzione Grails-centrica. Mi sembra che la semantica esistano già per la piattaforma per aiutarmi. Considera due estremi: (1) fai notare un plug-in "magic bullet" che trasforma istantaneamente il mio controller, taglib e codice di servizio in modo da renderlo remoto e produce un build di servizi Web per le mie classi di dominio, o (2) tu spiega che Grails è completamente inadatto a separare la presentazione e la persistenza in questo modo. Né è ragionevole, certo, ma nel mezzo, potresti suggerire un modo per sfruttare ciò che ho in un modo che si adatta perfettamente al paradigma di Grails. –

+0

Qual è il motivo dietro al firewall del database, ma consente di eseguire operazioni tramite un servizio Web? Ti aspetti una maggiore sicurezza? Non vedo come possa migliorare la sicurezza. – Antoine

risposta

0

Non ho una soluzione pronta per il tuo problema e non credo che ce ne sia uno. Spiegherò solo la soluzione che uso e ciò che prenderei in considerazione nel tuo caso.

Nella mia organizzazione, il nostro approccio è quello di separare le nostre applicazioni in un back-end Grails e un front-end in Flex. La ragione è che disponiamo di molti componenti Flex pronti all'uso che richiederebbero troppo tempo per essere implementati utilizzando tecnologie web pure, ma non è questo il punto.

La creazione di un back-end REST in Grails è rapida, poiché le viste sono impalcature quando appropriato, i controller sono semplici e la convalida dell'input è notevolmente semplificata dai vincoli di Dominio.

Lo svantaggio di questa divisione è che la definizione di oggetti dominio deve essere duplicata nel front-end. Potresti includere la convalida degli oggetti nel front-end o meno, ma se li ometti, avrà un'influenza sulla reattività dell'interfaccia utente (richieste al back-end REST nelle chiamate AJAX per la convalida in tempo reale per ottenere gli errori) . Alla fine, la nostra applicazione è piuttosto ingombrante perché modificare gli oggetti nel back-end implica modifiche nel front-end. Inoltre, eseguiamo la convalida sia nel front-end che nel back-end, e questo codice non è condiviso, quindi deve rimanere in fase e mantenuto in due punti.

Le nostre applicazioni sono divise in modo simile a due applicazioni Grails completamente distinte che non condividono alcun codice. Una soluzione che funzionerebbe nel tuo caso ma non è quello che stai cercando, di sicuro.

Nel tuo caso, vedo due soluzioni valide per il web front-end:

  • utilizzano la Groovy REST client library per andare a prendere e mandare indietro gli oggetti del dominio direttamente dal controller. Se necessario, comprimili in oggetti di comando che riflettono gli oggetti del dominio, in modo da poter condividere il codice di convalida con il back-end.

  • creare una specie di REST GORM che sostituisce Hibernate con query al servizio Web REST. Si può guardare allo GORM for Mongo Plugin come esempio di come creare tale sostituzione GORM.

Mi piace l'ultima idea, sarebbe un utile plug-in pubblico. Non esiste ancora, sfortunatamente.

+0

Anche a me piace la tua ultima idea. Mi piacerebbe l'esperienza di fare acquisti con GORM e il vantaggio per il pubblico potrebbe essere significativo se andrà a buon fine. –

+1

Buona fortuna con quello :) Non esiste uno standard universale per le API REST e ognuno deve essere considerato in base al merito. La qualità varia in modo significativo. A differenza dei metodi di mappatura della meta-classe in un back-end di database diverso in cui l'integrazione è corretta, è necessario fornire al programmatore un modo per associare i metodi all'API REST specifica che desiderava utilizzare. Per quanto sia intrattabile la complessità se è anche possibile, avrei pensato. Alcune buone considerazioni sul design RESTful su apigee.com tra l'altro, non ultimo questo: http://blog.apigee.com/detail/restful_api_design/ – darrend

1

Inserisci le tue classi di dominio in un plug-in Grails e disponi di due distinte applicazioni Grails, una per il tuo Web front-end e una per il tuo servizio web. Entrambi accedono direttamente al database, ma il codice per la persistenza non viene duplicato.

Ecco uno blog post che ha alcuni ulteriori dettagli su come realizzarlo.

+0

Il post sul blog è eccellente - ti sono grato per avermi fatto notare. Tuttavia, non ero abbastanza esplicito nella descrizione del mio problema. Considera me * proibito * dall'accedere al database direttamente dalla mia applicazione. Invece, devo operare la presenza sul web da un'applicazione esterna che non comunica con il database, salvo attraverso un servizio web. Ancora, collocare tutti gli oggetti di dominio in un plugin è una linea di pensiero interessante. –

+0

Manteniamo le nostre classi di dominio in un plug-in Grails in modo che alcune delle nostre app Grails possano utilizzare lo stesso database. Funziona bene. – erturne

Problemi correlati