Perché usare un approccio ai microservizi per la compilazione di applicazioniWhy a microservices approach to building applications?

Per gli sviluppatori di software non c'è nulla di nuovo nel modo di considerare la fattorizzazione di un'applicazione nelle parti che la compongono.As software developers, there is nothing new in how we think about factoring an application into component parts. È il paradigma centrale della programmazione orientata a oggetti, delle astrazioni software e della componentizzazione.It is the central paradigm of object orientation, software abstractions, and componentization. Oggi questa fattorizzazione tende ad assumere la forma di classi e interfacce fra livelli di tecnologia e librerie condivise.Today, this factorization tends to take the form of classes and interfaces between shared libraries and technology layers. In genere viene adottato un approccio su più livelli con un archivio nel back-end, la logica di business al livello intermedio e l'interfaccia utente (UI) nel front-end.Typically, a tiered approach is taken with a back-end store, middle-tier business logic, and a front-end user interface (UI). Ciò che è cambiato negli ultimi anni è il fatto che gli sviluppatori creano applicazioni distribuite destinate al cloud e basate sulle esigenze aziendali.What has changed over the last few years is that we, as developers, are building distributed applications that are for the cloud and driven by the business.

Ecco quali sono le mutevoli esigenze aziendali:The changing business needs are:

  • Un servizio scalabile creato e usato per raggiungere i clienti in nuove aree geografiche (ad esempio).A service that's built and operates at scale to reach customers in new geographical regions (for example).
  • Recapito più rapido di funzionalità e caratteristiche per poter rispondere alle richieste dei clienti in modo agile.Faster delivery of features and capabilities to be able to respond to customer demands in an agile way.
  • Utilizzo delle risorse migliorato per ridurre i costi.Improved resource utilization to reduce costs.

Queste esigenze aziendali incidono sul modo di compilare le applicazioni.These business needs are affecting how we build applications.

Per altre informazioni sull'approccio di Azure ai microservizi, leggere Microservices: An application revolution powered by the cloud (Microservizi: una rivoluzione delle applicazioni basata sul cloud).For more information about the approach of Azure to microservices, read Microservices: An application revolution powered by the cloud.

Approccio alla progettazione monolitico o con microserviziMonolithic vs. microservice design approach

Tutte le applicazioni si evolvono con il trascorrere del tempo.All applications evolve over time. Le applicazioni che hanno maggior successo si evolvono diventando utili per le persone.Successful applications evolve by being useful to people. Le applicazioni che invece non hanno successo non si evolvono e alla fine vengono deprecate.Unsuccessful applications do not evolve and eventually are deprecated. La domanda diventa quindi: quanto si sa attualmente dei propri requisiti e come si svilupperanno in futuro?The question becomes: How much do you know about your requirements today, and what will they be in the future? Si supponga, ad esempio, di dover realizzare un'applicazione per la creazione di report per un reparto.For example, let's say that you are building a reporting application for a department. Si supponga di avere la certezza che l'applicazione rimane all'interno dell'ambito aziendale e che i report hanno una durata breve.You are sure that the application remains within the scope of your company and that the reports are short-lived. L'approccio scelto sarà diverso, ad esempio, rispetto alla creazione di un servizio per la distribuzione di contenuti video a decine di milioni di clienti.Your choice of approach is different from, say, building a service that delivers video content to tens of millions of customers.

In alcuni casi, il rilascio di un modello di verifica può essere il fattore determinante, sapendo che l'applicazione può essere riprogettata in un secondo momento.Sometimes, getting something out the door as proof of concept is the driving factor, while you know that the application can be redesigned later. C'è poco senso nella sovraprogettazione di qualcosa che non verrà mai usato.There is little point in over-engineering something that never gets used. È il solito compromesso della progettazione.It’s the usual engineering trade-off. D'altra parte, quando le aziende discutono della creazione per il cloud, l'aspettativa diventa crescita e utilizzo.On the other hand, when companies talk about building for the cloud, the expectation is growth and usage. Il problema è che la crescita e la scalabilità sono imprevedibili.The issue is that growth and scale are unpredictable. Si vorrebbe poter creare prototipi velocemente, ma allo stesso tempo sapere di essere sulla strada giusta per gestire il successo futuro.We would like to be able to prototype quickly while also knowing that we are on a path to deal with future success. Questo è l'approccio di avvio snello: compilare, misurare, apprendere e ripetere.This is the lean startup approach: build, measure, learn, and iterate.

Nell'era del client/server si tendeva a concentrarsi sulla compilazione di applicazioni a più livelli, usando tecnologie specifiche in ogni livello.During the client-server era, we tended to focus on building tiered applications by using specific technologies in each tier. Per questi approcci è nato il termine applicazione monolitica.The term monolithic application has emerged for these approaches. Le interfacce si trovavano di solito tra i diversi livelli e si usava una progettazione accoppiata più strettamente tra i componenti all'interno di ogni livello.The interfaces tended to be between the tiers, and a more tightly coupled design was used between components within each tier. Gli sviluppatori progettavano ed eseguivano il factoring delle classi compilate in librerie e collegate insieme in pochi file eseguibili e DLL.Developers designed and factored classes that were compiled into libraries and linked together into a few executables and DLLs.

