使用OWIN通信侦听器的有状态服务的URL

时间:2017-06-01 09:08:52

标签: c# routes owin azure-service-fabric service-fabric-stateful

我使用以下示例为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>

现在,在部署我的应用程序时,我使用各种guid获取URL服务:

  

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

如果我尝试自行访问http://localhost:8090/,则会收到错误 503

是否可以将常规URL映射到主分区和副本?或者在有状态服务中是不可能的?在Stateless中,您将获得开箱即用的功能。

1 个答案:

答案 0 :(得分:1)

您所指的“开箱即用”解决方案取决于分区类型。单个分区可以通过其服务URL访问:

http://localhost:8090/ApplicationName/ServiceName

这对于具有Named或Int64Range分区的服务不起作用,因为URL不引用服务的特定分区。这就是你必须调用包含GUID的服务URL的原因。 GUID指的是分区。

为了解决这个问题,您可以使用reverse proxy。反向代理允许您通过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

请注意,本地开发群集上不提供反向代理(当前)。出于开发目的,我建议使用带有GUID的URL或临时将分区更改为单例方案。