Buon design per i delegati in un'architettura orientata ai servizi

4

Il mio problema è abbastanza complesso da spiegare e il mio inglese non è eccellente, quindi spero che tu possa capire la mia domanda.

In un'architettura orientata ai servizi ci sono alcuni moduli che possiedono i dati utilizzati da tutte le altre applicazioni e questi moduli espongono i dati tramite Remote Method Invocation e Web Services.

Noi sviluppatori del modulo abbiamo visto che il codice che richiama questi moduli è ripetuto in tutti gli altri moduli, quindi abbiamo deciso di mettere in comune il codice e creato un nuovo modulo chiamato Delegati comuni . Le responsabilità di questo nuovo modulo sono:

  • mantieni informazioni sul nome host, sulla porta e sui nomi JNDI e / o dei servizi web;
  • istanziare e utilizzare il localizzatore di servizio;
  • istanzia e chiama gli stub ai moduli remoti.

Ma i metodi esposti dai moduli Delegati comuni usano le stesse classi di richiesta e risposta che sono definite nei moduli chiamati. Ciò significa che questo modulo non agisce come un livello di disaccoppiamento.

In alcuni casi questo modulo ha creato problemi di dipendenze circolari durante le build di maven.

È una buona cosa dividere il modulo Delegati comuni in molti diversi artefatti Maven per evitare dipendenze circolari, una per il modulo chiamato? Per esempio se devo chiamare via RMI il modulo A, dovrò usare il modulo A delegato .

È una buona cosa rendere questo delegato anche un livello di disaccoppiamento, nel senso che esporrà i propri bean di richiesta e risposta e li trasformerà nei bean usati dai metodi chiamati?

    
posta Виталий Олегович 02.03.2013 - 15:07
fonte

1 risposta

1

quindi il tuo problema è che i servizi si chiameranno a vicenda, se suppongo, che i servizi stessi non hanno una dipendenza circolare, quindi devi creare 2 delegati per ciascun servizio, uno è un delegato per registrare il servizio, l'altro è un delegato a cercare un servizio.

dove ciascun delegato estenderà un delegato astratto che detiene la logica per registrare o cercare un servizio. e devi separare la tua interfaccia in un proprio jar.

allora hai:

interface UserService{}

interface EmailService{}

class UserServiceImpl implements UserService{
 }

class EmailServiceImpl implements EmailService{
 use UserServiceLookup
 }

class abstract BindDelegate{}

class abstract LookupDelegate{}

class UserServinceBindDel extends BindDelegate{
 use UserServiceImpl
 }

class EmailServiceBindDel extends BindDelegate{
use EmailServiceImpl
 }

class UserServiceLookup extends LookupDelegate{
 use UserService
 }

class EmailServiceLookup extends LookupDelegate{
   use EmailService
 } 

in questo caso anch'io rinominerei BindDelegate solo per Binder e LookupDelegate solo per Resolver o Lookup

ma un modo migliore sarebbe quello di evitare questa delega, perché come vedi c'è un sacco di codice, quindi ora salvi alcune linee di codice per la risoluzione e l'associazione, ma devi scrivere sempre 2 nuove classi.

in tal caso hai bisogno di RMI, andrei a fare un generatore. il generatore analizzerà il tuo codice, una configurazione durante o qualcos'altro, e da queste informazioni genererà le classi server, stub e scheletri.

quindi devi solo scrivere il generatore una volta, e questo è tutto. la duplicazione del codice viene eseguita dal generatore. se hai bisogno di cambiarlo, cambia il generatore, eseguilo e hai cambiato il codice per tutti i servizi.

Se non vuoi scrivere il generatore da solo, dai un'occhiata a questo

link

esiste un generatore open source pronto con molte risorse aggiuntive per RMI e servizi remoti.

Se RMI non è necessario, è possibile passare a Servizi REST come esempio, con REST, è possibile creare un singolo delegatore che sarà in grado di chiamare tutti gli altri servizi, senza avere una dipendenza circolare perché effettua semplicemente una chiamata http a un altro url, con un'altra stringa json, i servizi sono accoppiati.

    
risposta data 05.03.2013 - 17:49
fonte

Leggi altre domande sui tag