Questo approccio alla progettazione monolitica presenta dei vantaggi.There are benefits to such a monolithic design approach. Spesso è più semplice da progettare e prevede chiamate più rapide tra i componenti, perché queste chiamate spesso avvengono tramite comunicazione interprocesso (IPC).It's often simpler to design, and it has faster calls between components, because these calls are often over interprocess communication (IPC). Inoltre, ognuno testa un singolo prodotto e questo approccio è tendenzialmente più efficiente a livello di risorse e persone.Also, everyone tests a single product, which tends to be more people-resource efficient. Lo svantaggio è che si ottiene un accoppiamento stretto fra i livelli e non è possibile ridimensionare i singoli componenti.The downside is that there's a tight coupling between tiered layers, and you cannot scale individual components. Se occorre eseguire correzioni o aggiornamenti, si deve attendere che altri completino i test.If you need to perform fixes or upgrades, you have to wait for others to finish their testing. Diventa quindi più difficile essere agili.It is more difficult to be agile.

I microservizi risolvono questi aspetti negativi e sono più allineati ai requisiti aziendali descritti sopra, ma anch'essi hanno vantaggi e punti deboli.Microservices address these downsides and more closely align with the preceding business requirements, but they also have both benefits and liabilities. I vantaggi dei microservizi consistono nel fatto che ognuno incapsula solitamente funzionalità aziendali più semplici, che è possibile incrementare o ridurre, testare, distribuire e gestire in modo indipendente.The benefits of microservices are that each one typically encapsulates simpler business functionality, which you scale up or down, test, deploy, and manage independently. Un importante vantaggio dell'approccio basato su microservizi è il fatto che i team sono influenzati più dagli scenari aziendali che dalla tecnologia, cosa che invece l'approccio a più livelli incoraggia.One important benefit of a microservice approach is that teams are driven more by business scenarios than by technology, which the tiered approach encourages. In pratica, team più piccoli sviluppano un microservizio sulla base di uno scenario del cliente, usando le tecnologie che preferiscono.In practice, smaller teams develop a microservice based on a customer scenario and use any technologies they choose.

In altre parole, l'organizzazione non deve necessariamente standardizzarsi sulla tecnologia per mantenere applicazioni di microservizi.In other words, the organization doesn’t need to standardize tech to maintain microservice applications. I singoli team proprietari dei servizi possono procedere come meglio credono, a seconda dell'esperienza del team stesso o della soluzione più appropriata al problema da risolvere.Individual teams that own services can do what makes sense for them based on team expertise or what’s most appropriate to solve the problem. In pratica, è preferibile avere un set di tecnologie consigliate, ad esempio un particolare archivio NoSQL o un framework di applicazioni Web.In practice, a set of recommended technologies, such as a particular NoSQL store or web application framework, is preferable.

Lo svantaggio dei microservizi sta nel dover gestire un maggior numero di entità separate nonché distribuzioni e controllo di versione più complessi.The downside of microservices comes in managing the increased number of separate entities and dealing with more complex deployments and versioning. Il traffico di rete tra i microservizi aumenta insieme alle latenze di rete corrispondenti.Network traffic between the microservices increases as well as the corresponding network latencies. La presenza di una grande quantità di servizi frammentati e granulari non può che dare origine a problemi di prestazioni.Lots of chatty, granular services are a recipe for a performance nightmare. Senza strumenti che facilitino la visualizzazione di queste dipendenze è difficile avere una "visione" dell'intero sistema.Without tools to help view these dependencies, it is hard to “see” the whole system.

Sono gli standard che consentono il funzionamento dell'approccio basato su microservizi, definendo la modalità di comunicazione e accettando solo ciò che è necessario ottenere da un servizio, invece di rigidi contratti.Standards make the microservice approach work by agreeing on how to communicate and being tolerant of only the things you need from a service, rather than rigid contracts. È importante definire questi aspetti fin dall'inizio della progettazione, perché i servizi vengono aggiornati in modo indipendente gli uni dagli altri.It is important to define these contracts up front in the design, because services update independently of each other. Un'altra descrizione coniata per la progettazione con approccio basato su microservizi è "SOA (Service Oriented Architecture) con granularità fine".Another description coined for designing with a microservices approach is “fine-grained service-oriented architecture (SOA).”

Al livello più semplice, l'approccio di progettazione con microservizi è una federazione di servizi disaccoppiata, con modifiche indipendenti di ciascuno e standard concordati per la comunicazione.At its simplest, the microservices design approach is about a decoupled federation of services, with independent changes to each, and agreed-upon standards for communication.

Mentre vengono prodotte sempre più app per cloud, le persone scoprono che questa scomposizione dell'app complessiva in servizi indipendenti per scenari specifici è un approccio migliore a lungo termine.As more cloud apps are produced, people discover that this decomposition of the overall app into independent, scenario-focused services is a better long-term approach.

Confronto tra approcci allo sviluppo di applicazioniComparison between application development approaches

Sviluppo di applicazioni per la piattaforma Service Fabric

