FabricClient kullanarak uygulamaları dağıtma ve kaldırma


Bir uygulama türü paketlendikten sonra Azure Service Fabric kümesine dağıtıma hazır olur. Dağıtım aşağıdaki üç adımı içerir:

  1. Uygulama paketini görüntü deposuna yükleme
  2. Uygulama türünü kaydetme
  3. Uygulama paketini görüntü deposundan kaldırma
  4. Uygulama örneğini oluşturma

Bir uygulamayı dağıtıp kümede bir örneği çalıştırdıktan sonra, uygulama örneğini ve uygulama türünü silebilirsiniz. Aşağıdaki adımları izleyerek bir uygulamayı kümeden tamamen kaldırın:

  1. Çalışan uygulama örneğini kaldırma (veya silme)
  2. Artık ihtiyacınız yoksa uygulama türünün kaydını kaldırın

Yerel geliştirme kümenizde uygulama dağıtmak ve hata ayıklamak için Visual Studio kullanıyorsanız, önceki tüm adımlar bir PowerShell betiği aracılığıyla otomatik olarak işlenir. Bu betik, uygulama projesinin Betikler klasöründe bulunur. Bu makalede, aynı işlemleri Visual Studio dışında da gerçekleştirebilmeniz için bu betiğin ne yaptığı hakkında arka plan sağlanır.

Kümeye bağlanma

Bir küme oluşturarak kümeye BağlanBu makaledeki kod örneklerinden herhangi birini çalıştırmadan önce FabricClient örneği. Microsoft Entra ID, X509 sertifikaları veya Windows Active Directory kullanılarak güvenliği sağlanan bir yerel geliştirme kümesine veya uzak kümeye veya kümeye bağlanma örnekleri için bkz. Güvenli bir kümeye Bağlan. Yerel geliştirme kümesine bağlanmak için aşağıdaki örneği çalıştırın:

// Connect to the local cluster.
FabricClient fabricClient = new FabricClient();

Uygulama paketini karşıya yükleme

Visual Studio'da MyApplication adlı bir uygulama derleyip paketlediğiniz varsayılmaktadır. Varsayılan olarak, ApplicationManifest.xml dosyasında listelenen uygulama türü adı "MyApplicationType" olur. Gerekli uygulama bildirimini, hizmet bildirimlerini ve kod/yapılandırma/veri paketlerini içeren uygulama paketi C :\Users< username>\Documents\Visual Studio 2019\Projects\MyApplication\MyApplication\pkg\Debug.

Uygulama paketini karşıya yüklemek, bunu iç Service Fabric bileşenleri tarafından erişilebilen bir konuma yerleştirir. Service Fabric, uygulama paketinin kaydı sırasında uygulama paketini doğrular. Ancak, uygulama paketini yerel olarak (yani karşıya yüklemeden önce) doğrulamak istiyorsanız Test-ServiceFabricApplicationPackage cmdlet'ini kullanın.

CopyApplicationPackage API'si, uygulama paketini küme görüntü deposuna yükler.

Uygulama paketi büyükse ve/veya çok sayıda dosyası varsa, PowerShell kullanarak paketi sıkıştırabilir ve görüntü deposuna kopyalayabilirsiniz. Sıkıştırma, dosya boyutunu ve sayısını azaltır.

Görüntü deposu ve görüntü deposu bağlantı dizesi hakkında ek bilgi için bkz. Görüntü deposu bağlantı dizesi anlama.

Uygulama paketini kaydetme

Uygulama bildiriminde bildirilen uygulama türü ve sürümü, uygulama paketi kaydedildiğinde kullanılabilir hale gelir. Sistem önceki adımda karşıya yüklenen paketi okur, paketi doğrular, paket içeriğini işler ve işlenen paketi bir iç sistem konumuna kopyalar.

ProvisionApplicationAsync API'si, uygulama türünü kümeye kaydeder ve dağıtım için kullanılabilir hale getirir.

GetApplicationTypeListAsync API'sinde başarıyla kaydedilen tüm uygulama türleri hakkında bilgi sağlanır. Kaydın ne zaman yapıldığını belirlemek için bu API'yi kullanabilirsiniz.

Görüntü deposundan uygulama paketini kaldırma

Uygulama başarıyla kaydedildikten sonra uygulama paketini kaldırmanız önerilir. Görüntü deposundan uygulama paketlerinin silinmesi sistem kaynaklarını boşaltıyor. Kullanılmayan uygulama paketlerinin tutulması disk depolama alanı kullanır ve uygulama performansı sorunlarına yol açar. RemoveApplicationPackage API'sini kullanarak görüntü deposundan uygulama paketini silin.

