【问题标题】:Stateful microservices default 443 port share issue on the azure service fabric cluster天蓝色服务结构集群上的有状态微服务默认 443 端口共享问题
【发布时间】:2019-05-14 18:58:54
【问题描述】:

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

适当的负载平衡规则和探测启用以使用 443 端口访问,并使用 FQDN url 访问这些服务。

无状态微服务可以正常工作。

但无法使用 FQDN url 访问有状态的微服务。 给出错误,HTTP 错误 503。服务不可用。

如果每个服务使用特定的端口,它工作正常,但我们只需要使用共享的 443 端口访问。

提前感谢您的建议。

【问题讨论】:

  • 您的有状态服务是否配置了分区?您能否提供ApplicationManifest.xml(您可以从中删除所有与业务相关的内容并保留基本配置)。
  • 未提供分区,但 5 个节点集群的 5 个副本大小如下: ... ...

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


【解决方案1】:

您没有说明如何公开这些服务,我假设您是直接从负载均衡器访问它们到服务打开(和共享)的节点端口 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);
}

这将使服务可以通过这样的 url 访问:

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

另一个问题是,

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

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

【讨论】:

  • 感谢 Diego Mendes,启用辅助副本读取解决了问题。
猜你喜欢
  • 1970-01-01
  • 2017-05-01
  • 2014-02-08
  • 1970-01-01
  • 1970-01-01
  • 2015-04-30
  • 1970-01-01
  • 2013-02-08
  • 2016-09-24
相关资源
最近更新 更多