2017-01-23 116 views
2

有沒有辦法以編程方式檢查Service Fabric是否啓動並從外部客戶端運行?我想過使用try catch塊,但我很好奇是否有一種更優雅的方式。如何檢查Azure服務結構是否已啓動並正在運行?

+0

你的意思是檢查你的服務織物集羣正在運行,或者如果一個應用程序中的特定應用程序或服務正在運行? – yoape

回答

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那麼你的服務可能別人有一些問題。