Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
После упаковки типа приложения он готов к развертыванию в кластере Azure Service Fabric. Развертывание включает в себя следующие три шага:
- Отправка пакета приложения в хранилище образов
- Регистрация типа приложения
- Удаление пакета приложения из хранилища образов
- Создание экземпляра приложения
После развертывания приложения и запуска экземпляра в кластере можно удалить экземпляр приложения и его тип приложения. Полностью удалите приложение из кластера, выполнив следующие действия.
- Удаление (или удаление) запущенного экземпляра приложения
- Отмена регистрации типа приложения, если он больше не нужен
Если вы используете Visual Studio для развертывания и отладки приложений в локальном кластере разработки, все предыдущие шаги обрабатываются автоматически с помощью скрипта PowerShell. Этот скрипт находится в папке "Скрипты " проекта приложения. Эта статья содержит общие сведения о том, что делает этот скрипт, чтобы вы могли выполнять те же операции за пределами Visual Studio.
Подключение к кластеру
Подключитесь к кластеру, создав экземпляр FabricClient перед выполнением любого из примеров кода в этой статье. Примеры подключения к локальному кластеру разработки или удаленному кластеру или кластеру, защищенному с помощью идентификатора Microsoft Entra, сертификатов X509 или Windows Active Directory, см. в статье "Подключение к безопасному кластеру". Чтобы подключиться к локальному кластеру разработки, выполните следующий пример:
// Connect to the local cluster.
FabricClient fabricClient = new FabricClient();
Отправка пакета приложения
Предположим, что вы создаете и упаковали приложение с именем MyApplication в Visual Studio. По умолчанию имя типа приложения, указанное в ApplicationManifest.xml, — MyApplicationType. Пакет приложения, содержащий необходимый манифест приложения, манифесты служб и пакеты кода/конфигурации/данных, расположен в
Отправка пакета приложения помещает его в расположение, доступное внутренними компонентами Service Fabric. Service Fabric проверяет пакет приложения во время регистрации пакета приложения. Однако если вы хотите проверить пакет приложения локально (то есть перед отправкой), используйте командлет Test-ServiceFabricApplicationPackage .
API CopyApplicationPackage отправляет пакет приложения в хранилище образов кластера.
Если пакет приложения большой и (или) имеет много файлов, его можно сжать и скопировать в хранилище образов с помощью PowerShell. Сжатие уменьшает размер и количество файлов.
Дополнительные сведения о хранилище образов и строке подключения к хранилищу образов см. в разделе "Сведения о строке подключения к хранилищу образов ".
Регистрация пакета приложения
Тип приложения и версия, объявленные в манифесте приложения, становятся доступными при регистрации пакета приложения. Система считывает пакет, отправленный на предыдущем шаге, проверяет пакет, обрабатывает содержимое пакета и копирует обработанный пакет в внутреннее расположение системы.
API ProvisionApplicationAsync регистрирует тип приложения в кластере и делает его доступным для развертывания.
API GetApplicationTypeListAsync предоставляет сведения обо всех успешно зарегистрированных типах приложений. Этот API можно использовать для определения завершения регистрации.
Удаление пакета приложения из хранилища образов
Рекомендуется удалить пакет приложения после успешной регистрации приложения. Удаление пакетов приложений из хранилища образов освобождает системные ресурсы. Сохранение неиспользуемых пакетов приложений использует дисковое хранилище и приводит к проблемам с производительностью приложений. Удалите пакет приложения из хранилища образов с помощью API RemoveApplicationPackage .
Создание экземпляра приложения
Вы можете создать экземпляр приложения из любого типа приложения, зарегистрированного успешно с помощью API CreateApplicationAsync . Имя каждого приложения должно начинаться со схемы Fabric:, и должно быть уникальным для каждого экземпляра приложения (в кластере). Также создаются все службы по умолчанию, определенные в манифесте приложения целевого типа приложения.
Для любой указанной версии зарегистрированного типа приложения можно создать несколько экземпляров приложения. Каждый экземпляр приложения выполняется в изоляции с собственным рабочим каталогом и набором процессов.
Чтобы узнать, какие именованные приложения и службы выполняются в кластере, запустите API GetApplicationListAsync и GetServiceListAsync .
Создание экземпляра службы
Вы можете создать экземпляр службы из типа службы с помощью API CreateServiceAsync . Если служба объявлена в качестве службы по умолчанию в манифесте приложения, служба инициализируется при инициализации приложения. Вызов API CreateServiceAsync для службы, которая уже создана, возвращает исключение type FabricException. Исключение будет содержать код ошибки со значением FabricErrorCode.ServiceAlreadyExists.
Удаление экземпляра службы
Если экземпляр службы больше не нужен, его можно удалить из запущенного экземпляра приложения, вызвав API DeleteServiceAsync .
Предупреждение
Эта операция не может быть отменена, а состояние службы не может быть восстановлено.
Удаление экземпляра приложения
Если экземпляр приложения больше не нужен, вы можете удалить его навсегда, используя API DeleteApplicationAsync. DeleteApplicationAsync автоматически удаляет все службы, принадлежащие приложению, а также безвозвратно удаляя все состояние службы.
Предупреждение
Эта операция не может быть отменена, а состояние приложения не может быть восстановлено.
Отмена регистрации типа приложения
Если определенная версия типа приложения больше не нужна, следует отменить регистрацию конкретной версии типа приложения с помощью API Unregister-ServiceFabricApplicationType . Отмена регистрации неиспользуемых версий типов приложений освобождает место в хранилище образов. Версия типа приложения может быть незарегистрирована до тех пор, пока не создаются экземпляры приложений для этой версии типа приложения. Кроме того, для типа приложения не должна быть запланирована установка обновлений приложений, ссылающихся на эту версию типа приложения.
Устранение неполадок
Copy-ServiceFabricApplicationPackage запрашивает ImageStoreConnectionString
Среда SDK Service Fabric уже должна иметь правильные значения по умолчанию. Но при необходимости imageStoreConnectionString для всех команд должен соответствовать значению, используемому кластером Service Fabric. Вы можете найти ImageStoreConnectionString в манифесте кластера, полученный с помощью команд Get-ServiceFabricClusterManifest и Get-ImageStoreConnectionStringFromClusterManifest:
PS C:\> Get-ImageStoreConnectionStringFromClusterManifest(Get-ServiceFabricClusterManifest)
Командлет Get-ImageStoreConnectionStringFromClusterManifest , который входит в модуль PowerShell пакета SDK Service Fabric, используется для получения строки подключения хранилища образов. Чтобы импортировать модуль SDK, выполните следующую команду:
Import-Module "$ENV:ProgramFiles\Microsoft SDKs\Service Fabric\Tools\PSModule\ServiceFabricSDK\ServiceFabricSDK.psm1"
ImageStoreConnectionString находится в манифесте кластера:
<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>
[...]
Дополнительные сведения о хранилище образов и строке подключения к хранилищу образов см. в разделе "Сведения о строке подключения к хранилищу образов ".
Развертывание большого пакета приложения
Проблема: время ожидания API CopyApplicationPackage для большого пакета приложения (порядка ГБ). Попробуйте следующее:
- Укажите больше времени ожидания для метода CopyApplicationPackage с
timeout
параметром. По умолчанию время ожидания составляет 30 минут. - Проверьте сетевое подключение между исходным компьютером и кластером. Если подключение медленно, рассмотрите возможность использования компьютера с лучшим сетевым подключением. Если клиентский компьютер находится в другом регионе, чем в кластере, рассмотрите возможность использования клиентского компьютера в более близком или том же регионе, что и кластер.
- Проверьте, подвергаетесь ли вы внешнему регулированию. Например, если хранилище образов настроено для использования хранилища Azure, отправка может регулироваться.
Проблема. Отправка пакета завершена успешно, но время ожидания API ProvisionApplicationAsync истекает. Попытка:
- Сжать пакет перед копированием в хранилище образов. Сжатие уменьшает размер и количество файлов, что, в свою очередь, уменьшает объем трафика и работу, которую необходимо выполнить Service Fabric. Операция загрузки может быть медленнее (особенно если учитывать время на сжатие), но регистрация и отмена регистрации типа приложения происходят быстрее.
- Укажите больше времени ожидания для API ProvisionApplicationAsync с
timeout
параметром.
Развертывание пакета приложения с большим количеством файлов
Проблема: ProvisionApplicationAsync завершает время ожидания для пакета приложения с множеством файлов (в количестве тысяч). Попробуйте следующее:
- Сжать пакет перед копированием в хранилище образов. Сжатие уменьшает количество файлов.
- Укажите больше времени ожидания для ProvisionApplicationAsync с
timeout
параметром.
Пример кода
В следующем примере копируется пакет приложения в хранилище образов и подготавливается тип приложения. Затем в примере создается экземпляр приложения и создается экземпляр службы. Наконец, пример удаляет экземпляр приложения, отменяет подготовку типа приложения и удаляет пакет приложения из хранилища образов.
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();
}
}
}
Дальнейшие действия
Обновление приложения Service Fabric
Общие сведения о работоспособности Service Fabric