有没有办法以编程方式检查Service Fabric是否已从外部客户端启动并运行?我想过只使用try catch块,但我很好奇是否有一种更优雅的方式。
答案 0 :(得分:2)
没有单一的"集群在运行吗?"命令。可以通过不同的方式解释问题。
但是对于外部客户端,您可以做的最简单的检查就是尝试与群集通信。群集可能正在运行"但如果您的客户无法与之通信,那么它可以在那里停止。要以编程方式执行此操作,您必须捕获通信异常。这是一个例子:
FabricClient client = new FabricClient();
try
{
await client.QueryManager.GetProvisionedFabricCodeVersionListAsync();
}
catch (FabricTransientException ex)
{
if (ex.ErrorCode == FabricErrorCode.CommunicationError)
{
// can't communicate with the cluster!
}
}
您基本上等待连接超时,因此完成此检查需要几秒钟。
答案 1 :(得分:0)
如果您的问题是:"如何检查Azure Service Fabric中的“我的服务”是否已启动并运行?"那你有一些选择。 (另一方面,如果您的问题是:"我如何检查Azure Service Fabric群集是否存在 正在运行?"然后你应该看看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);
使用关联的管理器客户端,您可以检查部署到群集的服务的运行状况。
使用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
之外的其他任何内容,那么您的服务可能会遇到一些问题。