Uygulama örneği oluşturma

CreateApplicationAsync API'sini kullanarak başarıyla kaydedilmiş herhangi bir uygulama türünden bir uygulama örneği oluşturabilirsiniz. Her uygulamanın adı "fabric:" düzeniyle başlamalıdır ve her uygulama örneği için benzersiz olmalıdır (küme içinde). Hedef uygulama türünün uygulama bildiriminde tanımlanan tüm varsayılan hizmetler de oluşturulur.

Kayıtlı bir uygulama türünün belirli bir sürümü için birden çok uygulama örneği oluşturulabilir. Her uygulama örneği, kendi çalışma dizini ve işlem kümesiyle yalıtılarak çalışır.

Kümede hangi adlandırılmış uygulamaların ve hizmetlerin çalıştığını görmek için GetApplicationListAsync ve GetServiceListAsync API'lerini çalıştırın.

Hizmet örneği oluşturma

CreateServiceAsync API'sini kullanarak bir hizmet türünden hizmet örneği oluşturabilirsiniz. Hizmet, uygulama bildiriminde varsayılan hizmet olarak bildirilirse, uygulama örneği oluşturulurken hizmet örneği oluşturulur. Zaten örneği oluşturulmuş bir hizmet için CreateServiceAsync API'sini çağırmak FabricException türünde bir özel durum döndürür. Özel durum, FabricErrorCode.ServiceAlreadyExists değerine sahip bir hata kodu içerir.

Hizmet örneğini kaldırma

Bir hizmet örneği artık gerekli olmadığında, DeleteServiceAsync API'sini çağırarak bunu çalışan uygulama örneğinden kaldırabilirsiniz.

Uyarı

Bu işlem geri alınamaz ve hizmet durumu kurtarılamaz.

Uygulama örneğini kaldırma

Bir uygulama örneğine artık gerek kalmadığında, DeleteApplicationAsync API'sini kullanarak adıyla kalıcı olarak kaldırabilirsiniz. DeleteApplicationAsync , uygulamaya ait tüm hizmetleri de otomatik olarak kaldırır ve tüm hizmet durumunu kalıcı olarak kaldırır.

Uyarı

Bu işlem geri alınamaz ve uygulama durumu kurtarılamaz.

Uygulama türünün kaydını kaldırma

Bir uygulama türünün belirli bir sürümüne artık gerek kalmadığında, Unregister-ServiceFabricApplicationType API'sini kullanarak uygulama türünün belirli bir sürümünün kaydını kaldırmanız gerekir. Uygulama türlerinin kullanılmayan sürümlerinin kaydı kaldırıldığında, görüntü deposu tarafından kullanılan depolama alanı serbest bırakılır. Uygulama türünün söz konusu sürümüne göre hiçbir uygulama örneği oluşturulmadıkça, uygulama türünün bir sürümünün kaydı silinebilir. Ayrıca, uygulama türünün bekleyen uygulama yükseltmeleri uygulama türünün bu sürümüne başvuruyor olamaz.

Sorun giderme

Copy-ServiceFabricApplicationPackage bir ImageStore Bağlan ionString ister

Service Fabric SDK ortamında zaten doğru varsayılanlar ayarlanmış olmalıdır. Ancak gerekirse, tüm komutların ImageStore Bağlan ionString değeri Service Fabric kümesinin kullandığı değerle eşleşmelidir. Get-ServiceFabricClusterManifest ve Get-ImageStore Bağlan ionStringFromClusterManifest komutları kullanılarak alınan ImageStore Bağlan ionString küme bildiriminde bulabilirsiniz:

PS C:\> Get-ImageStoreConnectionStringFromClusterManifest(Get-ServiceFabricClusterManifest)

Görüntü deposunu bağlantı dizesi almak için Service Fabric SDK PowerShell modülünün bir parçası olan Get-ImageStore Bağlan ionStringFromClusterManifest cmdlet'i kullanılır. SDK modülünü içeri aktarmak için şunu çalıştırın:

Import-Module "$ENV:ProgramFiles\Microsoft SDKs\Service Fabric\Tools\PSModule\ServiceFabricSDK\ServiceFabricSDK.psm1"

ImageStore Bağlan ionString, küme bildiriminde bulunur:

<ClusterManifest xmlns:xsd="https://www.w3.org/2001/XMLSchema" xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance" Name="Server-Default-SingleNode" Version="1.0" xmlns="http://schemas.microsoft.com/2011/01/fabric">

    [...]

    <Section Name="Management">
      <Parameter Name="ImageStoreConnectionString" Value="file:D:\ServiceFabric\Data\ImageStore" />
    </Section>

    [...]

