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 para serviços sem estado do Service Fabric. Este é o caminho de migração mais simples dos Serviços em Nuvem para o Service Fabric para aplicativos cuja arquitetura geral permanecerá aproximadamente a mesma.

Projeto de serviço de nuvem 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

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 pode ser feita convertendo o código da Função de Trabalho em um 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 um aplicativo Web de uma Função Web para um serviço sem monitoração de estado, é necessário primeiro mover para uma estrutura da Web que possa ser auto-hospedada e não dependa do IIS ou do System.Web, como 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 da Função de Trabalho 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
Parada de VM OnStop() N/A
Escuta aberta para solicitações de clientes N/A
  • CreateServiceInstanceListener() para apátridas
  • CreateServiceReplicaListener() para stateful

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 substituição "Executar" primária na qual iniciar o processamento. Os serviços do Service Fabric combinam Run, Starte Stop em um único ponto de entrada, RunAsync. Seu serviço deve começar a funcionar quando RunAsync for iniciado e deve parar de funcionar quando o RunAsync CancellationToken do método 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 Função de Trabalho será reciclada se o Run método for encerrado. O RunAsync método em um serviço do Service Fabric, no entanto, pode ser executado até a conclusão e a instância de serviço permanecerá ativa.

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 fornece informações e funcionalidade 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 Cloud 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 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, 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 arquivo Settings.xml pode ser usado para configuração de chave-valor e acesso programático semelhante à seção de configurações do aplicativo de um arquivo App.config. No entanto, ao contrário dos Serviços de Nuvem, um pacote de configuração do Service Fabric pode conter quaisquer arquivos de configuração em qualquer formato, seja XML, JSON, YAML ou um formato binário personalizado.

Acessando a configuração

Serviços Cloud

As definições de configuração de ServiceConfiguration.*.cscfg podem ser acessadas através RoleEnvironmentdo . 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 acessos CodePackageActivationContextdentro de cada instância de serviço por meio do .


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 Cloud

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 na Nuvem e o Service Fabric suportam tarefas de inicialização. A principal diferença é que, nos Serviços de Nuvem, 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 Cloud
Localização da configuração ServiceDefinition.csdef
Privilégios "limitado" ou "elevado"
Sequenciação "simples", "fundo", "primeiro plano"

Serviços Cloud

Nos Serviços de Nuvem, 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 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 de Nuvem e o Service Fabric também fornecem um ambiente de tempo de execução 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 e a arquitetura de aplicativos do Service Fabric para entender como aproveitar o conjunto completo de recursos do Service Fabric.