Vantaggi dell'utilizzo di server API e UI separati per l'applicazione Web


17

Al lavoro, abbiamo una vasta applicazione interna che è in fase di sviluppo da quasi 2 anni; Mi sono appena unito al progetto e parte dell'architettura mi ha lasciato un po 'perplesso, quindi spero che qualcuno qui possa fornire qualche consiglio prima di uscire per porre agli architetti queste stesse domande (così posso avere una discussione informata con loro ).

Mi scuso se il seguito è un po 'lungo, voglio solo provare a disegnare una buona immagine di ciò che il sistema è prima di porre la mia domanda :)

  • Il modo in cui il sistema è configurato è che abbiamo un'applicazione web principale (asp.net, AngularJS) che per lo più aggrega solo i dati di vari altri servizi. Quindi sostanzialmente è un host per un'applicazione AngularJS; esiste letteralmente un controller MVC che avvia il lato client e quindi ogni altro controller è un controller WebAPI.

  • Le chiamate dal lato client vengono gestite da questi controller, che vengono sempre distribuiti in caselle che non fanno altro che ospitare l'applicazione Web. Al momento abbiamo 4 scatole di questo tipo.

  • Tuttavia, le chiamate vengono infine instradate a un altro set di applicazioni WebAPI (in genere si tratta di aree di business, quali sicurezza, dati dei clienti, dati dei prodotti, ecc.). Tutte queste API Web vengono distribuite anche in box dedicati; abbiamo anche 4 di queste scatole.

  • Con una sola eccezione, queste API Web non sono utilizzate da altre parti della nostra organizzazione.

  • Infine, queste WebAPI effettuano ancora un altro set di chiamate ai servizi "back-end", che sono in genere servizi legacy asmx o wcf che vengono schiacciati su vari sistemi ERP e archivi dati (sui quali non abbiamo alcun controllo).

  • La maggior parte della logica aziendale della nostra applicazione si trova in questi WebApis, come la trasformazione dei dati legacy, l'aggregazione, l'esecuzione delle regole aziendali, il solito tipo di cose.

Ciò che mi ha confuso è quale possibile beneficio ci sia nell'avere una tale separazione tra la WebApplication e le WebAPI che la servono. Dato che nessun altro li sta usando, non vedo alcun vantaggio in termini di scalabilità (vale a dire che non ha senso inserire altre 4 caselle API per gestire un carico maggiore, poiché un carico maggiore sui server API deve significare che c'è un carico maggiore sui server Web - pertanto deve esserci un rapporto 1: 1 tra server Web e server Api)

  • Inoltre non vedo alcun vantaggio nel dover effettuare una chiamata HTTP aggiuntiva Browser => HTTP => WebApp => HTTP => WebAPI => HTTP => Servizi di back-end. (quella chiamata HTTP tra WebApp e WebAPI è il mio problema)

  • Quindi sto attualmente cercando di spingere per spostare le attuali WebAPI da soluzioni separate, a soli progetti separati all'interno della soluzione WebApplication, con semplici riferimenti di progetto in mezzo e un singolo modello di distribuzione. Quindi alla fine diventerebbero solo biblioteche di classe.

  • Per quanto riguarda la distribuzione, ciò significa che avremmo 8 caselle Web "full stack", anziché 4 + 4.

I vantaggi che vedo del nuovo approccio sono

  • Aumento delle prestazioni perché esiste un ciclo in meno di serializzazione / deserializzazione tra l'applicazione Web e i server WebAPI
  • Tonnellate di codice che possono essere cancellate (cioè non c'è bisogno di mantenere / testare) in termini di DTO e mapper ai confini in uscita e in entrata rispettivamente dei server Web Application e WebApi.
  • Migliore capacità di creare test di integrazione automatizzati significativi, perché posso semplicemente deridere i servizi di back-end ed evitare il disordine attorno ai salti HTTP di livello intermedio.

Quindi la domanda è: sbaglio? Ho perso qualche "magia" fondamentale di aver separato le caselle WebApplication e WebAPI?

Ho fatto ricerche su alcuni materiali dell'architettura di livello N ma non riesco a trovare nulla in essi che possa dare un beneficio concreto alla nostra situazione (dal momento che la scalabilità non è un problema per quanto posso dire, e questa è un'app interna quindi la sicurezza in termini di applicazioni WebAPI non è un problema.)

Inoltre, cosa perderei in termini di benefici se dovessi riorganizzare il sistema alla configurazione proposta?


Se tutte e 8 le scatole sono davvero sotto il tuo controllo, non riesco a pensare a nessuna buona ragione per la separazione. Sai se avevano una proprietà separata in passato?
Ixrec,

@Ixrec: sì, tutte e 8 le caselle appartengono all'organizzazione e l'applicazione è solo interna al 100%. Sospetto che la separazione sia stata originariamente progettata in parte perché un altro gruppo interno possedeva l'infrastruttura (molta politica) e in parte perché qualcuno diceva "N-Tier" e tutti lo seguivano.
Stephen Byrne,

Risposte:


25

Una ragione è la sicurezza - se (haha! Quando ) un hacker ottiene l'accesso al tuo server Web front-end, ottiene l'accesso a tutto ciò a cui ha accesso. Se hai inserito il tuo livello intermedio nel web server, allora ha accesso a tutto ciò che ha - vale a dire il tuo DB, e la prossima cosa che sai, ha appena eseguito "seleziona * dagli utenti" sul tuo DB e lo ha rimosso da offline cracking password.