Görüntü deposu ve görüntü deposu bağlantı dizesi hakkında ek bilgi için bkz. Görüntü deposu bağlantı dizesi anlama.

Büyük uygulama paketini dağıtma

Sorun: CopyApplicationPackage API'sinde büyük bir uygulama paketi (GB sırası) zaman aşımına uğradı. Şunu deneyin:

  • CopyApplicationPackage yöntemi için parametresiyle timeout daha büyük bir zaman aşımı belirtin. Varsayılan olarak, zaman aşımı 30 dakikadır.
  • Kaynak makinenizle küme arasındaki ağ bağlantısını denetleyin. Bağlantı yavaşsa, daha iyi bir ağ bağlantısına sahip bir makine kullanmayı göz önünde bulundurun. İstemci makine kümeden başka bir bölgedeyse, istemci makinesini kümeyle daha yakın veya aynı bölgede kullanmayı göz önünde bulundurun.
  • Dış azaltmaya ulaşılıp ulaşılmadığını denetleyin. Örneğin, görüntü deposu Azure Depolama'yı kullanacak şekilde yapılandırıldığında karşıya yükleme kısıtlanabilir.

Sorun: Paketi karşıya yükleme başarıyla tamamlandı, ancak ProvisionApplicationAsync API zaman aşımına uğradı. Deneyin:

  • Görüntü deposuna kopyalamadan önce paketi sıkıştırın. Sıkıştırma, dosya boyutunu ve dosya sayısını azaltır ve bu da Service Fabric'in gerçekleştirmesi gereken trafik ve çalışma miktarını azaltır. Karşıya yükleme işlemi daha yavaş olabilir (özellikle sıkıştırma süresini dahil ederseniz), ancak uygulama türünü kaydetme ve kaydını kaldırma işlemi daha hızlıdır.
  • Parametresiyle timeout ProvisionApplicationAsync API için daha büyük bir zaman aşımı belirtin.

Uygulama paketini birçok dosyayla dağıtma

Sorun: ProvisionApplicationAsync , birçok dosya içeren bir uygulama paketi için zaman aşımına uğradı (binlerce sıra). Şunu deneyin:

Kod örneği

Aşağıdaki örnek, bir uygulama paketini görüntü deposuna kopyalar ve uygulama türünü sağlar. Ardından örnek bir uygulama örneği oluşturur ve bir hizmet örneği oluşturur. Son olarak, örnek uygulama örneğini kaldırır, uygulama türünün sağlamasını kaldırır ve uygulama paketini görüntü deposundan siler.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection;
using System.Threading.Tasks;

using System.Fabric;
using System.Fabric.Description;
using System.Threading;