1) Un'app monolitica include funzionalità specifiche del dominio e normalmente è divisa per livelli di funzionalità, ad esempio Web, business e dati.A monolithic app contains domain-specific functionality and is normally divided by functional layers, such as web, business, and data.

2) Per la scalabilità di un'app monolitica, occorre clonarla in più server/macchine virtuali/contenitori.You scale a monolithic app by cloning it on multiple servers/virtual machines/containers.

3) Un'applicazione di microservizi separa le funzionalità in servizi più piccoli distinti.A microservice application separates functionality into separate smaller services.

4) La scalabilità orizzontale di questo approccio basato sui microservizi si ottiene con la distribuzione di ogni servizio in modo indipendente e la creazione di istanze di questi servizi in server/macchine virtuali/contenitori.The microservices approach scales out by deploying each service independently, creating instances of these services across servers/virtual machines/containers.

La progettazione di un approccio ai microservizi non è un toccasana per tutti i progetti, ma offre un maggiore allineamento con gli obiettivi di business descritti in precedenza.Designing with a microservice approach is not a panacea for all projects, but it does align more closely with the business objectives described earlier. Un approccio iniziale monolitico può essere accettabile se si sa che in caso di necessità sarà possibile rielaborare il codice in una struttura a microservizi.Starting with a monolithic approach might be acceptable if you know that you will have the opportunity to rework the code later into a microservices design. In genere si inizia con un'applicazione monolitica e quindi la si suddivide lentamente in fasi, a partire dalle aree funzionali che devono essere maggiormente scalabili o agili.More commonly, you begin with a monolithic application and slowly break it up in stages, starting with the functional areas that need to be more scalable or agile.

Per riepilogare, l'approccio basato su microservizi consiste nel comporre un'applicazione con molti servizi più piccoli.To summarize, the microservice approach is to compose your application of many small services. Questi servizi sono eseguiti in contenitori distribuiti in un cluster di computer.The services run in containers that are deployed across a cluster of machines. Team più piccoli sviluppano un servizio focalizzato su uno scenario ed eseguono test, controllo delle versioni, distribuzione e ridimensionamento di ogni servizio in modo indipendente, contribuendo all'evoluzione complessiva dell'applicazione.Smaller teams develop a service that focuses on a scenario and independently test, version, deploy, and scale each service so that the entire application can evolve.

Definizione di microservizioWhat is a microservice?

Esistono diverse definizioni di microservizi.There are different definitions of microservices. Con una ricerca in Internet è possibile trovare molte fonti di informazioni utili con punti di vista e definizioni eterogenei.If you search the Internet, you'll find many useful resources that provide their own viewpoints and definitions. Molte delle caratteristiche dei microservizi seguenti sono tuttavia ampiamente concordate:However, most of the following characteristics of microservices are widely agreed upon:

  • Incapsulano uno scenario aziendale o del cliente.Encapsulate a customer or business scenario. Qual è il problema da risolvere?What is the problem you are solving?
  • Sono sviluppati da un piccolo team di progettazione.Developed by a small engineering team.
  • Sono scritti in qualsiasi linguaggio di programmazione e usano qualsiasi framework.Written in any programming language and use any framework.
  • Sono costituiti da codice e facoltativamente da uno stato, entrambi sottoposti al controllo delle versioni, distribuiti e ridimensionati in maniera indipendente.Consist of code and (optionally) state, both of which are independently versioned, deployed, and scaled.
  • Interagiscono con altri microservizi tramite interfacce e protocolli ben definiti.Interact with other microservices over well-defined interfaces and protocols.
  • Hanno nomi univoci (URL) usati per risolvere la propria posizione.Have unique names (URLs) used to resolve their location.
  • Rimangono coerenti e disponibili in caso di errori.Remain consistent and available in the presence of failures.

È possibile riepilogare queste caratteristiche come segue:You can summarize these characteristics into:

Le applicazioni di microservizi sono costituite da piccoli servizi rivolti ai clienti, scalabili e sottoposti al controllo delle versioni indipendentemente, che comunicano tra di essi tramite protocolli standard e interfacce ben definite.Microservice applications are composed of small, independently versioned, and scalable customer-focused services that communicate with each other over standard protocols with well-defined interfaces.

I primi due punti sono stati descritti nella sezione precedente, ora verranno estesi e chiariti gli altri.We covered the first two points in the preceding section, and now we expand on and clarify the others.

Sono scritti in qualsiasi linguaggio di programmazione e usano qualsiasi frameworkWritten in any programming language and use any framework

Gli sviluppatori dovrebbero essere liberi di scegliere il linguaggio o il framework che preferiscono, a seconda delle loro competenze o delle esigenze del servizio.As developers, we should be free to choose a language or framework that we want, depending on our skills or the needs of the service. Per alcuni servizi i vantaggi di prestazioni di C++ potrebbero superare qualsiasi altro aspetto.In some services, you might value the performance benefits of C++ above all else. In altri servizi la facilità dello sviluppo gestito in C# o Java potrebbe essere più importante.In other services, the ease of managed development in C# or Java might be most important. In alcuni casi potrebbe essere necessaria una libreria di terze parti, una tecnologia di archiviazione dati o mezzi per l'esposizione del servizio a client specifici.In some cases, you may need to use a specific partner library, data storage technology, or means of exposing the service to clients.

