Przewodnik dotyczący konwertowania ról sieci Web i procesu roboczego na usługi Service Fabric bezstanowych usług

W tym artykule opisano sposób migrowania ról sieci Web i procesu roboczego Cloud Services do usług bezstanowych usługi Service Fabric. Jest to najprostsza ścieżka migracji z Cloud Services do usługi Service Fabric dla aplikacji, których ogólna architektura pozostanie mniej więcej taka sama.

Projekt usługi w chmurze w projekcie aplikacji usługi Service Fabric

Projekt usługi w chmurze i projekt aplikacji usługi Service Fabric mają podobną strukturę, a obie reprezentują jednostkę wdrażania aplikacji — oznacza to, że każdy z nich definiuje kompletny pakiet wdrożony w celu uruchomienia aplikacji. Projekt usługi w chmurze zawiera co najmniej jedną rolę sieci Web lub procesu roboczego. Podobnie projekt aplikacji usługi Service Fabric zawiera co najmniej jedną usługę.

Różnica polega na tym, że projekt usługi w chmurze łączy wdrożenie aplikacji z wdrożeniem maszyny wirtualnej i zawiera w nim ustawienia konfiguracji maszyny wirtualnej, natomiast projekt aplikacji usługi Service Fabric definiuje tylko aplikację, która zostanie wdrożona w zestawie istniejących maszyn wirtualnych w klastrze usługi Service Fabric. Sam klaster usługi Service Fabric jest wdrażany tylko raz, za pośrednictwem szablonu Resource Manager lub za pośrednictwem Azure Portal, a w niej można wdrożyć wiele aplikacji usługi Service Fabric.

Porównanie projektów usługi Service Fabric i Cloud Services

Rola procesu roboczego do usługi bezstanowej

Koncepcyjnie rola procesu roboczego reprezentuje bezstanowe obciążenie, co oznacza, że każde wystąpienie obciążenia jest identyczne, a żądania mogą być kierowane do dowolnego wystąpienia w dowolnym momencie. Każde wystąpienie nie jest oczekiwane do zapamiętania poprzedniego żądania. Stan, na którym działa obciążenie, jest zarządzane przez zewnętrzny magazyn stanów, taki jak Azure Table Storage lub Azure Cosmos DB. W usłudze Service Fabric ten typ obciążenia jest reprezentowany przez usługę bezstanową. Najprostsze podejście do migrowania roli procesu roboczego do usługi Service Fabric można wykonać przez przekonwertowanie kodu roli procesu roboczego na usługę bezstanową.

Rola procesu roboczego na usługę bezstanową

Rola sieci Web do usługi bezstanowej

Podobnie jak rola procesu roboczego, rola sieci Web reprezentuje również bezstanowe obciążenie, więc koncepcyjnie można je również zamapować na usługę bezstanową usługi Service Fabric. Jednak w przeciwieństwie do ról sieci Web usługa Service Fabric nie obsługuje usług IIS. Aby przeprowadzić migrację aplikacji internetowej z roli sieci Web do usługi bezstanowej, należy najpierw przejść do platformy internetowej, która może być hostowana samodzielnie i nie zależy od usług IIS lub System.Web, takich jak ASP.NET Core 1.

Aplikacja Obsługiwane Ścieżka migracji
Formularze sieci Web ASP.NET Nie Konwertowanie na ASP.NET Core 1 MVC
ASP.NET MVC Z migracją Uaktualnianie do ASP.NET Core 1 MVC
ASP.NET Web API Z migracją Używanie własnego serwera lub ASP.NET Core 1
ASP.NET Core 1 Tak Nie dotyczy

Interfejs API punktu wejścia i cykl życia

Interfejsy API usługi Role i Service Fabric oferują podobne punkty wejścia:

Punkt wejścia Rola procesu roboczego Usługa Service Fabric
Przetwarzanie Run() RunAsync()
Uruchamianie maszyny wirtualnej OnStart() Nie dotyczy
Zatrzymywanie maszyny wirtualnej OnStop() Nie dotyczy
Otwieranie odbiornika dla żądań klientów Nie dotyczy
  • CreateServiceInstanceListener() dla bezstanowych
  • CreateServiceReplicaListener() w przypadku stanowego

Rola procesu roboczego


using Microsoft.WindowsAzure.ServiceRuntime;

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

        public override bool OnStart()
        {
        }

        public override void OnStop()
        {
        }
    }
}

Usługa bezstanowa usługi 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)
        {
        }
    }
}