namespace ServiceFabricAppLifecycle
{
class Program
{
static void Main(string[] args)
{

    string clusterConnection = "localhost:19000";
    string appName = "fabric:/MyApplication";
    string appType = "MyApplicationType";
    string appVersion = "1.0.0";
    string serviceName = "fabric:/MyApplication/Stateless1";
    string imageStoreConnectionString = "file:C:\\SfDevCluster\\Data\\ImageStoreShare";
    string packagePathInImageStore = "MyApplication";
    string packagePath = "C:\\Users\\username\\Documents\\Visual Studio 2019\\Projects\\MyApplication\\MyApplication\\pkg\\Debug";
    string serviceType = "Stateless1Type";

    // Connect to the cluster.
    FabricClient fabricClient = new FabricClient(clusterConnection);

    // Copy the application package to a location in the image store
    try
    {
        fabricClient.ApplicationManager.CopyApplicationPackage(imageStoreConnectionString, packagePath, packagePathInImageStore);
        Console.WriteLine("Application package copied to {0}", packagePathInImageStore);
    }
    catch (AggregateException ae)
    {
        Console.WriteLine("Application package copy to Image Store failed: ");
        foreach (Exception ex in ae.InnerExceptions)
        {
            Console.WriteLine("HResult: {0} Message: {1}", ex.HResult, ex.Message);
        }
    }

    // Provision the application.  "MyApplicationV1" is the folder in the image store where the application package is located. 
    // The application type with name "MyApplicationType" and version "1.0.0" (both are found in the application manifest) 
    // is now registered in the cluster.            
    try
    {
        fabricClient.ApplicationManager.ProvisionApplicationAsync(packagePathInImageStore).Wait();

        Console.WriteLine("Provisioned application type {0}", packagePathInImageStore);
    }
    catch (AggregateException ae)
    {
        Console.WriteLine("Provision Application Type failed:");

        foreach (Exception ex in ae.InnerExceptions)
        {
            Console.WriteLine("HResult: {0} Message: {1}", ex.HResult, ex.Message);
        }
    }

    // Delete the application package from a location in the image store.
    try
    {
        fabricClient.ApplicationManager.RemoveApplicationPackage(imageStoreConnectionString, packagePathInImageStore);
        Console.WriteLine("Application package removed from {0}", packagePathInImageStore);
    }
    catch (AggregateException ae)
    {
        Console.WriteLine("Application package removal from Image Store failed: ");
        foreach (Exception ex in ae.InnerExceptions)
        {
            Console.WriteLine("HResult: {0} Message: {1}", ex.HResult, ex.Message);
        }
    }

    //  Create the application instance.
    try
    {
        ApplicationDescription appDesc = new ApplicationDescription(new Uri(appName), appType, appVersion);
        fabricClient.ApplicationManager.CreateApplicationAsync(appDesc).Wait();
        Console.WriteLine("Created application instance of type {0}, version {1}", appType, appVersion);
    }
    catch (AggregateException ae)
    {
        Console.WriteLine("CreateApplication failed.");
        foreach (Exception ex in ae.InnerExceptions)
        {
            Console.WriteLine("HResult: {0} Message: {1}", ex.HResult, ex.Message);
        }
    }

    // Create the stateless service description.  For stateful services, use a StatefulServiceDescription object.
    StatelessServiceDescription serviceDescription = new StatelessServiceDescription();
    serviceDescription.ApplicationName = new Uri(appName);
    serviceDescription.InstanceCount = 1;
    serviceDescription.PartitionSchemeDescription = new SingletonPartitionSchemeDescription();
    serviceDescription.ServiceName = new Uri(serviceName);
    serviceDescription.ServiceTypeName = serviceType;

    // Create the service instance.  If the service is declared as a default service in the ApplicationManifest.xml,
    // the service instance is already running and this call will fail.
    try
    {
        fabricClient.ServiceManager.CreateServiceAsync(serviceDescription).Wait();
        Console.WriteLine("Created service instance {0}", serviceName);
    }
    catch (AggregateException ae)
    {
        Console.WriteLine("CreateService failed.");
        foreach (Exception ex in ae.InnerExceptions)
        {
            Console.WriteLine("HResult: {0} Message: {1}", ex.HResult, ex.Message);
        }
    }

    // Delete a service instance.
    try
    {
        DeleteServiceDescription deleteServiceDescription = new DeleteServiceDescription(new Uri(serviceName));

        fabricClient.ServiceManager.DeleteServiceAsync(deleteServiceDescription);
        Console.WriteLine("Deleted service instance {0}", serviceName);
    }
    catch (AggregateException ae)
    {
        Console.WriteLine("DeleteService failed.");
        foreach (Exception ex in ae.InnerExceptions)
        {
            Console.WriteLine("HResult: {0} Message: {1}", ex.HResult, ex.Message);
        }
    }

    // Delete an application instance from the application type.
    try
    {
        DeleteApplicationDescription deleteApplicationDescription = new DeleteApplicationDescription(new Uri(appName));

        fabricClient.ApplicationManager.DeleteApplicationAsync(deleteApplicationDescription).Wait();
        Console.WriteLine("Deleted application instance {0}", appName);
    }
    catch (AggregateException ae)
    {
        Console.WriteLine("DeleteApplication failed.");
        foreach (Exception ex in ae.InnerExceptions)
        {
            Console.WriteLine("HResult: {0} Message: {1}", ex.HResult, ex.Message);
        }
    }

    // Un-provision the application type.
    try
    {
        fabricClient.ApplicationManager.UnprovisionApplicationAsync(appType, appVersion).Wait();
        Console.WriteLine("Un-provisioned application type {0}, version {1}", appType, appVersion);
    }
    catch (AggregateException ae)
    {
        Console.WriteLine("Un-provision application type failed: ");
        foreach (Exception ex in ae.InnerExceptions)
        {
            Console.WriteLine("HResult: {0} Message: {1}", ex.HResult, ex.Message);
        }
    }

    Console.WriteLine("Hit enter...");
    Console.Read();
}        
}
}

Sonraki adımlar

Service Fabric uygulama yükseltmesi

Service Fabric sistem durumuna giriş

Service Fabric hizmetini tanılama ve sorunlarını giderme

Service Fabric'te uygulama modelleme