Dopo aver scelto una tecnologia, occorre considerare la gestione operativa o del ciclo di vita e il ridimensionamento del servizio.After you have chosen a technology, you come to the operational or lifecycle management and scaling of the service.

Consentono di sottoporre al controllo delle versioni, distribuire e ridimensionare indipendentemente codice e statoAllows code and state to be independently versioned, deployed, and scaled

In qualsiasi modo si decida di scrivere i propri microservizi, il codice e facoltativamente lo stato devono essere distribuiti, aggiornati e ridimensionati in modo indipendente.However you choose to write your microservices, the code and optionally the state should independently deploy, upgrade, and scale. Questo è uno dei problemi più difficili da risolvere, poiché coinvolge la scelta delle tecnologie.This is actually one of the harder problems to solve, because it comes down to your choice of technologies. Per il ridimensionamento, sapere come partizionare sia il codice che lo stato è complesso.For scaling, understanding how to partition (or shard) both the code and state is challenging. Quando il codice e lo stato usano tecnologie distinte, una tendenza comune attualmente, gli script di distribuzione del microservizio devono poter supportare il ridimensionamento di entrambi.When the code and state use separate technologies, which is common today, the deployment scripts for your microservice need to be able to cope with scaling them both. Questo aspetto ha a che fare anche con l'agilità e la flessibilità con cui si possono aggiornare alcuni microservizi senza doverli aggiornare tutti contemporaneamente.This is also about agility and flexibility, so you can upgrade some of the microservices without having to upgrade all of them at once.

Tornando per un momento all'approccio monolitico contrapposto ai microservizi, il diagramma seguente mostra le differenze di approccio all'archiviazione dello stato.Returning to the monolithic versus microservice approach for a moment, the following diagram shows the differences in the approach to storing state.

Archiviazione dello stato tra stili dell'applicazioneState storage between application styles

Archiviazione dello stato della piattaforma Service Fabric

A sinistra l'approccio monolitico con un database singolo e livelli di tecnologie specifiche.The monolithic approach on the left has a single database and tiers of specific technologies.

A destra è illustrato l'approccio basato su microservizi, con un grafico dei microservizi interconnessi in cui lo stato presenta in genere un ambito limitato al microservizio e vengono usate molteplici tecnologie.The microservices approach on the right has a graph of interconnected microservices where state is typically scoped to the microservice and various technologies are used.

In un approccio monolitico, l'applicazione usa in genere un singolo database.In a monolithic approach, typically the application uses a single database. Il vantaggio è dato dal fatto che si tratta di una posizione singola e ciò facilita la distribuzione.The advantage is that it is a single location, which makes it easy to deploy. Ogni componente può avere una tabella singola per l'archiviazione del relativo stato.Each component can have a single table to store its state. La parte più difficile riguarda la necessità che il team separi scrupolosamente lo stato.Teams need to strictly separate state, which is a challenge. È inevitabile la tentazione di aggiungere una nuova colonna a una tabella esistente del cliente, creare un join tra le tabelle e creare dipendenze a livello di archiviazione.Inevitably there are temptations to add a new column to an existing customer table, do a join between tables, and create dependencies at the storage layer. In questo caso, non sarà possibile ridimensionare i singoli componenti.After this happens, you can't scale individual components.

Con l'approccio dei microservizi, ogni servizio gestisce e archivia il proprio stato.In the microservices approach, each service manages and stores its own state. Ogni servizio è responsabile di ridimensionare sia il codice che lo stato insieme, in modo da soddisfare le richieste del servizio.Each service is responsible for scaling both code and state together to meet the demands of the service. Un aspetto negativo è il fatto che quando occorre creare viste o query dei dati dell'applicazione le query vanno eseguite su archivi che si trovano in diversi stati.A downside is that when there is a need to create views, or queries, of your application’s data, you need to query across disparate state stores. In genere, questo problema si risolve con un microservizio separato che crea una visualizzazione della raccolta di microservizi.Typically, this is solved by having a separate microservice that builds a view across a collection of microservices. Se è necessario eseguire più query specifiche sui dati, per ogni microservizio si dovrà considerare la scrittura dei dati in un servizio di data warehousing per le analisi offline.If you need to perform multiple impromptu queries on the data, each microservice should consider writing its data to a data warehousing service for offline analytics.

Il controllo delle versioni è specifico della versione del microservizio per consentire la distribuzione e l'esecuzione di diverse versioni affiancate.Versioning is specific to the deployed version of a microservice so that multiple, different versions deploy and run side by side. Il controllo delle versioni è rivolto agli scenari in cui l'aggiornamento a una versione più recente di un microservizio non riesce ed è necessario eseguire il rollback a una versione precedente.Versioning addresses the scenarios where a newer version of a microservice fails during upgrade and needs to roll back to an earlier version. L'altro scenario per il controllo delle versioni riguarda l'esecuzione dei test di tipo A/B in cui utenti diversi provano versioni diverse del servizio.The other scenario for versioning is performing A/B-style testing, where different users experience different versions of the service. Ad esempio, è normale aggiornare un microservizio per consentire a un set specifico di clienti di testare nuove funzionalità prima di implementarlo più diffusamente.For example, it is common to upgrade a microservice for a specific set of customers to test new functionality before rolling it out more widely. Dopo la gestione del ciclo di vita dei microservizi, si esaminerà la comunicazione tra di essi.After lifecycle management of microservices, this now brings us to communication between them.

