Partilhar via


Guia para converter funções Web e de trabalho em serviços sem estado do Service Fabric

Este artigo descreve como migrar suas funções Web e de trabalho dos Serviços de Nuvem (suporte estendido) para serviços sem estado do Service Fabric. Este é o caminho de migração mais simples dos Serviços em Nuvem (suporte estendido) para o Service Fabric para aplicativos cuja arquitetura geral permanecerá aproximadamente a mesma.

Projeto de Serviços de Nuvem (suporte estendido) para projeto de aplicativo do Service Fabric

Um projeto de Serviço de Nuvem e um projeto de Aplicativo do Service Fabric têm uma estrutura semelhante e ambos representam a unidade de implantação do seu aplicativo - ou seja, cada um deles define o pacote completo que é implantado para executar seu aplicativo. Um projeto de Serviço de Nuvem contém uma ou mais Funções Web ou de Trabalho. Da mesma forma, um projeto de aplicativo do Service Fabric contém um ou mais serviços.

A diferença é que o projeto do Serviço de Nuvem associa a implantação do aplicativo a uma implantação de VM e, portanto, contém definições de configuração de VM nele, enquanto o projeto de Aplicativo do Service Fabric define apenas um aplicativo que será implantado em um conjunto de VMs existentes em um cluster do Service Fabric. O cluster do Service Fabric em si só é implantado uma vez, por meio de um modelo do Resource Manager ou do portal do Azure, e vários aplicativos do Service Fabric podem ser implantados nele.

Comparação de projetos do Service Fabric e dos Serviços na Nuvem (suporte estendido)

Função de trabalhador para serviço sem estado

Conceitualmente, uma Função de Trabalho representa uma carga de trabalho sem monitoração de estado, o que significa que cada instância da carga de trabalho é idêntica e as solicitações podem ser roteadas para qualquer instância a qualquer momento. Não se espera que cada instância se lembre da solicitação anterior. O estado em que a carga de trabalho opera é gerenciado por um armazenamento de estado externo, como o Armazenamento de Tabela do Azure ou o Azure Cosmos DB. No Service Fabric, esse tipo de carga de trabalho é representado por um Serviço sem Estado. A abordagem mais simples para migrar uma Função de Trabalho para o Service Fabric consiste em converter o código da Função de Trabalho num serviço sem estado.

Função de trabalhador para serviço sem estado

Função Web para serviço sem estado

Semelhante à Função de Trabalho, uma Função Web também representa uma carga de trabalho sem estado e, portanto, conceitualmente, ela também pode ser mapeada para um serviço sem estado do Service Fabric. No entanto, ao contrário das funções Web, o Service Fabric não oferece suporte ao IIS. Para migrar uma aplicação Web de uma Função Web para um serviço sem estado, é necessário primeiro mover para um framework da Web que possa ser hospedado localmente ou autogerido e não dependa do IIS ou do System.Web, como o ASP.NET Core 1.

Aplicação Suportado Caminho de migração
ASP.NET Web Forms Não Converter para ASP.NET Core 1 MVC
ASP.NET MVC Com a migração Atualize para o ASP.NET Core 1 MVC
API Web ASP.NET Com a migração Usar servidor auto-hospedado ou ASP.NET Core 1
ASP.NET Núcleo 1 Sim N/A

API e ciclo de vida do ponto de entrada

As APIs de serviço do Cargo do Trabalhador e do Service Fabric oferecem pontos de entrada semelhantes.

Ponto de entrada Função do trabalhador Serviço do Service Fabric
Em processamento Run() RunAsync()
Início da VM OnStart() N/A
Interrupção de VM OnStop() N/A
Abrir ouvinte para os pedidos dos clientes N/A
  • CreateServiceInstanceListener() para apátridas
  • CreateServiceReplicaListener() para com estado

Função do trabalhador


using Microsoft.WindowsAzure.ServiceRuntime;

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

        public override bool OnStart()
        {
        }

        public override void OnStop()
        {
        }
    }
}

