Guida alla conversione di ruoli di lavoro e Web in servizi senza stato di Service FabricGuide to converting Web and Worker Roles to Service Fabric stateless services

Questo articolo descrive come eseguire la migrazione di ruoli di lavoro e Web di Servizi cloud a servizi senza stato di Service Fabric.This article describes how to migrate your Cloud Services Web and Worker Roles to Service Fabric stateless services. Questo è il percorso di migrazione più semplice da Servizi cloud a Service Fabric per le applicazioni la cui architettura complessiva rimarrà approssimativamente la stessa.This is the simplest migration path from Cloud Services to Service Fabric for applications whose overall architecture is going to stay roughly the same.

Da progetto di Servizi cloud a progetto di applicazione di Service FabricCloud Service project to Service Fabric application project

Un progetto di Servizi cloud e un progetto di applicazione di Service Fabric hanno una struttura simile ed entrambi rappresentano l'unità di distribuzione per l'applicazione, ovvero ognuno definisce il pacchetto completo che viene distribuito per eseguire l'applicazione.A Cloud Service project and a Service Fabric Application project have a similar structure and both represent the deployment unit for your application - that is, they each define the complete package that is deployed to run your application. Un progetto di Servizi cloud contiene uno o più ruoli di lavoro o Web.A Cloud Service project contains one or more Web or Worker Roles. In modo analogo un progetto di applicazione di Service Fabric contiene uno o più servizi.Similarly, a Service Fabric Application project contains one or more services.

La differenza è che il progetto di Servizi cloud abbina la distribuzione dell'applicazione con la distribuzione di una macchina virtuale e quindi contiene le impostazioni di configurazione della macchina virtuale, mentre il progetto di applicazione di Service Fabric definisce solo un'applicazione che verrà distribuita a un set di macchine virtuali esistenti in un cluster di Service Fabric.The difference is that the Cloud Service project couples the application deployment with a VM deployment and thus contains VM configuration settings in it, whereas the Service Fabric Application project only defines an application that will be deployed to a set of existing VMs in a Service Fabric cluster. Il cluster di Service Fabric viene distribuito solo una volta, tramite un modello di Azure Resource Manager o tramite il portale di Azure, e possono esservi distribuite più applicazioni di Service Fabric.The Service Fabric cluster itself is only deployed once, either through an Resource Manager template or through the Azure portal, and multiple Service Fabric applications can be deployed to it.

Confronto tra i progetti di Servizi cloud e Service Fabric

Da ruolo di lavoro a servizio senza statoWorker Role to stateless service

Concettualmente un ruolo di lavoro rappresenta un carico di lavoro senza stato, ovvero ogni istanza del carico di lavoro è identica e le richieste possono essere indirizzate a qualsiasi istanza in qualsiasi momento.Conceptually, a Worker Role represents a stateless workload, meaning every instance of the workload is identical and requests can be routed to any instance at any time. Non è previsto che ogni istanza ricordi la richiesta precedente.Each instance is not expected to remember the previous request. Lo stato in cui opera il carico di lavoro viene gestito da un archivio stati esterno, ad esempio un archivio tabelle di Azure o Azure DocumentDB.State that the workload operates on is managed by an external state store, such as Azure Table Storage or Azure Document DB. In Service Fabric questo tipo di carico di lavoro è rappresentato da un servizio senza stato.In Service Fabric, this type of workload is represented by a Stateless Service. L'approccio più semplice per la migrazione di un ruolo di lavoro a Service Fabric può avvenire mediante la conversione di codice del ruolo di lavoro in un servizio senza stato.The simplest approach to migrating a Worker Role to Service Fabric can be done by converting Worker Role code to a Stateless Service.

Da ruolo di lavoro a servizio senza stato

Da ruolo Web a servizio senza statoWeb Role to stateless service

Analogamente a un ruolo di lavoro, anche un ruolo Web rappresenta un carico di lavoro senza stato e quindi concettualmente può essere associato anch'esso a un servizio senza stato di Service Fabric.Similar to Worker Role, a Web Role also represents a stateless workload, and so conceptually it too can be mapped to a Service Fabric stateless service. Tuttavia, a differenza dei ruoli Web, Service Fabric non supporta IIS.However, unlike Web Roles, Service Fabric does not support IIS. Per eseguire la migrazione di un'applicazione Web da un ruolo Web a un servizio senza stato è necessario passare prima a un framework Web che possa essere self-hosted e non dipenda da IIS o System.Web, ad esempio ASP.NET Core 1.To migrate a web application from a Web Role to a stateless service requires first moving to a web framework that can be self-hosted and does not depend on IIS or System.Web, such as ASP.NET Core 1.

