有状态微服务在Azure Service Fabric群集上的默认443端口共享问题

时间:2018-12-13 14:18:33

标签: microservices azure-service-fabric service-fabric-stateful

我们在集群中部署了多个微服务,详细信息如下: 总共有7个微服务部署到了集群,其中3个是无状态微服务,另外4个是有状态微服务。 实现了http.sys以公开安全的终结点,并希望使用默认端口443公开所有这些服务终结点。 为了区分服务,在URL中添加了别名。

已启用正确的负载平衡规则和探针,以使用443端口进行访问,并使用FQDN网址访问这些服务。

无状态微服务按预期运行正常。

但是无法使用FQDN URL访问有状态微服务。 错误信息为HTTP错误503。服务不可用。

如果为每个服务使用特定的端口,则可以正常工作,但是我们只需要使用共享的443端口进行访问。

预先感谢您的建议。

1 个答案:

答案 0 :(得分:0)

您没有弄清楚如何公开这些服务,我假设您是直接从负载均衡器访问服务打开(和共享)的节点端口443,而不是使用所述的反向代理方法here

有状态服务具有不同的行为,您在注册这些端口时需要正确理解:

有状态服务可能在同一主机(进程)上托管多个分区,因此每个副本分区可能希望使用彼此相同的端口。 在这种情况下,docs中描述的正确方法是注册一个包含分区和副本ID的前缀,如果您遵循文档,则可能已经注册了以下有状态服务:

private ICommunicationListener CreateInternalListener(ServiceContext context)
{
 EndpointResourceDescription internalEndpoint = context.CodePackageActivationContext.GetEndpoint("ProcessingServiceEndpoint");
 string uriPrefix = String.Format(
        "{0}://+:{1}/{2}/{3}-{4}/",
        internalEndpoint.Protocol,
        internalEndpoint.Port,
        context.PartitionId,
        context.ReplicaOrInstanceId,
        Guid.NewGuid());

 string nodeIP = FabricRuntime.GetNodeContext().IPAddressOrFQDN;

 string uriPublished = uriPrefix.Replace("+", nodeIP);
 return new HttpCommunicationListener(uriPrefix, uriPublished, this.ProcessInternalRequest);
}

这样可以通过以下网址访问该服务:

{scheme}://{nodeIp}:{port}/{partitionid}/{replicaid}-{guid}

另一个问题是

  • 状态服务可能并非在负载均衡器后面的所有节点上都可用;
  • 如果有,并且已分区,则每个分区都不会在所有节点上可用;
  • 如果分区位于所有节点上,则还必须启用辅助副本读取,否则端点将不会打开。

由于这些原因,您应该避免直接公开有状态服务,并将其置于代理之后,如第一个链接中所述。