有沒有辦法以編程方式檢查Service Fabric是否啓動並從外部客戶端運行?我想過使用try catch塊,但我很好奇是否有一種更優雅的方式。如何檢查Azure服務結構是否已啓動並正在運行?
2
A
回答
2
沒有一個「集羣正在運行嗎?」命令。這個問題有不同的解釋方式。
但是對於外部客戶端來說,最簡單的檢查就是簡單地嘗試與集羣進行通信。羣集可能「正在運行」,但如果您的客戶端無法與它通信,那麼它可以在那裏停止。要以編程方式執行此操作,您必須捕獲通信異常。這裏有一個例子:
FabricClient client = new FabricClient();
try
{
await client.QueryManager.GetProvisionedFabricCodeVersionListAsync();
}
catch (FabricTransientException ex)
{
if (ex.ErrorCode == FabricErrorCode.CommunicationError)
{
// can't communicate with the cluster!
}
}
你基本上等待連接超時,因此將需要幾秒鐘,該檢查完成。
0
如果您的問題是:「如何檢查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
那麼你的服務可能別人有一些問題。
你的意思是檢查你的服務織物集羣正在運行,或者如果一個應用程序中的特定應用程序或服務正在運行? – yoape