Serviço sem estado do Service Fabric


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)
        {
        }
    }
}

Ambos têm uma configuração primária 'Executar' na qual iniciar o processamento. Os serviços do Service Fabric combinam Run, Starte Stop em um único ponto de entrada, RunAsync. O seu serviço deve começar a funcionar quando RunAsync for iniciado e deve parar de funcionar quando o CancellationToken do método RunAsync for sinalizado.

Há várias diferenças importantes entre o ciclo de vida e o tempo de vida das funções de trabalho e dos serviços do Service Fabric:

  • Ciclo de vida: a maior diferença é que uma Função de Trabalho é uma VM e, portanto, seu ciclo de vida está vinculado à VM, o que inclui eventos para quando a VM inicia e para. Um serviço do Service Fabric tem um ciclo de vida separado do ciclo de vida da VM, portanto, não inclui eventos para quando a VM ou a máquina do host inicia e para, pois eles não estão relacionados.
  • Tempo de vida: Uma instância de Worker Role será reciclada se o método Run for encerrado. O RunAsync método num serviço do Service Fabric, todavia, pode ser executado até ao fim e a instância de serviço continuará operacional.

O Service Fabric fornece um ponto de entrada de configuração de comunicação opcional para serviços que escutam solicitações de clientes. Tanto o RunAsync quanto o ponto de entrada de comunicação são substituições opcionais nos serviços do Service Fabric - seu serviço pode optar por ouvir apenas as solicitações do cliente ou executar apenas um loop de processamento, ou ambos - e é por isso que o método RunAsync tem permissão para sair sem reiniciar a instância de serviço, porque ele pode continuar a ouvir as solicitações do cliente.

API e ambiente de aplicativos

A API do ambiente de Serviços de Nuvem (suporte estendido) fornece informações e funcionalidades para a instância de VM atual, bem como informações sobre outras instâncias de função de VM. O Service Fabric fornece informações relacionadas ao seu tempo de execução e algumas informações sobre o nó em que um serviço está sendo executado no momento.

Tarefa Ambiente Serviços na nuvem (suporte alargado) Service Fabric
Definições de configuração e notificação de alteração RoleEnvironment CodePackageActivationContext
Armazenamento Local RoleEnvironment CodePackageActivationContext
Informações sobre o ponto final RoleInstance
  • Instância atual: RoleEnvironment.CurrentRoleInstance
  • Outras funções e instâncias: RoleEnvironment.Roles
  • NodeContext para o endereço do nó atual
  • FabricClient e ServicePartitionResolver para a descoberta de pontos finais de serviço
Emulação de ambiente RoleEnvironment.IsEmulated N/A
Evento de alteração simultânea RoleEnvironment N/A

Definições de configuração

As definições de configuração nos Serviços de Nuvem (suporte estendido) são definidas para uma função VM e se aplicam a todas as instâncias dessa função VM. Essas configurações são pares chave-valor definidos em arquivos ServiceConfiguration.*.cscfg e podem ser acessadas diretamente por meio de RoleEnvironment. No Service Fabric, as configurações se aplicam individualmente a cada serviço e a cada aplicativo, em vez de a uma VM, porque uma VM pode hospedar vários serviços e aplicativos. Um serviço é composto por três pacotes:

  • Código: contém os executáveis de serviço, binários, DLLs e quaisquer outros arquivos que um serviço precise executar.
  • Config: todos os arquivos de configuração e definições para um serviço.
  • Dados: ficheiros de dados estáticos associados ao serviço.

Cada um desses pacotes pode ser versionado e atualizado de forma independente. Semelhante aos Serviços de Nuvem (suporte estendido), um pacote de configuração pode ser acessado programaticamente por meio de uma API e eventos estão disponíveis para notificar o serviço de uma alteração de pacote de configuração. Um ficheiro Settings.xml pode ser usado para configuração chave-valor e acesso programático de forma semelhante à secção de definições da aplicação de um ficheiro App.config. No entanto, ao contrário dos Serviços de Nuvem (suporte estendido), um pacote de configuração do Service Fabric pode conter qualquer arquivo de configuração em qualquer formato, seja XML, JSON, YAML ou um formato binário personalizado.