Interagiscono con altri microservizi tramite interfacce ben definite e protocolli.Interacts with other microservices over well-defined interfaces and protocols

Questo argomento richiede un po' di attenzione, perché esiste molta documentazione sull'architettura orientata ai servizi pubblicata negli ultimi 10 anni che descrive i modelli di comunicazione.This topic needs little attention here, because extensive literature about service-oriented architecture that has been published over the past 10 years describes communication patterns. Di solito la comunicazione tra servizi usa un approccio REST con i protocolli HTTP e TCP e XML o JSON come formato di serializzazione.Generally, service communication uses a REST approach with HTTP and TCP protocols and XML or JSON as the serialization format. Da un punto di vista dell'interfaccia, si tratta di adottare l'approccio alla progettazione Web.From an interface perspective, it is about embracing the web design approach. Nulla vieta tuttavia di usare protocolli binari o formati di dati personalizzati.But nothing stops you from using binary protocols or your own data formats. Tenere presente che le persone avranno maggiori difficoltà a usare i microservizi se questi protocolli e formati non sono disponibili pubblicamente.Be prepared for people to have a harder time using your microservices if these protocols and formats are not openly available.

Hanno un nome (URL) univoco usato per risolvere il percorsoHas a unique name (URL) used to resolve its location

Come è stato ribadito più volte, tenere presente che l'approccio ai microservizi è come il Web.Remember how we keep saying that the microservice approach is like the web? Come il Web il microservizio deve essere indirizzabile ovunque sia in esecuzione.Like the web, your microservice needs to be addressable wherever it is running. Se si inizia a chiedersi quale computer esegue un determinato microservizio, presto inizieranno le difficoltà.If you are thinking about machines and which one is running a particular microservice, things go bad quickly.

Così come il DNS risolve un URL particolare in un computer specifico, il microservizio deve avere un nome univoco per consentire l'individuazione della sua posizione attuale.In the same way that DNS resolves a particular URL to a particular machine, your microservice needs to have a unique name so that its current location is discoverable. I microservizi devono avere nomi indirizzabili che li rendano indipendenti dall'infrastruttura in cui sono in esecuzione.Microservices need addressable names that make them independent from the infrastructure that they are running on. Questo implica un'interazione tra la modalità di distribuzione e la modalità di individuazione del servizio, perché deve essere disponibile un servizio del servizio.This implies that there is an interaction between how your service is deployed and how it is discovered, because there needs to be a service registry. Allo stesso modo, in caso di errore in un computer, il registro del servizio deve indicare dove il servizio è in esecuzione al momento.Equally, when a machine fails, the registry service must tell you where the service is now running.

Questo introduce l'argomento seguente sulla resilienza e la coerenza.This brings us to the next topic: resilience and consistency.

Rimangono coerenti e disponibili in caso di errori.Remains consistent and available in the presence of failures

Affrontare gli errori imprevisti è uno dei problemi più difficili da risolvere, specialmente in un sistema distribuito.Dealing with unexpected failures is one of the hardest problems to solve, especially in a distributed system. La maggior parte del codice scritto dagli sviluppatori riguarda la gestione delle eccezioni ed è anche l'ambito in cui si impiega più tempo per i test.Much of the code that we write as developers is handling exceptions, and this is also where the most time is spent in testing. Il problema è più complesso della scrittura di codice per gestire gli errori.The problem is more involved than writing code to handle failures. Cosa accade infatti in caso di errore del computer in cui è in esecuzione il microservizio?What happens when the machine where the microservice is running fails? Non è solo necessario rilevare l'errore del microservizio, un problema di per sé difficile, ma serve anche una soluzione per riavviarlo.Not only do you need to detect this microservice failure (a hard problem on its own), but you also need something to restart your microservice.

Un microservizio deve essere resiliente in caso di errori e riavviarsi spesso in un altro computer per motivi di disponibilità.A microservice needs to be resilient to failures and restart often on another machine for availability reasons. Anche in questo caso, tutto si riduce allo stato salvato per conto del microservizio, ovvero da dove il microservizio può recuperare questo stato e se il microservizio è in grado di completare correttamente il riavvio.This also comes down to the state that was saved on behalf of the microservice, where the microservice can recover this state from, and whether the microservice is able to restart successfully. In altre parole, è necessario che sia resiliente a livello di calcolo (il processo viene riavviato) oltre che a livello di stato o dati (non si sono verificate perdite di dati e questi rimangono coerenti).In other words, there needs to be resilience in the compute (the process restarts) as well as resilience in the state or data (no data loss and the data remains consistent).