ApplicazioneApplication SupportatoSupported Percorso di migrazioneMigration path
Web Form ASP.NETASP.NET Web Forms NoNo Convertire in ASP.NET Core 1 MVCConvert to ASP.NET Core 1 MVC
ASP.NET MVCASP.NET MVC Con migrazioneWith Migration Eseguire l'aggiornamento ad ASP.NET Core 1 MVCUpgrade to ASP.NET Core 1 MVC
API Web ASP.NETASP.NET Web API Con migrazioneWith Migration Usare un server self-hosted o ASP.NET Core 1Use self-hosted server or ASP.NET Core 1
ASP.NET Core 1ASP.NET Core 1 Yes N/DN/A

API del punto di ingresso e ciclo di vitaEntry point API and lifecycle

Le API del servizio di Service Fabric e del ruolo di lavoro offrono punti di ingresso simili:Worker Role and Service Fabric service APIs offer similar entry points:

Punto di ingressoEntry Point Istanze del ruolo di lavoroWorker Role Servizio di Service FabricService Fabric service
Elaborazione in corsoProcessing Run() RunAsync()
Avvio della macchina virtualeVM start OnStart() N/DN/A
Arresto della macchina virtualeVM stop OnStop() N/DN/A
Apertura del listener per le richieste clientOpen listener for client requests N/DN/A
  • CreateServiceInstanceListener() per servizi senza statoCreateServiceInstanceListener() for stateless
  • CreateServiceReplicaListener() per servizi con statoCreateServiceReplicaListener() for stateful

Istanze del ruolo di lavoroWorker Role


using Microsoft.WindowsAzure.ServiceRuntime;

namespace WorkerRole1
{
    public class WorkerRole : RoleEntryPoint
    {
        public override void Run()
        {
        }

        public override bool OnStart()
        {
        }

        public override void OnStop()
        {
        }
    }
}

Servizio senza stato di Service FabricService Fabric Stateless Service


using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.ServiceFabric.Services.Communication.Runtime;
using Microsoft.ServiceFabric.Services.Runtime;

namespace Stateless1
{
    public class Stateless1 : StatelessService
    {
        protected override IEnumerable<ServiceInstanceListener> CreateServiceInstanceListeners()
        {
        }

        protected override Task RunAsync(CancellationToken cancelServiceInstance)
        {
        }
    }
}

Entrambi hanno un override "Run" primario in cui iniziare l'elaborazione.Both have a primary "Run" override in which to begin processing. I servizi di Service Fabric combinano Run, Start e Stop in un singolo punto di ingresso, RunAsync.Service Fabric services combine Run, Start, and Stop into a single entry point, RunAsync. Il servizio inizierà a funzionare all'avvio di RunAsync e verrà arrestato quando viene segnalato CancellationToken del metodo RunAsync.Your service should begin working when RunAsync starts, and should stop working when the RunAsync method's CancellationToken is signaled.

Esistono alcune differenze principali tra il ciclo di vita e la durata dei servizi di Service Fabric e dei ruoli di lavoro:There are several key differences between the lifecycle and lifetime of Worker Roles and Service Fabric services:

  • Ciclo di vita: la differenza principale è che un ruolo di lavoro è una VM e quindi il ciclo di vita è associato alla VM e include gli eventi relativi all'avvio e all'arresto della VM.Lifecycle: The biggest difference is that a Worker Role is a VM and so its lifecycle is tied to the VM, which includes events for when the VM starts and stops. Un servizio di Service Fabric ha un ciclo di vita separato dal ciclo di vita della macchina virtuale, quindi non include gli eventi relativi all'avvio e all'arresto della macchina virtuale host o del computer, perché non sono correlati.A Service Fabric service has a lifecycle that is separate from the VM lifecycle, so it does not include events for when the host VM or machine starts and stop, as they are not related.
  • Durata: un'istanza del ruolo di lavoro verrà riciclata se il metodo Run viene chiuso.Lifetime: A Worker Role instance will recycle if the Run method exits. Il metodo RunAsync in un servizio di Service Fabric può tuttavia essere eseguito fino al completamento e l'istanza del servizio rimarrà operativa.The RunAsync method in a Service Fabric service however can run to completion and the service instance will stay up.

