我在上一篇文章的关系中问这个问题。我已经做了一些阅读,但没有看到我的评论迭戈的答案的明确答案。
Service Fabric - How to reserve or protect my hardcoded Port
更新:当我充实这个时,我认为问题真的变成了你可以在一个虚拟机上拥有多个节点。它不是真正的节点类型,而是自己节点。所以问题是:我可以拥有多个IP&VM,托管Service Fabric,然后托管两个不同类型类型的节点吗?
这样我可以解决上面的问题并且有一个用于外部访问的节点类型和用于内部访问的第二个节点类型,而不是硬编码超出群集设置期间使用的范围的端口。
我想我会变得贪婪,并在此处提出跟进问题:
如果我不能拥有多个IP,那么使用范围之外的端口是否有任何问题需要关注。服务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位于同一个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"
},
],
提前致谢, 格雷格
答案 0 :(得分:2)
是和否。
在开发计算机上安装SF Cluster时,它会在同一台计算机上模拟5节点群集,默认情况下,从Azure Azure配置时无法执行此操作。 Service Fabric只不过是在虚拟机上运行的Windows服务。
这里的问题应该是:
如果我在同一台机器上有两种节点类型,它会解决我的端口问题 冲突问题?
答案是否定的,因为它们都会像尝试在本地开发机器中的所有节点上加载绑定到端口80的单个服务一样竞争端口。
正如我在另一个问题上建议的那样,如果不能创建节点类型,则应使用应用程序端口列表之外的硬编码端口。
例如: - ServiceA是一个公开端口80上的操作的API - ServiceB是一个后台工作服务,它使用随机端口(取自应用程序端口范围)
以这种方式设计您的服务,您不会遇到端口问题。
另一个选项是让所有服务使用随机端口并使用反向代理联系它们,检查它here。
答案 1 :(得分:0)
一般而言,您将面向公共服务(即Asp.net核心API)由外部客户端(从sf集群外部访问的任何人)使用。您可以使用此api服务来调用同一群集中托管的其他微服务。您可以将远程处理用作群集中的通信堆栈。这样您就不必担心群集中的端口了。
对于api服务正在侦听的外部客户端,只需要80或其他所需的端口。根据文档,这是首选方式。
答案 2 :(得分:0)
如独立部署准备步骤中所述,您不能在一个VM上拥有两个节点。
“但在生产环境中,Service Fabric仅支持每个物理或虚拟机一个节点。”