Certo, forse.
- Il trasferimento di dati tra è lento?
Yup! Ma rispetto a cosa? Rispetto alle chiamate interne native, assolutamente - sarà glaciale. Rispetto ad altre API di rete, eh, non necessariamente più lento.
- Se ho fare questo, allora ogni applicazione/modulo deve essere un diritto server HTTP?Quindi, se la mia applicazione utilizza 100 applicazioni/moduli devo avere 100 server web HTTP locale su e esecuzione ognuno con porta diversa (http: // localhost: 81, http://localhost:82, http://localhost:83 e così via)?
Nah, nessun motivo per allocare una porta per modulo. Tutti i modi per farlo.
- Qualsiasi best practice/trucchi che avrei dovuto conoscete?
L'unico modo in cui questo avrà successo è se i servizi di cui si sta parlando sono abbastanza grezzi. Questi devono essere grandi, neri tipi di servizi squisiti che fanno la spesa di chiamarli meritevoli. Si verificheranno costi di connessione, costi di trasferimento dati e costi di marshaling dei dati su ciascuna transazione. Pertanto, si desidera che tali transazioni siano il più rare possibile e si desidera che i payload siano il più ampi possibile per ottenere il massimo beneficio.
Stai parlando effettivamente usando l'architettura REST o semplicemente inviando roba avanti e indietro via HTTP? (Queste sono cose diverse) REST incorre i propri costi, inclusi collegamenti incorporati, tipi di dati comuni e diffusi, ecc.
Infine, potrebbe non essere necessario. Potrebbe essere "abbastanza bello", un "bello da avere", "sembra buono sulla lavagna bianca", ma se, davvero, non ne ha bisogno, allora non farlo. Basta seguire buone pratiche di isolare i propri servizi interni in modo che si dovrebbe decidere in seguito di fare qualcosa di simile, si può semplicemente inserire lo strato di colla necessaria per gestire la comunicazione, ecc Aggiunta di distribuzione remota aumenta il rischio, la complessità e prestazioni inferiori, (scala ! = prestazioni) quindi ci dovrebbe essere un buon motivo per farlo affatto.
Questa, probabilmente, è la "migliore pratica" di tutti.
Edit - Risposta al commento:
Quindi significa che io corro un server web che gestire tutte le richieste in arrivo? Ma poi i moduli non saranno applicazioni standalone , che sconfigge l'intero scopo . Voglio che ognuno dei moduli sia in grado di funzionare da solo.
No, non vanifica lo scopo.
Ecco l'affare.
Supponiamo di avere 3 servizi.
A colpo d'occhio, sarebbe giusto dire che questi sono tre servizi diversi, su 3 macchine diverse, in esecuzione in 3 diversi server web.
Ma la verità è che questi possono essere tutti in esecuzione sulla macchina SAME, sul server Web SAME, anche fino a (per portare questo all'estremo) con la stessa logica.
HTTP consente di mappare tutti i tipi di cose. Lo stesso HTTP è meccanismo di astrazione.
Come cliente tutto quello che ti interessa è l'URL da utilizzare e il carico utile da inviare. A quale macchina finisce per parlare, o quale codice effettivo lo esegue, non il problema dei client.
A livello di architettura, è stata raggiunta una modalità di astrazione e modularizzazione. Gli URL ti consentono di organizzare il tuo sistema indipendentemente dal layout LOGICO che desideri. L'implementazione FISICA è distinta dalla vista logica.
Questi 3 servizi possono essere eseguiti su una singola macchina servita da un singolo processo. D'altra parte, possono rappresentare 1000 macchine. Quante macchine pensi di rispondere a "www.google.com"?
È possibile ospitare facilmente tutti e 3 i servizi su una singola macchina, senza condividere alcun codice, salvare il server Web stesso. Semplificando lo spostamento di un servizio dalla sua macchina originale ad un'altra macchina.
Il nome host è il modo più semplice per associare un servizio a una macchina. Qualsiasi server Web moderno può servire qualsiasi numero di host diversi. Ogni "host virtuale" può servire qualsiasi numero di singoli endpoint di servizio all'interno dello spazio dei nomi di quell'host. A livello di "host" è banale trasferire il codice da una macchina all'altra se e quando è necessario.
È necessario esplorare più funzionalità di un server Web moderno per indirizzare richieste arbitrarie alla logica effettiva sul server. Li troverai molto flessibili.
"Nah, nessun motivo per allocare una porta per modulo. Tutti i modi per farlo." Potresti elaborare. Se ogni modulo/applicazione è un server Web locale, come possono essere utilizzati senza essere eseguiti su porte diverse? – ajsie
Come altri hanno già menzionato, non eseguirli su server Web separati. Un singolo server web può gestire qualsiasi numero di applicazioni. È tutto basato sulle risorse del server. Considera un sacco di script CGI, tutti organizzati in un albero di directory. Si consideri un server di applicazioni Web Java, ciascuna WAR distribuita singolarmente ma ognuna con il proprio contesto dallo stesso URL host. Oppure considera Virtual Hosting, un singolo server web che ospita 100 host diversi, tutti con lo stesso IP e la stessa porta. Queste sono tutte tecniche per la distribuzione di più applicazioni su un singolo server. –
Quindi intendi che eseguo UN server web che gestisce tutte le richieste in arrivo? Ma poi i moduli non saranno applicazioni stand-alone, che sconfigge l'intero scopo.Voglio che ognuno dei moduli sia in grado di funzionare da solo. – ajsie