Un altro motivo è il ridimensionamento: il livello Web in cui le pagine sono costruite e modificate ed elaborate XML e tutto ciò richiede molta più risorsa rispetto al livello intermedio, che è spesso un metodo efficiente per ottenere dati dal DB al livello Web. Per non parlare del trasferimento di tutti quei dati statici che risiedono (o sono memorizzati nella cache) sul server web. L'aggiunta di più server Web è un'operazione semplice dopo aver superato 1. Non dovrebbe esserci un rapporto 1: 1 tra livelli Web e livelli logici - ho già visto 8: 1 prima (e un rapporto 4: 1 tra logica livello e DB). Dipende da cosa fanno i tuoi livelli e da quanta cache si ripete in essi.

I siti Web non si preoccupano davvero delle prestazioni per singolo utente poiché sono costruiti su scala, non importa che ci sia una chiamata in più che rallenta un po 'le cose se ciò significa che puoi servire più utenti.

Un altro motivo per cui può essere utile avere questi livelli è che impone maggiore disciplina nello sviluppo in cui viene sviluppata un'API (e facilmente testata in quanto autonoma) e quindi l'interfaccia utente sviluppata per consumarla. Ho lavorato in un posto che ha fatto questo: diversi team hanno sviluppato diversi livelli e ha funzionato bene dato che avevano specialisti per ogni livello che potevano dare il via ai cambiamenti molto velocemente perché non dovevano preoccuparsi degli altri livelli - cioè un dev javscript dell'interfaccia utente potrebbe aggiungere una nuova sezione al sito semplicemente consumando un nuovo servizio web sviluppato da qualcun altro.


grazie per la prospettiva. Non avevo considerato il lavoro extra svolto dalla costruzione di pagine, ecc. Tuttavia, dato che c'è letteralmente una vista del rasoio nell'app e tutto ciò che una volta avviato è AngularJs, non sono sicuro che sia un problema in questo caso. Inoltre, poiché l'app è solo interna, non penso che la sicurezza sia un problema troppo grande, tenendo presente che i servizi di back-end, dove sono archiviati tutti i dati, saranno sempre in scatole separate dietro i servizi wcf, con tonnellate di sicurezza su di loro poiché questi sono utilizzati da tutta l'organizzazione.
Stephen Byrne,

Certo, il tuo caso è quello che è il tuo caso. Mi chiedo se quei servizi potrebbero essere consumati da una webapp diversa in futuro (o intesi essere) ed è per questo che il suo architetto è così com'è. Anche in questo caso, il vecchio architetto avrebbe potuto guardarlo da 10.000 piedi!
gbjbaanb,

1
Nel nostro scenario abbiamo deciso di sviluppare l'app per dispositivi mobili dopo che tutto era stato in produzione per un po '. Siamo stati felici di avere un server API separato dal server UI, perché l'app per dispositivi mobili non aveva nulla a che fare con l'app Web. Potremmo ridimensionare le parti "mobile" e "web" separatamente. Un'altra cosa che vale la pena notare: l'app Web è davvero un client / client, ciò significa che il client dell'app Web (browser) chiama il server API per ottenere dati (nel nostro caso è possibile). Le chiamate HTTP "ridondanti" tra server API e UI erano trascurabili rispetto al traffico tra browser / dispositivo mobile e server API.
Michal Vician,

2

Penso che non ci sia una risposta giusta / sbagliata qui. Hai chiesto ai tuoi colleghi lo scopo di questa architettura?

Da come comprendo le tue descrizioni, il " WebAPI " nella tua architettura funge da tipo di Middleware fatto da sé. Ora puoi cercare quali vantaggi ci sono negli usi di un middleware. Fondamentalmente il tuo Webapp non avrebbe mai bisogno di essere adottato se hai cambiato il tuo sistema di backoffice (purché l' interfaccia WebAPI mantenga lo stesso).

Per andare oltre: immagina di avere un database dei clienti (servizio back-end) e di avere 5 app Web che comunicano con quel database. Se si sostituisce il sistema di database dei clienti con un nuovo sistema (come da un altro fornitore e non è possibile influenzare le interfacce del servizio Web), molto probabilmente sarà necessario modificare il livello di comunicazione di tutte e 5 le applicazioni Web. Se comunichi tramite la tua WebAPI , dovresti semplicemente modificare il livello di comunicazione della WebAPI .

Fondamentalmente, Layer Architecture è oggi considerata sia: Pattern che Anti-Pattern. (Vedi: Lasagna-Code ) Se hai solo 1 sistema senza piani per espandere ulteriormente questo nei prossimi anni, preferirei considerare questo come anti-pattern. Ma questo sarebbe un giudice irrealisticamente taff dato che non conosco le circostanze / situazioni esatte :)


grazie per il feedback, i servizi di back-end finali sono utilizzati da tutta l'organizzazione e hanno contratti di servizi WCF ben definiti (anche se un po 'semplicistici) di proprietà dell'organizzazione. Quindi c'è molta indiretta se dobbiamo cambiare il back-end (che, in realtà, siamo in procinto di fare, passando da un ERP a un altro). Ma il mio problema è con la nostra applicazione che fornisce un set separato di API HTTP middleware che vengono consumate solo da esso. Sembra un livello di troppo :)
Stephen Byrne,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.