有状态微服务在azure服务结构集群上默认存在443端口共享问题



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

正确的负载平衡规则和探针能够使用443端口访问,并使用FQDN url访问这些服务。

无州微型服务如预期的那样运作良好。

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

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

提前感谢您的建议。

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

Stateful Services有不同的行为,您需要在注册这些端口时正确理解这些行为:

有状态服务可能在同一主机(进程(上托管多个分区,因此每个副本分区可能希望使用彼此相同的端口。在这种情况下,文档中描述的正确方法是注册一个包含分区和副本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}

另一个问题是,

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

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

最新更新