Service Fabric fornisce un punto di ingresso facoltativo di configurazione della comunicazione per i servizi in ascolto delle richieste client.Service Fabric provides an optional communication setup entry point for services that listen for client requests. Sia il punto di ingresso di comunicazione che quello di RunAsync sono sostituzioni facoltative nei servizi di Service Fabric, ovvero il servizio può scegliere di restare in ascolto solo delle richieste client o eseguire solo un ciclo di elaborazione oppure entrambi, motivo per cui il metodo RunAsync può terminare senza riavviare l'istanza del servizio, perché può continuare a rimanere in ascolto delle richieste client.Both the RunAsync and communication entry point are optional overrides in Service Fabric services - your service may choose to only listen to client requests, or only run a processing loop, or both - which is why the RunAsync method is allowed to exit without restarting the service instance, because it may continue to listen for client requests.

API dell'applicazione e ambienteApplication API and environment

L'API dell'ambiente di Servizi cloud fornisce informazioni e funzionalità per l'istanza corrente della macchina virtuale, nonché informazioni su altre istanze del ruolo VM.The Cloud Services environment API provides information and functionality for the current VM instance as well as information about other VM role instances. Service Fabric fornisce informazioni correlate al relativo runtime e alcune informazioni relative al nodo su cui un servizio è in esecuzione.Service Fabric provides information related to its runtime and some information about the node a service is currently running on.

Attività dell'ambienteEnvironment Task Servizi cloudCloud Services Service FabricService Fabric
Impostazioni di configurazione e notifica di modificheConfiguration Settings and change notification RoleEnvironment CodePackageActivationContext
Archiviazione localeLocal Storage RoleEnvironment CodePackageActivationContext
Informazioni sull'endpointEndpoint Information RoleInstance
  • Istanza corrente: RoleEnvironment.CurrentRoleInstanceCurrent instance: RoleEnvironment.CurrentRoleInstance
  • Altri ruoli e istanze: RoleEnvironment.RolesOther roles and instance: RoleEnvironment.Roles
  • NodeContext per l'indirizzo del nodo correnteNodeContext for current Node address
  • FabricClient e ServicePartitionResolver per l'individuazione di endpoint di servizioFabricClient and ServicePartitionResolver for service endpoint discovery
Emulazione dell'ambienteEnvironment Emulation RoleEnvironment.IsEmulated N/DN/A
Evento di modifica simultaneaSimultaneous change event RoleEnvironment N/DN/A

Impostazioni di configurazioneConfiguration settings

Le impostazioni di configurazione in Servici cloud vengono impostate per un ruolo VM e si applicano a tutte le istanze di quel ruolo VM.Configuration settings in Cloud Services are set for a VM role and apply to all instances of that VM role. Queste impostazioni sono coppie chiave-valore impostate nei file ServiceConfiguration..cscfg e sono accessibili direttamente tramite RoleEnvironment.These settings are key-value pairs set in ServiceConfiguration..cscfg files and can be accessed directly through RoleEnvironment. In Service Fabric le impostazioni si applicano singolarmente a ogni servizio e ogni applicazione, invece che a una VM, perché una VM può ospitare più servizi e applicazioni.In Service Fabric, settings apply individually to each service and to each application, rather than to a VM, because a VM can host multiple services and applications. Un servizio è composto da tre pacchetti:A service is composed of three packages:

  • Code: contiene i file eseguibili del servizio, i file binari, le DLL e qualsiasi altro file necessario per l'esecuzione di un servizio.Code: contains the service executables, binaries, DLLs, and any other files a service needs to run.
  • Config: tutti i file di configurazione e le impostazioni per un servizio.Config: all configuration files and settings for a service.
  • Data: file di dati statici associati al servizio.Data: static data files associated with the service.

