如何检查Azure服务结构是否已启动并正在运行?

问题描述:

有没有办法以编程方式检查Service Fabric是否启动并从外部客户端运行?我想过使用try catch块,但我很好奇是否有一种更优雅的方式。如何检查Azure服务结构是否已启动并正在运行?

+0

你的意思是检查你的服务织物集群正在运行,或者如果一个应用程序中的特定应用程序或服务正在运行? – yoape

没有一个“集群正在运行吗?”命令。这个问题有不同的解释方式。

但是对于外部客户端来说,最简单的检查就是简单地尝试与集群进行通信。群集可能“正在运行”,但如果您的客户端无法与它通信,那么它可以在那里停止。要以编程方式执行此操作,您必须捕获通信异常。这里有一个例子:

FabricClient client = new FabricClient(); 

try 
{ 
    await client.QueryManager.GetProvisionedFabricCodeVersionListAsync(); 
} 
catch (FabricTransientException ex) 
{ 
    if (ex.ErrorCode == FabricErrorCode.CommunicationError) 
    { 
     // can't communicate with the cluster! 
    } 
} 

你基本上等待连接超时,因此将需要几秒钟,该检查完成。

如果您的问题是:“如何检查Azure服务结构中的我的服务是否已启动并正在运行?”那么你有一些选择。 (如果您在另一方面的问题是:“我如何检查是否Azure的服务织物集群 启动并运行?”那么你应该看看Vaclav's answer。)

创建的FabricClient一个新实例,现在你可以做很多有趣的事情,包括检查你的服务的健康状况。

如果您的集群是安全的(推荐),那么您需要提供X509Credentials。你可以按照这篇文章https://docs.microsoft.com/en-us/azure/service-fabric/service-fabric-connect-to-secure-cluster

var connection = "myclustername.westeurope.cloudapp.azure.com:19000"; 
    var fabricClient = new FabricClient(GetCredentials(clientCertThumb, serverCertThumb, CommonName), connection); 

使用相关Manager客户端,您可以检查部署到群集服务的健康状态。

使用FabricClient.ServiceHealthManager检查各个分区:

var serviceHealth = await fabricClient.HealthManager.GetServiceHealthAsync(serviceName); 
foreach (var serviceHealthPartitionHealthState in serviceHealth.PartitionHealthStates) 
{ 
    Console.WriteLine($"Health state: {serviceHealthPartitionHealthState.PartitionId} {serviceHealthPartitionHealthState.AggregatedHealthState}"); 
} 

使用FabricClient.QueryManagerClient检查每个服务的聚集健康:

var serviceList = await fabricClient.QueryManager.GetServiceListAsync(applicationName); 
foreach (var service in serviceList) 
{ 
    Console.WriteLine($"\tFound service {service.ServiceName} {service.ServiceStatus} {service.HealthState}"); 
} 

如果这些评价任何东西比System.Fabric.Health.HealthState.Ok那么你的服务可能别人有一些问题。