我们的服务fabric应用程序包括一个通过OwinCommunicationListener
公开HTTP端点的无状态服务。
此服务的ServiceManifest.Xml指定服务端点<Endpoint Name="ServiceEndpoint" Type="Input" Protocol="http" Port="8090" />
然后,可以通过http://localhost:8090/上的浏览器访问无状态服务
我们尝试做的是通过ApplicationManifest在同一service Fabric应用程序的不同端点上实例化此服务的多个实例。
ServiceManifestImport
导入我们的服务包,并允许在应用程序级别覆盖配置。我们不能以这种方式覆盖ServiceEndpoint,只能覆盖Settings.xml中的值
<ServiceManifestImport>
<ServiceManifestRef ServiceManifestName="FooServicePkg" ServiceManifestVersion="1.0.0" >
<ConfigOverrides Name="Config">
<Settings>
<SectionName Name="MySettings">
<Parameter Name="MySetting" Value="SomeValue">
</Settings>
</ConfigOverrides>
</ServiceManifestImport>
我们可以通过在DefaultServices
下指定多个Service
节点来创建服务的命名实例
<DefaultServices>
<Service Name="FooInstanceA">
<StatelessService ServiceTypeName="FooType" InstanceCount="1" />
<SingletonPartition />
</StatelessService>
</Service>
<Service Name="FooInstanceB">
<StatelessService ServiceTypeName="FooType" InstanceCount="1" />
<SingletonPartition />
</StatelessService>
</Service>
</DefaultServices>
是否可以通过configuration指定每个服务实例的配置覆盖?
我试图让服务实例监听特定的端口,方法是使用它们的服务名称来确定是哪个端口,因此FooInstanceA监听端口8090,FooInstanceB监听8091。
显然,服务Fabric在部署过程中发挥了一些魔力,因为当FooInstanceB侦听ServiceEndpoint配置中指定的端口之外的其他端口时,服务是不可访问的。
第一个原因是没有在端点上设置DACL,这可以通过运行以下命令来解决;
netsh http add urlacl http://+:8091/ user=everyone listen=yes
这允许服务在Service Fabric Explorer中显示健康状态,但是当我们使用http://localhost:8091/访问时,FooInstanceB会响应HTTP503错误
如何让服务实例监听不同的端口?
我希望你说得很清楚,谢谢。
发布于 2016-04-30 04:43:23
要做到这一点,没有太多很好的选择。以下是一些想法:
发布于 2017-05-08 15:26:35
您还可以让Service Fabric自动分配端口,然后使用Service Fabric附带的反向代理。
发布于 2017-05-26 06:29:21
我认为在SF集群前面有一个url重写服务是一个非常好的主意。
这可以提供多个端点,并执行url重写、防火墙/黑名单、https等。
另一种方法是将服务打包为lib或Nuget,并使用不同的服务清单创建所需的N个服务。
https://stackoverflow.com/questions/34163124
复制相似问题