Come decomporre applicazioni monolitiche in microservizi con moduli funzionali interdipendenti?

1

Lavoro con una grande applicazione web monolitica che ha tra 12-24 moduli funzionali e questi sono tutti mantenuti all'interno di una singola struttura di progetto di guerra. Mentre il codice stesso è già segmentato in pacchetti ben definiti e indipendenti, ci sono implicazioni per la distribuzione di una singola applicazione web in questo modo, dal ridimensionamento alla manutenibilità e così via; molto di ciò che la maggior parte dei difensori del settore dice è problematico con questo tipo di progettazione architettonica.

Voglio suddividere questa applicazione monolitica in componenti di implementazione più piccoli, ma ci sono alcuni problemi che rendono questo problema difficile da comprendere.

Modello di dominio

Quasi tutte le nostre classi di modelli di dominio hanno alcune relazioni con altre classi di modelli di dominio di altri moduli. Ad esempio, un prodotto contiene una relazione con un utente che ha creato il record e l'utente risiede in un modulo comune mentre il prodotto è in inventario.

Molti difensori dei microservizi tendono a suggerire che ciascun microservizio sia autonomo e abbia il proprio set di risorse. Ciò implicherebbe il proprio database, in generale, ma uno schema autonomo in un database condiviso è possibile. Sappiamo che le chiavi esterne sono disponibili oltre i limiti dello schema, ma certo non quello dei database.

La domanda diventa quindi se il Prodotto deve semplicemente memorizzare l'ID o il nome dell'Utente e quindi chiamare il servizio Utente per ottenere i dettagli dell'utente se un punto finale richiede dati aggiuntivi anziché imporlo tramite chiavi esterne?

Web / UI

Nel nostro caso, ci sono spesso momenti in cui le imprese vogliono acquisire punti dati aggiuntivi che richiedono non solo una regolazione dell'interfaccia utente, ma un modello di dominio regolare. Quindi, la Web / UI dovrebbe essere inclusa insieme al microservice e le sue classi di modelli di dominio in un singolo artefatto deployable? Esiste un accoppiamento intrinseco tra questo codice, ma l'accoppiamento tra gli strati si basa su contratti di interfaccia ben definiti.

Suppongo che la questione sia quindi intorno alla scalabilità. Se i due sono stati distribuiti separatamente, il servizio di back-end o la Web / UI potrebbero essere ridimensionati in modo indipendente laddove, poiché la distribuzione congiunta non consentirebbe tale progettazione.

    
posta Naros 14.06.2015 - 19:29
fonte

2 risposte

2

Per quanto riguarda la tua prima domanda: per i servizi di disaccoppiamento appropriati è necessario archiviare solo gli ID di oggetti appartenenti ad altri servizi 9se non possono evitare affatto la dipendenza). A volte la dipendenza può essere estratta in un servizio "hub" separato il cui unico ruolo è quello di collegare i dati recuperati da altri servizi che a loro volta non sono a conoscenza della dipendenza. Un esempio potrebbe essere un "servizio clienti", un "servizio prodotto" e un "servizio di determinazione del prezzo" che da soli non conoscono affatto di nessun altro, e per di più un "servizio ordini" che potrebbe archiviare gli ID di le informazioni relative a clienti, ordini e prezzi che partecipano a un ordine e implementano tutte le logiche di business relative all'elaborazione degli ordini. In questo modo, tre servizi possono fare a meno di dipendenze esterne o conoscenze sui modelli di dominio di altri servizi.

Per quanto riguarda la seconda domanda, di solito è bene separare l'interfaccia utente dai servizi di back-end e dai loro modelli di dati. Richiede un po 'di codice di codice aggiuntivo e il riconfezionamento dei dati, ma il modello dell'interfaccia utente che si rovescia al modello di dominio può essere molto peggio (codice disordinato, forzare questo pasticcio su altri utenti dei dati del servizio).

    
risposta data 14.06.2015 - 19:50
fonte
0

Se decidi di dividere la tua applicazione lungo i tuoi nomi, potresti finire con SOA layered architecture , che è un terribile errore. Per quello che posso dire, i concetti di prodotto e utente sono molto vicini tra loro. Ancora una volta, se ho capito bene, ci sono scenari che richiedono un comportamento da entrambi. Se è davvero il caso, allora queste entità devono assolutamente risiedere insieme. Per "insieme" intendo un singolo progetto fisico, un singolo codice base. Probabilmente ti piacerebbe sapere come identificare correttamente i confini del servizio .

Per quanto riguarda l'interfaccia utente, è perfettamente valida se risiede insieme alle classi di logica del dominio. Lei stesso ha notato un accoppiamento intrinseco tra l'interfaccia utente e le classi di dominio. Il servizio (micro) è un sistema autonomo che sa come visualizzare se stesso.

Se hai bisogno di mostrare entità da più di un servizio, ti consiglio l'articolo di Sam Newman sull'approccio Backends for Frontends .

    
risposta data 28.09.2017 - 17:10
fonte

Leggi altre domande sui tag