URL Stateful Service с использованием OWIN-слушателя связи
Я использовал следующий пример для настройки прослушивателя связи для моего Stateful Service
:
Соответствующий фрагмент:
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/
на себя получаю ошибку 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, либо временно изменить разделение на одноэлементную схему.