0

在 c# 中,我想获取运行无状态服务的服务结构节点信息列表。这将在测试中很有用。我知道如何使用 FabricClient 类和 ActorServiceProxy 类为有状态服务执行此操作,但是对于无状态服务,我找不到方法。你有想法吗?

谢谢,

4

2 回答 2

1

对于仍在尝试执行此操作的任何人,我有一个计时器要求,要求我计算出有多少节点正在运行我的应用程序。这大致是我使用的代码:

string currentNodeName = ServiceContext.NodeContext.NodeName;
var fabricClient = new FabricClient();
var nodeList = (await fabricClient.QueryManager.GetNodeListAsync()).ToList();

var serviceName = ServiceContext.ServiceName.LocalPath.Split('/')[1];
var nodesRunningApplication = new List<Node>();
foreach (var node in nodeList)
{
    var nodeApplicationList = await fabricClient.QueryManager.GetDeployedApplicationListAsync(node.NodeName);
    var nodeApplication = nodeApplicationList.FirstOrDefault(p => 
        p.ApplicationName.LocalPath.Split('/')[1] == serviceName);

    if (nodeApplication != null)
    {
        nodesRunningApplication.Add(node);
    }
}
于 2019-06-26T08:05:27.150 回答
1

您仍然可以使用 FabricClient 获取此信息。使用 QueryManager 来检查您需要的信息

这是我用来快速查询最新版本的 TenantApp 服务的一些快速代码,然后我检查它们是否都在健康状态下运行,或者它们是否已正确升级。

var currentAppTypes = await fabricClient.QueryManager.GetApplicationTypeListAsync();
var tenantAppTypes = currentAppTypes.Where(x => x.ApplicationTypeName.Equals("TenantAppsType"));
var latestTenantAppType = currentAppTypes.Where(x => x.ApplicationTypeName.Equals("TenantAppsType"))?
.OrderByDescending(x =>
{
    var versions = x.ApplicationTypeVersion.Split('.');
    if (versions.Length == 3)
    {
         return (int.Parse(versions[0]) * 1000000) +
                (int.Parse(versions[1]) * 1000) +
                 int.Parse(versions[2]);
     }
     return 0;
})?.FirstOrDefault();
if (latestTenantAppType != null)
{
       var currentSvcTypes = await fabricClient.QueryManager.GetServiceTypeListAsync(latestTenantAppType.ApplicationTypeName, latestTenantAppType.ApplicationTypeVersion);
      // etc
}

或者,如果您只想让所有应用程序运行

var currentApps = await fabricClient.QueryManager.GetApplicationListAsync();

获得服务信息后,您可以检查其所在的节点,也可以直接检查节点本身

var currentNodes = fabricClient.QueryManager.GetNodeListAsync();
var nodeInfo = await fabricClient.QueryManager.GetNodeLoadInformationAsync("nodeName");

希望这可以帮助

于 2018-02-14T08:47:16.753 回答