0

我问这个与我之前的帖子有关。我已经阅读了一些内容,但没有看到对我的评论 Diego 的回答的明确答案。

Service Fabric - 如何保留或保护我的硬编码端口

更新:当我充实这一点时,我认为问题真的变成了你能否在一个虚拟机上拥有多个节点。它不是关于节点类型,而是节点本身。 所以问题是:我可以拥有一个多 IP 的 VM 来托管 Service Fabric,然后在其上托管两个不同类型的节点吗?

这样我就可以解决上述问题,并有一个用于外部访问的节点类型和一个用于内部访问的第二个节点类型,而不是硬编码一个超出集群设置期间使用范围的端口。

我想我会变得贪婪并在这里提出后续问题:

如果我不能拥有多个 IP,那么使用范围之外的端口有什么需要担心的。服务结构会将该端口号用于其他任何事情吗?

例如,我不希望 Service Fabric 仅仅因为端口超出范围而认为微服务需要像所有其他微服务一样进行管理?

例如,在我的 onPrem ClusterConfig.Windows.MultiMachine.json 文件中,我当前拥有:

"nodes": [
    {
        "nodeName": "vm0",
        "iPAddress": "Server1.DomainName.net",
        "nodeTypeRef": "NodeType0",
        "faultDomain": "fd:/dc1/r0",
        "upgradeDomain": "UD0"
    },
    {
        "nodeName": "vm1",
        "iPAddress": "Server2.DomainName.net",
        "nodeTypeRef": "NodeType0",
        "faultDomain": "fd:/dc1/r1",
        "upgradeDomain": "UD1"
    },
    {
        "nodeName": "vm2",
        "iPAddress": "Server3.DomainName.net",
        "nodeTypeRef": "NodeType0",
        "faultDomain": "fd:/dc1/r2",
        "upgradeDomain": "UD2"
    }
]
"nodeTypes": [
        {
            "name": "NodeType0",
            "clientConnectionEndpointPort": "19000",
            "clusterConnectionEndpointPort": "19001",
            "leaseDriverEndpointPort": "19002",
            "serviceConnectionEndpointPort": "19003",
            "httpGatewayEndpointPort": "19080",
            "reverseProxyEndpointPort": "19081",
            "applicationPorts": {
                "startPort": "20001",
                "endPort": "20100"
            },
            "isPrimary": true
        }
    ],

我可以在 IP 1 和 4、2 和 5 以及 3 和 6 在同一个 VM 上的情况下做这样的事情吗?请注意,这两种节点类型的起始端口和结束端口未拆分以允许硬编码的 WebAPI 端点。

"nodes": [
    {
        "nodeName": "vm0",
        "iPAddress": "IPAddress_1",
        "nodeTypeRef": "NodeType0",
        "faultDomain": "fd:/dc1/r0",
        "upgradeDomain": "UD0"
    },
    {
        "nodeName": "vm1",
        "iPAddress": "IPAddress_2",
        "nodeTypeRef": "NodeType0",
        "faultDomain": "fd:/dc1/r1",
        "upgradeDomain": "UD1"
    },
    {
        "nodeName": "vm2",
        "iPAddress": "IPAddress_3",
        "nodeTypeRef": "NodeType0",
        "faultDomain": "fd:/dc1/r2",
        "upgradeDomain": "UD2"
    }
]


"nodes": [
    {
        "nodeName": "vm3",
        "iPAddress": "IPAddress_4",
        "nodeTypeRef": "NodeType1",
        "faultDomain": "fd:/dc1/r0",
        "upgradeDomain": "UD0"
    },
    {
        "nodeName": "vm4",
        "iPAddress": "IPAddress_5",
        "nodeTypeRef": "NodeType1",
        "faultDomain": "fd:/dc1/r1",
        "upgradeDomain": "UD1"
    },
    {
        "nodeName": "vm5",
        "iPAddress": "IPAddress_6",
        "nodeTypeRef": "NodeType1",
        "faultDomain": "fd:/dc1/r2",
        "upgradeDomain": "UD2"
    }
] 
"nodeTypes": [
        {
            "name": "NodeType0",
            "clientConnectionEndpointPort": "19000",
            "clusterConnectionEndpointPort": "19001",
            "leaseDriverEndpointPort": "19002",
            "serviceConnectionEndpointPort": "19003",
            "httpGatewayEndpointPort": "19080",
            "reverseProxyEndpointPort": "19081",
            "applicationPorts": {
                "startPort": "20001",
                "endPort": "20500"
            },
            "isPrimary": true
        }
"name": "NodeType1",
            "clientConnectionEndpointPort": "19000",
            "clusterConnectionEndpointPort": "19001",
            "leaseDriverEndpointPort": "19002",
            "serviceConnectionEndpointPort": "19003",
            "httpGatewayEndpointPort": "19080",
            "reverseProxyEndpointPort": "19081",
            "applicationPorts": {
                "startPort": "20501",
                "endPort": "21000"
            },
    ],

在此先感谢,格雷格

4

3 回答 3

2

是和否。

在开发机器上安装 SF Cluster 时,它会在同一台机器上模拟一个 5 节点集群,默认情况下,当您从 azure 门户提供时,您不能这样做。Service Fabric 只不过是在虚拟机之上运行的 Windows 服务。

这里的问题应该是:

如果我在同一台机器上有两种节点类型,它会解决我的端口冲突问题吗?

答案是否定的,因为它们都将竞争端口,就像您尝试在本地开发机器的所有节点上加载绑定到端口 80 的单个服务时一样。

正如我在另一个问题上所建议的那样,如果创建节点类型不是一个选项,您应该使用应用程序端口列表之外的硬编码端口。

例如: - ServiceA 是在端口 80 上公开操作的 API - ServiceB 是使用随机端口的后台工作服务(取自应用程序端口范围)

以这种方式设计您的服务,您不会遇到端口问题。

另一种选择是让所有服务使用随机端口并使用反向代理来联系它们,请在此处查看

于 2018-02-21T00:53:29.863 回答
0

通常,您保留一个面向公众的服务(即 Asp.net 核心 api)以供外部客户端(从 sf 集群外部访问的任何人)使用。您使用此 api 服务来调用托管在同一集群中的其他微服务。您可以将远程处理用作集群内的通信堆栈。这样您就不必担心集群中的端口。

对于 api 服务正在侦听的外部客户端,唯一需要的端口是 80 或其他端口。根据文档,这也是首选方式。

于 2018-02-21T01:08:08.190 回答
0

如独立部署准备步骤中所述,您不能在一个 VM 上拥有两个节点。

“然而,在生产环境中,Service Fabric 仅支持每个物理机或虚拟机一个节点。”

https://docs.microsoft.com/en-us/azure/service-fabric/service-fabric-cluster-standalone-deployment-preparation#determine-the-initial-cluster-size

于 2018-02-21T18:10:12.693 回答