I problemi di resilienza si complicano in altri scenari, ad esempio quando gli errori si verificano durante l'aggiornamento di un'applicazione.The problems of resiliency are compounded during other scenarios, such as when failures happen during an application upgrade. Il microservizio, che interagisce con il sistema di distribuzione, non deve essere ripristinato.The microservice, working with the deployment system, doesn't need to recover. Deve anche decidere se può continuare e passare alla versione più recente oppure eseguire il rollback a una versione precedente per mantenere uno stato coerente.It also needs to then decide whether it can continue to move forward to the newer version or instead roll back to a previous version to maintain a consistent state. Occorre considerare alcune domande, ad esempio se sono disponibili computer sufficienti per continuare e come recuperare le versioni precedenti del microservizio.Questions such as whether enough machines are available to keep moving forward and how to recover previous versions of the microservice need to be considered. Per poter prendere queste decisioni, il microservizio deve quindi emettere informazioni sull'integrità.This requires the microservice to emit health information to be able to make these decisions.

Segnalano integrità e diagnosticaReports health and diagnostics

Anche se è un concetto apparentemente ovvio e spesso trascurato, un microservizio deve segnalare il proprio stato di integrità e fornire dati di diagnostica.It may seem obvious, and it is often overlooked, but a microservice must report its health and diagnostics. In caso contrario, saranno disponibili pochi dettagli da un punto di vista operativo.Otherwise, there is little insight from an operations perspective. Correlare gli eventi di diagnostica in un set di servizi indipendenti e gestire le differenze di orario dei computer per comprendere l'ordine degli eventi è difficile.Correlating diagnostic events across a set of independent services and dealing with machine clock skews to make sense of the event order is challenging. Nello stesso modo in cui si interagisce con un microservizio usando protocolli e formati dati concordati, emerge un'esigenza di standardizzazione della modalità di registrazione delle informazioni sull'integrità e degli eventi di diagnostica che, alla fine, si traduce in un archivio di eventi che possono essere visualizzati e su cui si possono eseguire query.In the same way that you interact with a microservice over agreed-upon protocols and data formats, there emerges a need for standardization in how to log health and diagnostic events that ultimately end up in an event store for querying and viewing. In un approccio basato su microservizi, è fondamentale che i diversi team concordino un unico formato di registrazione.In a microservices approach, it is key that different teams agree on a single logging format. È necessario un approccio coerente alla visualizzazione degli eventi di diagnostica nell'applicazione nel suo complesso.There needs to be a consistent approach to viewing diagnostic events in the application as a whole.

L'integrità è diversa dalla diagnostica.Health is different from diagnostics. Per integrità si intende la segnalazione dello stato corrente da parte del microservizio per consentire l'esecuzione di azioni appropriate.Health is about the microservice reporting its current state to take appropriate actions. Un esempio efficace riguarda l'interazione con i meccanismi di aggiornamento e distribuzione per assicurare la disponibilità.A good example is working with upgrade and deployment mechanisms to maintain availability. Anche se un servizio può non essere attualmente integro a causa dell'arresto anomalo di un processo o del riavvio di un computer, potrebbe comunque essere ancora operativo.Although a service may be currently unhealthy due to a process crash or machine reboot, the service might still be operational. L'ultima cosa da fare è peggiorare la situazione eseguendo un aggiornamento.The last thing you need is to make this worse by performing an upgrade. L'approccio migliore è procedere prima di tutto a un'indagine o attendere il ripristino del microservizio.The best approach is to do an investigation first or allow time for the microservice to recover. Gli eventi di integrità di un microservizio consentono di prendere decisioni informate e favoriscono in effetti la creazione di servizi con funzionalità di riparazione automatica.Health events from a microservice help us make informed decisions and, in effect, help create self-healing services.

Service Fabric come piattaforma di microserviziService Fabric as a microservices platform

Azure Service Fabric è emerso in seguito alla transizione operata da Microsoft dalla fornitura di prodotti preconfezionati, generalmente di tipo monolitico, alla fornitura di servizi.Azure Service Fabric emerged from a transition by Microsoft from delivering box products, which were typically monolithic in style, to delivering services. Service Fabric è stato plasmato dall'esperienza acquisita con la creazione e la gestione di servizi di grandi dimensioni, come database SQL di Azure e Azure Cosmos DB.The experience of building and operating large services, such as Azure SQL Database and Azure Cosmos DB, shaped Service Fabric. La piattaforma si è evoluta nel tempo con l'adozione di un numero di servizi sempre maggiore.The platform evolved over time as more and more services adopted it. Era importante che Service Fabric potesse essere eseguito non solo in Azure, ma anche autonomamente nelle distribuzioni di Windows Server.Importantly, Service Fabric had to run not only in Azure but also in standalone Windows Server deployments.

Lo scopo di Service Fabric consiste nel risolvere i difficili problemi di compilazione ed esecuzione di un servizio e di utilizzo efficiente delle risorse dell'infrastruttura, per consentire ai team di risolvere i problemi aziendali tramite un approccio basato su microservizi.The aim of Service Fabric is to solve the hard problems of building and running a service and utilize infrastructure resources efficiently, so that teams can solve business problems using a microservices approach.

