我正在使用Azure Service Fabric和控制台应用。我只是希望我的控制台应用程序连接到群集并执行一些操作。
控制台应用尝试使用以下内容解析服务地址:
static void Main(string[] args)
{
ServicePartitionResolver resolver = null;
try
{
resolver = new ServicePartitionResolver(
new string[] {
"localhost:19000",
"localhost:19001"
});
Uri serviceUri = new Uri("fabric:/StatefullServiceTEST/MyStatefulService");
ResolvedServicePartition partition = resolver.ResolveAsync(serviceUri, new ServicePartitionKey(), CancellationToken.None).GetAwaiter().GetResult();
}
catch (Exception ex)
{
Console.WriteLine($"Exception: {ex.Message}");
}
Console.WriteLine();
Console.Write("Press any key to exit...");
Console.ReadKey();
}
我的问题是resolver.ResolveAsync
抛出了一个似乎与Service Fabric没有任何关系的异常:
无法将“System .__ ComObject”类型的COM对象强制转换为接口 输入'IFabricApplicationManagementClient10'。此操作失败 因为QueryInterface调用COM组件的接口 与IID'{67001225-D106-41AE-8BD4-5A0A119C5C01}'失败,因为 以下错误:不支持此类接口(来自HRESULT的异常: 0x80004002(E_NOINTERFACE))。
有关于此的任何想法吗?
更新
我不太清楚地解释我的问题以及我想要实现的目标。
我正在使用Azure Service Fabric(无状态和有状态服务):我的问题是:调用Azure Service Fabric中托管的微服务的最佳方法是什么?
此致 阿蒂利奥
答案 0 :(得分:1)
您必须创建一个面向公众的服务(例如Asp.net Core Web Api),它将服务结构内的服务功能暴露给外部世界(服务结构集群之外)。 FabricClient方法可用于从服务结构集群内而不是外部调用服务。
从您的Asp.net Core服务中,您将使用FabricClient访问托管的服务,因此通常您的asp.net核心应用程序充当反向代理以公开实际服务的功能。
答案 1 :(得分:0)
您无法使用ServicePartitionResolver
从外部访问ASF群集中的服务。
您的群集上必须有一个面向公众的端点,例如充当web api的无状态服务。
来自the docs:
群集内相互连接的服务通常可以直接访问其他服务的端点,因为群集中的节点位于同一本地网络中。但是,在某些环境中,群集可能位于负载均衡器后面,该负载均衡器通过一组有限的端口路由外部入口流量。在这些情况下,服务仍然可以相互通信并使用命名服务解析地址,但必须采取额外步骤以允许外部客户端连接到服务。
Azure中的Service Fabric群集位于Azure负载均衡器后面。 群集的所有外部流量必须通过负载均衡器。负载均衡器将自动将给定端口上的入站流量转发到具有相同端口打开的随机节点。 Azure负载均衡器只知道节点上打开的端口,它不知道各个服务打开的端口。
因此,除非您的控制台应用程序作为guest executable在群集中托管,否则您还有更多工作要做。
答案 2 :(得分:0)
您无法使用ServicePartitionResolver
,这是一项可靠的服务功能,必须在群集中运行的服务中进行调用。
我无法清楚地理解你想要的东西。
如果您想管理服务并获取有关它的详细信息,例如查询正在运行的实例或副本,添加或删除实例等,请使用Fabric Client,下面是一个快速代码段,请查看详细信息{{ 3}}和here:
`
using System.Fabric;
using System.Security.Cryptography.X509Certificates;
string clientCertThumb = "71DE04467C9ED0544D021098BCD44C71E183414E";
string serverCertThumb = "A8136758F4AB8962AF2BF3F27921BE1DF67F4326";
string CommonName = "www.clustername.westus.azure.com";
string connection = "clustername.westus.cloudapp.azure.com:19000";
var xc = GetCredentials(clientCertThumb, serverCertThumb, CommonName);
var fc = new FabricClient(xc, connection);`
,或者
如果您想与正在运行的服务(如API)进行通信,则应使用反向代理通过网址解析您的服务,如下面的代码段所示,更多详情here:
http://mycluster.eastus.cloudapp.azure.com:19081/MyApp/MyService