Per ognuno di questi pacchetti l'aggiornamento e il controllo delle versioni possono essere gestiti in modo indipendente.Each of these packages can be independently versioned and upgraded. Analogamente a Servizi cloud, è possibile accedere a un pacchetto di configurazione a livello di codice tramite un'API e sono disponibili eventi per notificare al servizio una modifica del pacchetto di configurazione.Similar to Cloud Services, a config package can be accessed programmatically through an API and events are available to notify the service of a config package change. È possibile usare un file Settings.xml per la configurazione di chiave-valore e l'accesso a livello di codice simile alla sezione app settings di un file App.config.A Settings.xml file can be used for key-value configuration and programmatic access similar to the app settings section of an App.config file. Tuttavia, a differenza di Servizi cloud, un pacchetto di configurazione di Service Fabric può contenere qualsiasi file di configurazione in qualsiasi formato, ovvero XML, JSON, YAML o un formato binario personalizzato.However, unlike Cloud Services, a Service Fabric config package can contain any configuration files in any format, whether it's XML, JSON, YAML, or a custom binary format.

Accesso alla configurazioneAccessing configuration

Servizi cloudCloud Services

Le impostazioni di configurazione di ServiceConfiguration..cscfg sono accessibili tramite RoleEnvironment.Configuration settings from ServiceConfiguration..cscfg can be accessed through RoleEnvironment. Queste impostazioni sono disponibili globalmente per tutte le istanze del ruolo nella stessa distribuzione di Servizi cloud.These settings are globally available to all role instances in the same Cloud Service deployment.


string value = RoleEnvironment.GetConfigurationSettingValue("Key");

Service FabricService Fabric

Ogni servizio ha un pacchetto di configurazione individuale.Each service has its own individual configuration package. Non esiste un meccanismo predefinito per le impostazioni di configurazione globali accessibile da tutte le applicazioni in un cluster.There is no built-in mechanism for global configuration settings accessible by all applications in a cluster. Quando si usa il file di configurazione speciale Settings.xml di Service Fabric all'interno di un pacchetto di configurazione, i valori in Settings.XML possono essere sovrascritti a livello di applicazione, rendendo possibili le impostazioni di configurazione a livello di applicazione.When using Service Fabric's special Settings.xml configuration file within a configuration package, values in Settings.xml can be overwritten at the application level, making application-level configuration settings possible.

Alle impostazioni di configurazione è possibile accedere all'interno di ogni istanza del servizio tramite CodePackageActivationContextdel servizio.Configuration settings are accesses within each service instance through the service's CodePackageActivationContext.


ConfigurationPackage configPackage = this.Context.CodePackageActivationContext.GetConfigurationPackageObject("Config");

// Access Settings.xml
KeyedCollection<string, ConfigurationProperty> parameters = configPackage.Settings.Sections["MyConfigSection"].Parameters;

string value = parameters["Key"]?.Value;

// Access custom configuration file:
using (StreamReader reader = new StreamReader(Path.Combine(configPackage.Path, "CustomConfig.json")))
{
    MySettings settings = JsonConvert.DeserializeObject<MySettings>(reader.ReadToEnd());
}

Eventi di aggiornamento della configurazioneConfiguration update events

Servizi cloudCloud Services

L'evento RoleEnvironment.Changed viene usato per notificare a tutte le istanze del ruolo quando si verifica una modifica nell'ambiente, ad esempio una modifica della configurazione.The RoleEnvironment.Changed event is used to notify all role instances when a change occurs in the environment, such as a configuration change. Viene usato per gli aggiornamenti della configurazione senza riciclare le istanze del ruolo o riavviare un processo di lavoro.This is used to consume configuration updates without recycling role instances or restarting a worker process.


RoleEnvironment.Changed += RoleEnvironmentChanged;

private void RoleEnvironmentChanged(object sender, RoleEnvironmentChangedEventArgs e)
{
   // Get the list of configuration changes
   var settingChanges = e.Changes.OfType<RoleEnvironmentConfigurationSettingChange>();
foreach (var settingChange in settingChanges) 
   {
      Trace.WriteLine("Setting: " + settingChange.ConfigurationSettingName, "Information");
   }
}

Service FabricService Fabric

Ognuno dei tre tipi di pacchetto in un servizio, ovvero Code, Config e Data, include eventi che inviano una notifica a un'istanza del servizio quando un pacchetto viene aggiornato, aggiunto o rimosso.Each of the three package types in a service - Code, Config, and Data - have events that notify a service instance when a package is updated, added, or removed. Un servizio può contenere più pacchetti di ogni tipo.A service can contain multiple packages of each type. Ad esempio, un servizio può avere più pacchetti Config, ognuno aggiornabile e con controllo delle versioni gestito in modo indipendente.For example, a service may have multiple config packages, each individually versioned and upgradeable.