Service Fabric include tre aree generiche che facilitano la creazione di applicazioni con un approccio basato sui microservizi:Service Fabric provides three broad areas to help you build applications that use a microservices approach:

  • Piattaforma con servizi di sistema per distribuire, aggiornare e trovare servizi, rilevare e riavviare i servizi con problemi, inoltrare messaggi, gestire lo stato e monitorare l'integrità.A platform that provides system services to deploy, upgrade, detect, and restart failed services, discover services, route messages, manage state, and monitor health. Questi servizi di sistema abilitano in effetti molte delle caratteristiche dei microservizi descritte in precedenza.These system services in effect enable many of the characteristics of microservices previously described.
  • Possibilità di distribuire applicazioni eseguite in contenitori o sotto forma di processi.Ability to deploy applications either running in containers or as processes. Service Fabric è una struttura per la gestione di contenitori e processi.Service Fabric is a container and process orchestrator.
  • API di programmazione produttive che facilitano la compilazione di applicazioni come microservizi: ASP.NET Core, Reliable Actors e Reliable Services.Productive programming APIs, to help you build applications as microservices: ASP.NET Core, Reliable Actors, and Reliable Services. È possibile scegliere qualsiasi codice per sviluppare un microservizio.You can choose any code to build your microservice. L'uso di queste API non solo rende il processo più semplice, ma poiché si integrano con la piattaforma a un livello più profondo,But these APIs make the job more straightforward, and they integrate with the platform at a deeper level. forniscono, ad esempio, informazioni su integrità e diagnostica o consentono di sfruttare la disponibilità elevata predefinita.This way, for example, you can get health and diagnostics information, or you can take advantage of built-in high availability.

Service Fabric è indipendente dalla modalità di compilazione del servizio, quindi è possibile usare qualsiasi tecnologia. Tuttavia offre API di programmazione predefinite che facilitano la compilazione dei microservizi.Service Fabric is agnostic on how you build your service, and you can use any technology. However, it does provide built-in programming APIs that make it easier to build microservices.

Migrazione di applicazioni esistenti a Service FabricMigrating existing applications to Service Fabric

Un approccio chiave a Service Fabric è il riuso del codice esistente, aggiornabile con nuovi microservizi.A key approach to Service Fabric is to reuse existing code, which can then be modernized with new microservices. La modernizzazione delle applicazioni prevede cinque fasi ed è possibile iniziare e terminare con una qualsiasi di queste.There are five stages to application modernization, and you can start and stop at any of the stages. Si tratta di:These are;

1) Esecuzione di un'applicazione monolitica tradizionale.Take a traditional monolithic application
2) Trasferimento in modalità lift-and-shift: usare contenitori o file eseguibili guest per ospitare in Service Fabric il codice esistente.Lift and Shift - Use containers or guest executables to host existing code in Service Fabric.
3) Modernizzazione: nuovi microservizi aggiunti al codice esistente in contenitori.Modernization - New microservices added alongside existing containerized code.
4) Innovazione: suddivisione della struttura monolitica in microservizi esclusivamente in base alle esigenze.Innovate - Break the monolithic into microservices purely based on need.
5) Trasformazione in microservizi: conversione di applicazioni monolitiche esistenti o creazione di nuove applicazioni prive di vincoli.Transformed into microservices - the transformation of existing monolithic applications or building new greenfield applications.

Migrazione ai microservizi

È importante sottolineare di nuovo che è possibile eseguire l'avvio e l'interruzione in una qualsiasi di queste fasi.It is important to emphasize again that you can start and stop at any of these stages. Non è obbligatorio passare alla fase successiva.You are not compelled to progress to the next stage. Di seguito sono elencati esempi per ogni fase.Let's now look at examples for each of these stages.

Trasferimento in modalità lift-and-shift: un numero crescente di aziende esegue la conversione delle applicazioni monolitiche esistenti in strutture a contenitori per due motivi:Lift and Shift - large numbers of companies are lifting and shifting existing monolithic applications into containers for two reasons;

  • Riduzione dei costi derivante dal consolidamento dell'hardware esistente o dall'esecuzione di applicazioni a maggior densità.Cost reduction either due to consolidation and removal of existing hardware or running applications at higher density.
  • Contratti di distribuzione uniforme tra i settori sviluppo e operazioni.Consistent deployment contract between development and operations.

Le riduzioni dei costi sono evidenti. Ad esempio in Microsoft è in corso la conversione di un numero elevato di applicazioni esistenti in contenitori, con risparmi sui costi di milioni di dollari.Cost reductions are understandable, and within Microsoft, large numbers of existing applications are being containerized simply to save millions of dollars. L'impatto della distribuzione uniforme è più difficile da valutare, ma ugualmente importante.Consistent deployment is harder to evaluate, but equally as important. Nel settore IT gli sviluppatori sono in grado di scegliere la tecnologia che preferiscono, mentre il settore operazioni può implementare un unico approccio alla distribuzione e gestione delle applicazioni.It says that developers can still be free to choose the technology that suites them, however the operations will only accept a single way to deploy and manage these applications. In tal modo il settore operazioni non deve far fronte alla complessità di molte tecnologie diverse, mentre gli sviluppatori non sono costretti a scegliere tra una gamma limitata di soluzioni.It alleviates the operations from having to deal with the complexity of many different technologies or forcing developers to only choose certain ones. In termini semplici, ogni applicazione viene inserita in un'immagine di distribuzione autonoma.Essentially every application is containerized into self-contained deployment images.

