URL Stateful Service с использованием OWIN-слушателя связи

Я использовал следующий пример для настройки прослушивателя связи для моего Stateful Service:

https://github.com/Microsoft/azure-docs/blob/master/articles/service-fabric/service-fabric-reliable-services-communication-webapi.md

Соответствующий фрагмент:

public Task<string> OpenAsync(CancellationToken cancellationToken)
{
    var serviceEndpoint = this.serviceContext.CodePackageActivationContext.GetEndpoint(this.endpointName);
    var protocol = serviceEndpoint.Protocol;
    int port = serviceEndpoint.Port;

    if (this.serviceContext is StatefulServiceContext)
    {
        StatefulServiceContext statefulServiceContext = this.serviceContext as StatefulServiceContext;

        this.listeningAddress = string.Format(
            CultureInfo.InvariantCulture,
            "{0}://+:{1}/{2}{3}/{4}/{5}",
            protocol,
            port,
            string.IsNullOrWhiteSpace(this.appRoot)
                ? string.Empty
                : this.appRoot.TrimEnd('/') + '/',
            statefulServiceContext.PartitionId,
            statefulServiceContext.ReplicaId,
            Guid.NewGuid());
    }
...

Фрагмент сервисного манифеста:

<Endpoints>
  <Endpoint Protocol="http" Name="ServiceEndpoint" Type="Input" Port="8090" />
  <Endpoint Name="ReplicatorEndpoint" />
</Endpoints>

Теперь при развертывании приложения я получаю сервис по URL со всеми видами руководств:

http://localhost:8090/ba794109-bba3-4cdf-8434-d718be264087/131407811483781446/614de30b-14a7-4172-a03d-4e28d23cf28d

Если я попытаюсь получить доступ http://localhost:8090/ на себя получаю ошибку 503

Есть ли способ сопоставить общий URL с основным разделом и репликой? Или это невозможно в Stateful Services? В Stateless вы получите это из коробки.

1 ответ

Решение

Решение "из коробки", на которое вы ссылаетесь, зависит от типа разделения. Доступ к одноэлементному разделу можно получить по его служебному URL:

http://localhost:8090/ApplicationName/ServiceName

Это не работает для службы с именованным или Int64Range-разделением, поскольку URL-адрес не относится к определенному разделу службы. Вот почему вы должны вызвать сервисный URL, который содержит GUID. Идентификаторы GUID относятся к разделу.

Для решения этой проблемы вы можете использовать обратный прокси. Обратный прокси-сервер позволяет вам предоставлять информацию о разделе через URL. Вы можете позвонить в ваш разделенный сервис через URL:

http(s)://<Cluster FQDN | internal IP>:Port/<ServiceInstanceName>/<Suffix path>?PartitionKey=<key>&PartitionKind=<partitionkind>&ListenerName=<listenerName>&TargetReplicaSelector=<targetReplicaSelector>&Timeout=<timeout_in_seconds>

В вашем кластере это будет выглядеть примерно так:

http://clusterIP:19081/ApplicationName/ServiceName/PartitionKey=1&PartitionKind=Int64Range

Обратите внимание, что обратный прокси-сервер (в настоящее время) недоступен в локальном кластере разработки. В целях разработки я бы рекомендовал либо использовать URL с GUID, либо временно изменить разделение на одноэлементную схему.

Другие вопросы по тегам