Oba mają podstawowe przesłonięcia "Uruchom", w którym można rozpocząć przetwarzanie. Usługi Service Fabric łączą Runusługę , Starti Stop w jeden punkt wejścia, RunAsync. Usługa powinna rozpocząć pracę po RunAsync uruchomieniu i powinna przestać działać po RunAsync zasygnalizowanej metodzie CancellationToken.

Istnieje kilka kluczowych różnic między cyklem życia i okresem istnienia ról procesów roboczych a usługami Service Fabric:

  • Cyklem życia: Największą różnicą jest to, że rola procesu roboczego jest maszyną wirtualną, dlatego jej cykl życia jest powiązany z maszyną wirtualną, która obejmuje zdarzenia dotyczące uruchamiania i zatrzymywania maszyny wirtualnej. Usługa Service Fabric ma cykl życia oddzielony od cyklu życia maszyny wirtualnej, więc nie obejmuje zdarzeń, gdy maszyna wirtualna hosta lub maszyna zostanie uruchomiona i zatrzymana, ponieważ nie są powiązane.
  • Okres istnienia: Wystąpienie roli procesu roboczego Run zostanie odzyskane, jeśli metoda zakończy działanie. Metoda RunAsync w usłudze Service Fabric może jednak zostać uruchomiona w celu ukończenia, a wystąpienie usługi pozostanie w stanie.

Usługa Service Fabric udostępnia opcjonalny punkt wejścia konfiguracji komunikacji dla usług, które nasłuchują żądań klientów. Zarówno runAsync, jak i punkt wejścia komunikacji są opcjonalnymi przesłonięciami w usługach Service Fabric — usługa może wybrać tylko nasłuchiwanie żądań klientów lub uruchamianie pętli przetwarzania albo obu tych metod — dlatego metoda RunAsync może zakończyć działanie bez ponownego uruchomienia wystąpienia usługi, ponieważ może nadal nasłuchiwać żądań klientów.

Interfejs API aplikacji i środowisko

Interfejs API środowiska Cloud Services zawiera informacje i funkcje bieżącego wystąpienia maszyny wirtualnej oraz informacje o innych wystąpieniach roli maszyny wirtualnej. Usługa Service Fabric udostępnia informacje związane z jego środowiskiem uruchomieniowym i niektóre informacje o węźle, na którym jest obecnie uruchomiona usługa.

Zadanie środowiska Usługi w chmurze Service Fabric
Ustawienia konfiguracji i powiadomienie o zmianie RoleEnvironment CodePackageActivationContext
Magazyn lokalny RoleEnvironment CodePackageActivationContext
Informacje o punkcie końcowym RoleInstance
  • Bieżące wystąpienie: RoleEnvironment.CurrentRoleInstance
  • Inne role i wystąpienie: RoleEnvironment.Roles
  • NodeContext dla bieżącego adresu węzła
  • FabricClient i ServicePartitionResolver na potrzeby odnajdywania punktów końcowych usługi
Emulacja środowiska RoleEnvironment.IsEmulated Nie dotyczy
Jednoczesne zdarzenie zmiany RoleEnvironment Nie dotyczy

Ustawienia konfiguracji

Ustawienia konfiguracji w Cloud Services są ustawiane dla roli maszyny wirtualnej i mają zastosowanie do wszystkich wystąpień tej roli maszyny wirtualnej. Te ustawienia to pary klucz-wartość ustawione w plikach ServiceConfiguration.*.cscfg i można uzyskać do nich dostęp bezpośrednio za pośrednictwem programu RoleEnvironment. W usłudze Service Fabric ustawienia są stosowane indywidualnie do każdej usługi i do każdej aplikacji, a nie do maszyny wirtualnej, ponieważ maszyna wirtualna może hostować wiele usług i aplikacji. Usługa składa się z trzech pakietów:

  • Kod: zawiera pliki wykonywalne usługi, pliki binarne, biblioteki DLL i inne pliki, które należy uruchomić w usłudze.
  • Konfiguracja: wszystkie pliki konfiguracji i ustawienia usługi.
  • Dane: pliki danych statycznych skojarzone z usługą.

Każdy z tych pakietów może być niezależnie wersjonowany i uaktualniany. Podobnie jak Cloud Services dostęp do pakietu konfiguracji można uzyskać programowo za pośrednictwem interfejsu API, a zdarzenia są dostępne do powiadamiania usługi o zmianie pakietu konfiguracji. Plik Settings.xml może służyć do konfiguracji klucz-wartość i programowego dostępu podobnego do sekcji ustawień aplikacji w pliku App.config. Jednak w przeciwieństwie do Cloud Services pakiet konfiguracji usługi Service Fabric może zawierać dowolne pliki konfiguracji w dowolnym formacie, niezależnie od tego, czy jest to format XML, JSON, YAML, czy niestandardowy format binarny.