Per molte organizzazioni il processo termina qui.Many organizations stop here. I vantaggi dei contenitori sono già presenti e Service Fabric offre un'esperienza di gestione completa con distribuzione, aggiornamenti, controllo delle versioni, ripristino dello stato precedente, monitoraggio dell'integrità e così via.They already have the benefits of containers and Service Fabric provides the complete management experience from deployment, upgrades, versioning, rollbacks, health monitoring etc.

Modernizzazione: è l'aggiunta di nuovi servizi al codice esistente nei contenitori.Modernization - is the addition of new services alongside existing containerized code. Se si prevede di scrivere nuovo codice, è consigliabile orientarsi gradualmente verso i microservizi.If you are going to write new code, it is best to decide to take small steps down the microservices path. Questo approccio può corrispondere all'aggiunta di un nuovo endpoint API REST o di nuova logica di business.This could be adding a new REST API endpoint, or new business logic. In questo modo è possibile iniziare a creare nuovi microservizi e acquisire pratica con lo sviluppo e la distribuzione.This way, you start on the journey of building new microservices and practice developing and deploying them.

Innovazione: all'inizio dell'articolo sono state citate le esigenze di cambiamenti della struttura operativa come motore per la scelta della soluzione con microservizi.Innovate - remember those original changing business needs at the start of this article, that are driving the microservices approach? In questa fase è necessario determinare se i cambiamenti della struttura operativa sono reali e richiedono il frazionamento della struttura monolitica, ovvero l'adozione di un approccio innovativo.At this stage the decision is, are these happening to my current application and if so, I need to start splitting the monolith, or innovating. Ad esempio è possibile che un database diventi un collo di bottiglia a livello di elaborazione perché è usato come coda del flusso di lavoro.An example here is when a database becomes a processing bottleneck, since it is being used as a workflow queue. Se il numero di richieste del flusso di lavoro aumenta è necessario suddividere in scala il carico di lavoro.As the number of workflow requests increasing the work needs to be distributed for scale. Tuttavia nel caso di questo componente dell'applicazione che non supporta la ripartizione in scala sarà necessario decidere se applicare aggiornamenti più frequenti o adottare un approccio innovativo e ripartire il carico tra più microservizi.So for that particular piece of the application that is not scaling, or you need to update more frequently, split this out into a microservice and innovate.

Trasformazione in microservizi: in questa fase l'applicazione è totalmente composta da (o scomposta in) microservizi.Transformed into microservices - this is where your application is fully composed of (or decomposed into) microservices. Per raggiungere questo punto è stata portata a termine l'adozione dei microservizi.To reach here, you have made the microservices journey. È possibile iniziare da questa fase, ma una scelta di questo tipo senza il supporto di una piattaforma per microservizi rappresenta un investimento significativo.You can start here, but to do this without a microservices platform to help you is a significant investment.

I microservizi sono appropriati per l'applicazione in uso?Are microservices right for my application?

È possibile.Maybe. Si è potuto osservare che molti dei sempre più numerosi team Microsoft incaricati di compilare prodotti per il cloud per motivi aziendali hanno sfruttato i vantaggi offerti da un approccio orientato ai microservizi.What we experienced was that as more and more teams in Microsoft began to build for the cloud for business reasons, many of them realized the benefits of taking a microservice-like approach. Bing, ad esempio, sviluppa microservizi di ricerca da anni.Bing, for example, has been developing microservices in search for years. Per altri team, l'approccio basato su microservizi era una novità.For other teams, the microservices approach was new. I team riscontravano problemi difficili da risolvere ed estranei alle loro aree di competenza principali.Teams found that there were hard problems to solve outside of their core areas of strength. Ecco perché Service Fabric si è affermato come tecnologia preferita per la compilazione di servizi.This is why Service Fabric gained traction as the technology of choice for building services.

L'obiettivo di Service Fabric è ridurre le complessità della compilazione di applicazioni con un approccio ai microservizi, evitando di dover affrontare molte attività di riprogettazione costose.The objective of Service Fabric is to reduce the complexities of building applications with a microservice approach, so that you do not have to go through as many costly redesigns. Iniziare con piccole soluzioni, ridimensionarle secondo le esigenze, deprecare servizi, aggiungerne di nuovi ed evolversi secondo le esigenze di utilizzo del cliente, ecco l'approccio.Start small, scale when needed, deprecate services, add new ones, and evolve with customer usage is the approach. È anche evidente che devono essere ancora risolti molti altri problemi per rendere i microservizi più accessibili per la maggior parte degli sviluppatori.We also know that there are many other problems yet to be solved to make microservices more approachable for most developers. I contenitori e il modello di programmazione basato su attori sono esempi di piccoli passi in questa direzione e sicuramente emergeranno molte innovazioni per rendere tutto questo più facile.Containers and the actor programming model are examples of small steps in that direction, and we are sure that more innovations will emerge to make this easier.

Passaggi successiviNext steps