Questi eventi sono disponibili per l'utilizzo in caso di modifiche nei pacchetti del servizio senza riavviare l'istanza del servizio.These events are available to consume changes in service packages without restarting the service instance.


this.Context.CodePackageActivationContext.ConfigurationPackageModifiedEvent +=
                    this.CodePackageActivationContext_ConfigurationPackageModifiedEvent;

private void CodePackageActivationContext_ConfigurationPackageModifiedEvent(object sender, PackageModifiedEventArgs<ConfigurationPackage> e)
{
    this.UpdateCustomConfig(e.NewPackage.Path);
    this.UpdateSettings(e.NewPackage.Settings);
}

Attività di avvioStartup tasks

Le attività di avvio sono azioni eseguite prima dell'avvio di un'applicazione.Startup tasks are actions that are taken before an application starts. Un'attività di avvio viene in genere usata per eseguire script di installazione con privilegi elevati.A startup task is typically used to run setup scripts using elevated privileges. Sia Servizi Cloud che Service Fabric supportano attività di avvio.Both Cloud Services and Service Fabric support start-up tasks. La differenza principale riguarda il fatto che in Servizi cloud un'attività di avvio è collegata a una VM, perché fa parte di un'istanza del ruolo, mentre in Service Fabric un'attività di avvio è collegata a un servizio che non è associato a una VM specifica.The main difference is that in Cloud Services, a startup task is tied to a VM because it is part of a role instance, whereas in Service Fabric a startup task is tied to a service, which is not tied to any particular VM.

Servizi cloudCloud Services Service FabricService Fabric
Percorso di configurazioneConfiguration location ServiceDefinition.csdefServiceDefinition.csdef
PrivilegiPrivileges "limitato" o "con privilegi elevati""limited" or "elevated"
SequenziazioneSequencing "semplice", "background", "in primo piano""simple", "background", "foreground"

Servizi cloudCloud Services

In Servizi cloud è configurato un punto di ingresso di avvio per ogni ruolo in ServiceDefinition.csdef.In Cloud Services a startup entry point is configured per role in ServiceDefinition.csdef.


<ServiceDefinition>
    <Startup>
        <Task commandLine="Startup.cmd" executionContext="limited" taskType="simple" >
            <Environment>
                <Variable name="MyVersionNumber" value="1.0.0.0" />
            </Environment>
        </Task>
    </Startup>
    ...
</ServiceDefinition>

Service FabricService Fabric

In Service Fabric è configurato un punto di ingresso di avvio per ogni servizio in ServiceManifest.xml:In Service Fabric a startup entry point is configured per service in ServiceManifest.xml:


<ServiceManifest>
  <CodePackage Name="Code" Version="1.0.0">
    <SetupEntryPoint>
      <ExeHost>
        <Program>Startup.bat</Program>
      </ExeHost>
    </SetupEntryPoint>
    ...
</ServiceManifest>

Note sull'ambiente di sviluppoA note about development environment

Sia Servizi Cloud che Service Fabric sono integrati in Visual Studio con modelli di progetto e il supporto per il debug, la configurazione e la distribuzione sia locale che in Azure.Both Cloud Services and Service Fabric are integrated with Visual Studio with project templates and support for debugging, configuring, and deploying both locally and to Azure. Servizi cloud e Service Fabric forniscono anche un ambiente di runtime di sviluppo locale.Both Cloud Services and Service Fabric also provide a local development runtime environment. La differenza è che mentre il runtime di sviluppo di Servizi cloud emula l'ambiente Azure in cui viene eseguito, Service Fabric non usa un emulatore, ma il runtime di Service Fabric completo.The difference is that while the Cloud Service development runtime emulates the Azure environment on which it runs, Service Fabric does not use an emulator - it uses the complete Service Fabric runtime. L'ambiente di Service Fabric che viene eseguito nel computer di sviluppo locale è lo stesso ambiente eseguito nell'ambiente di produzione.The Service Fabric environment you run on your local development machine is the same environment that runs in production.

Passaggi successiviNext steps

Altre informazioni su Reliable Services di Service Fabric e le differenze fondamentali tra Servizi cloud e l'architettura dell'applicazione di Service Fabric per comprendere come sfruttare il set completo di funzionalità di Service Fabric.Read more about Service Fabric Reliable Services and the fundamental differences between Cloud Services and Service Fabric application architecture to understand how to take advantage of the full set of Service Fabric features.