Service Fabric Networking - 是否可以在一个 VM 上有两个不同节点类型的节点?

Service Fabric Networking - Is it possible to have two nodes of different Node types on one VM?

我问这个问题与我之前的 post 有关。我读过一些书,但没有看到我的评论 Diego 的回答的明确答案。

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

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

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

如果我不能拥有多个 IP,使用范围之外的端口是否有任何需要注意的地方。 Service Fabric 会将该端口号用于其他用途吗?

例如,我不希望 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 在同一个虚拟机上,我可以改为执行类似的操作吗?请注意,两种节点类型的开始和结束端口未拆分以允许硬编码 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"
            },
    ],

提前致谢, 格雷格

是也不是

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

这里的问题应该是:

If I have two node types in the same machine, would it solve my port conflict problem?

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

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

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

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

另一个选项是让所有服务使用随机端口并使用反向代理联系它们,检查它here

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

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

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

"In a production environment however, Service Fabric supports only one node per physical or virtual machine."

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