Acessando a configuração

Serviços na nuvem (suporte alargado)

As definições de configuração de ServiceConfiguration.*.cscfg podem ser acedidas através de RoleEnvironment. Essas configurações estão disponíveis globalmente para todas as instâncias de função na mesma implantação do Serviço de Nuvem.


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

Service Fabric

Cada serviço tem seu próprio pacote de configuração individual. Não há nenhum mecanismo interno para definições de configuração global acessíveis por todos os aplicativos em um cluster. Ao usar o arquivo de configuração de Settings.xml especial do Service Fabric em um pacote de configuração, os valores em Settings.xml podem ser substituídos no nível do aplicativo, tornando as definições de configuração no nível do aplicativo possíveis.

As definições de configuração são acedidas em cada instância de serviço através do 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());
}

Eventos de atualização de configuração

Serviços na nuvem (suporte alargado)

O RoleEnvironment.Changed evento é usado para notificar todas as instâncias de função quando ocorre uma alteração no ambiente, como uma alteração de configuração. Isso é usado para consumir atualizações de configuração sem reciclar instâncias de função ou reiniciar um processo de trabalho.


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 Fabric

Cada um dos três tipos de pacote em um serviço - Código, Configuração e Dados - tem eventos que notificam uma instância de serviço quando um pacote é atualizado, adicionado ou removido. Um serviço pode conter vários pacotes de cada tipo. Por exemplo, um serviço pode ter vários pacotes de configuração, cada um com versão individual e atualizável.

Esses eventos estão disponíveis para consumir alterações em pacotes de serviço sem reiniciar a instância de serviço.


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);
}

Tarefas de arranque

As tarefas de inicialização são ações executadas antes do início de um aplicativo. Uma tarefa de inicialização é normalmente usada para executar scripts de instalação usando privilégios elevados. Os Serviços de Nuvem (suporte estendido) e o Service Fabric suportam tarefas de inicialização. A principal diferença é que, nos Serviços de Nuvem (suporte estendido), uma tarefa de inicialização está vinculada a uma VM porque faz parte de uma instância de função, enquanto no Service Fabric uma tarefa de inicialização está vinculada a um serviço, que não está vinculado a nenhuma VM específica.

Service Fabric Serviços na nuvem (suporte alargado)
Localização da configuração ServiceDefinition.csdef
Privilégios "limitado" ou "elevado"
Sequenciação "simples", "fundo", "primeiro plano"

Serviços na nuvem (suporte alargado)

Nos Serviços de Nuvem (suporte estendido), um ponto de entrada de inicialização é configurado por função em 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 Fabric

No Service Fabric, um ponto de entrada de inicialização é configurado por serviço em ServiceManifest.xml:


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

Uma nota sobre o ambiente de desenvolvimento

Os Serviços de Nuvem (suporte estendido) e o Service Fabric são integrados ao Visual Studio com modelos de projeto e suporte para depuração, configuração e implantação local e no Azure. Os Serviços na Nuvem (suporte estendido) e o Service Fabric também fornecem um ambiente de desenvolvimento local. A diferença é que, enquanto o tempo de execução de desenvolvimento do Serviço de Nuvem emula o ambiente do Azure no qual é executado, o Service Fabric não usa um emulador - ele usa o tempo de execução completo do Service Fabric. O ambiente do Service Fabric executado na máquina de desenvolvimento local é o mesmo que é executado na produção.

Próximos passos

Leia mais sobre os Serviços Confiáveis do Service Fabric e as diferenças fundamentais entre os Serviços de Nuvem (suporte estendido) e a arquitetura de aplicativos do Service Fabric para entender como aproveitar o conjunto completo de recursos do Service Fabric.