Uzyskiwanie dostępu do konfiguracji

Cloud Services

Dostęp do ustawień konfiguracji z pliku ServiceConfiguration.*.cscfg można uzyskać za pośrednictwem polecenia RoleEnvironment. Te ustawienia są globalnie dostępne dla wszystkich wystąpień ról w tym samym wdrożeniu usługi w chmurze.


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

Service Fabric

Każda usługa ma własny indywidualny pakiet konfiguracji. Nie ma wbudowanego mechanizmu globalnej konfiguracji dostępnego dla wszystkich aplikacji w klastrze. W przypadku używania specjalnego pliku konfiguracji Settings.xml usługi Service Fabric w pakiecie konfiguracji wartości w Settings.xml można zastąpić na poziomie aplikacji, co umożliwia ustawienie konfiguracji na poziomie aplikacji.

Ustawienia konfiguracji są dostępne w każdym wystąpieniu usługi za pośrednictwem usługi 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());
}

Zdarzenia aktualizacji konfiguracji

Cloud Services

Zdarzenie RoleEnvironment.Changed jest używane do powiadamiania wszystkich wystąpień ról w przypadku zmiany w środowisku, takiej jak zmiana konfiguracji. Służy to do korzystania z aktualizacji konfiguracji bez ponownego odtwarzania wystąpień roli lub ponownego uruchamiania procesu roboczego.


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

Każdy z trzech typów pakietów w usłudze — kod, konfiguracja i dane — mają zdarzenia, które powiadamiają wystąpienie usługi po zaktualizowaniu, dodaniu lub usunięciu pakietu. Usługa może zawierać wiele pakietów każdego typu. Na przykład usługa może mieć wiele pakietów konfiguracji, z których każda jest oddzielnie wersjonowana i możliwa do uaktualnienia.

Te zdarzenia są dostępne do korzystania ze zmian w pakietach usług bez ponownego uruchamiania wystąpienia usługi.


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

Zadania uruchamiania

Zadania uruchamiania to akcje wykonywane przed uruchomieniem aplikacji. Zadanie uruchamiania jest zwykle używane do uruchamiania skryptów instalacyjnych przy użyciu podwyższonych uprawnień. Zarówno Cloud Services, jak i Service Fabric obsługują zadania uruchamiania. Główną różnicą jest to, że w Cloud Services zadanie uruchamiania jest powiązane z maszyną wirtualną, ponieważ jest częścią wystąpienia roli, podczas gdy w usłudze Service Fabric zadanie uruchamiania jest powiązane z usługą, która nie jest powiązana z żadną konkretną maszyną wirtualną.

Service Fabric Cloud Services
Lokalizacja konfiguracji ServiceDefinition.csdef
Uprawnienia "ograniczone" lub "podniesione"
Sekwencjonowanie "simple", "background", "foreground"

Cloud Services

W Cloud Services punkt wejścia uruchamiania jest skonfigurowany dla każdej roli w pliku 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

W usłudze Service Fabric punkt wejścia uruchamiania jest skonfigurowany dla każdej usługi w ServiceManifest.xml:


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

Uwaga dotycząca środowiska deweloperskiego

Zarówno Cloud Services, jak i Service Fabric są zintegrowane z programem Visual Studio z szablonami projektów i obsługą debugowania, konfigurowania i wdrażania zarówno lokalnie, jak i na platformie Azure. Zarówno Cloud Services, jak i Service Fabric zapewniają lokalne środowisko uruchomieniowe programowania. Różnica polega na tym, że podczas gdy środowisko uruchomieniowe programowania usługi w chmurze emuluje środowisko platformy Azure, na którym działa, usługa Service Fabric nie używa emulatora — używa kompletnego środowiska uruchomieniowego usługi Service Fabric. Środowisko usługi Service Fabric uruchomione na lokalnej maszynie programistycznej jest tym samym środowiskiem, które działa w środowisku produkcyjnym.

Następne kroki

Przeczytaj więcej na temat usług Service Fabric Reliable Services i podstawowych różnic między architekturą aplikacji Cloud Services i Service Fabric, aby zrozumieć, jak korzystać z pełnego zestawu funkcji usługi Service Fabric.