Service Fabric具有配置覆盖的多个服务实例

And*_*ker 20 azure-service-fabric

我们的服务结构应用程序包括一个公开HTTP端点的无状态服务OwinCommunicationListener.

此服务的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>
Run Code Online (Sandbox Code Playgroud)

我们可以通过指定多个Service节点来创建服务的命名实例DefaultServices

<DefaultServices>
  <Service Name="FooInstanceA">
    <StatelessService ServiceTypeName="FooType" InstanceCount="1" />
      <SingletonPartition />
    </StatelessService>
  </Service>
  <Service Name="FooInstanceB">
    <StatelessService ServiceTypeName="FooType" InstanceCount="1" />
      <SingletonPartition />
    </StatelessService>
  </Service>
</DefaultServices>
Run Code Online (Sandbox Code Playgroud)

是否可以通过配置为每个服务实例指定配置覆盖?

我尝试通过使用服务名来确定服务实例在特定端口上侦听以确定哪个端口,以便FooInstanceA侦听端口8090并且FooInstanceB侦听8091.

显然,Service Fabric在部署期间会发挥一些作用,因为当FooInstanceB侦听除ServiceEndpoint配置上指定的端口之外的端口时,该服务无法访问.

第一个原因是端点上没有设置DACL,这是通过运行来解决的;

netsh http add urlacl http://+:8091/ user=everyone listen=yes
Run Code Online (Sandbox Code Playgroud)

这允许服务在Service Fabric Explorer中出现并显示健康,但是当我们使用http:// localhost:8091 /访问时,FooInstanceB正在响应HTTP 503错误

我们如何让服务实例在不同的端口上监听?

我希望这很清楚,谢谢.

Mat*_*man 7

没有很多很好的选择来实现这一目标.以下是一些想法:

  1. 在应用程序中创建多个应用程序实例,而不是同一类型的多个服务.这将允许您使用app参数来配置特定服务的行为.
  2. 在服务类型中创建多个配置包.每个配置包都适用于其中一个服务实例.确定分配服务实例的配置包需要是动态的,可能是基于服务实例的名称?当然,这不是一个很好的选择,因为它将服务定义与将要创建的实例数相结合.
  3. 自定义配置实现.也许让您的服务公开一个允许您在部署后配置它的端点.或者让服务调用一些在激活时提供其配置的其他管理服务.