Позвоните в Azure Service Fabric извне
Я играю с 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:
Не удалось преобразовать COM-объект типа "System.__ComObject" в интерфейсный тип "IFabricApplicationManagementClient10". Эта операция завершилась неудачно, поскольку вызов QueryInterface в компоненте COM для интерфейса с IID '{67001225-D106-41AE-8BD4-5A0A119C5C01}' завершился ошибкой из-за следующей ошибки: такой интерфейс не поддерживается (Исключение из HRESULT: 0x80004002 (E_NOINTERFACE)),
Есть идеи по этому поводу?
ОБНОВИТЬ
Мне было не очень ясно объяснять свою проблему и то, чего я хочу достичь.
Я играю с Azure Service Fabric (как без сохранения состояния, так и с сохранением состояния): мой вопрос: как лучше назвать микросервис, размещенный в Azure Service Fabric?
С уважением, Аттилио
3 ответа
Вы не можете использовать ServicePartitionResolver
это надежная функция службы, которую необходимо вызывать из службы, работающей в вашем кластере.
Я не мог ясно понять, что вы хотите.
Если вы хотите управлять службой и получать подробные сведения о ней, например запускать экземпляры или реплики запросов, добавлять или удалять экземпляры и т. Д. Используйте Fabric Client, ниже приведен краткий фрагмент, проверьте подробности здесь и здесь:
`
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, вы должны использовать обратный прокси-сервер для разрешения ваших служб с помощью URL-адреса, как показано ниже: более подробная информация здесь:
http://mycluster.eastus.cloudapp.azure.com:19081/MyApp/MyService
Вы должны создать общедоступную службу (такую как Asp.net Core Web Api), которая будет предоставлять функциональность вашей службы внутри сервисной фабрики внешнему миру (вне кластера сервисной фабрики). Подход FabricClient должен использоваться для вызова сервисов внутри кластера сервисных структур, а не снаружи.
Из вашего основного сервиса Asp.net вы будете использовать FabricClient для доступа к размещенному сервису, поэтому в целом ваше базовое приложение asp.net действует как обратный прокси-сервер, чтобы показать функциональность реального сервиса.
Вы не можете получить доступ к сервису в кластере ASF извне, используя ServicePartitionResolver
,
У вас должна быть общедоступная конечная точка в вашем кластере, например служба без сохранения состояния, выступающая в качестве веб-API, например.
Из документов:
Службы, подключающиеся друг к другу внутри кластера, обычно могут напрямую обращаться к конечным точкам других служб, поскольку узлы в кластере находятся в одной локальной сети. Однако в некоторых средах кластер может находиться за балансировщиком нагрузки, который направляет внешний входящий трафик через ограниченный набор портов. В этих случаях службы могут по-прежнему связываться друг с другом и разрешать адреса с помощью службы именования, но необходимо предпринять дополнительные шаги, чтобы позволить внешним клиентам подключаться к службам.
Кластер Service Fabric в Azure находится за балансировщиком нагрузки Azure. Весь внешний трафик к кластеру должен проходить через балансировщик нагрузки. Балансировщик нагрузки будет автоматически перенаправлять входящий трафик на данный порт случайному узлу с открытым тем же портом. Балансировщик нагрузки Azure знает только о портах, открытых на узлах, он не знает о портах, открытых отдельными службами.
Таким образом, если ваше консольное приложение не размещено в кластере в качестве гостевого исполняемого файла, у вас есть еще много работы.