【问题标题】:Service Fabric: are multiple service types allowed in ServiceManifest.xmlService Fabric:ServiceManifest.xml 中允许的多种服务类型
【发布时间】:2016-08-03 09:21:09
【问题描述】:

我正在尝试在单个 exe (ServiceRuntime.RegisterServiceAsync) 中注册多个 service-fabric 服务。这支持吗?如果是这样,我将如何配置它们?

例如:ServiceManifest.xml 支持 ServiceTypes 中的多个 StatelessServiceType 元素:

<?xml version="1.0" encoding="utf-8"?>
<ServiceManifest Name="EchoGatewayPkg"
                 Version="1.0.0"
                 xmlns="http://schemas.microsoft.com/2011/01/fabric"
                 xmlns:xsd="http://www.w3.org/2001/XMLSchema"
                 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <ServiceTypes>
    <StatelessServiceType ServiceTypeName="Service1Type" >
    </StatelessServiceType>

    <StatelessServiceType ServiceTypeName="Service2Type" >
    </StatelessServiceType>
  </ServiceTypes>
...

ApplicationManifest.xml 不支持 DefaultServices/Service 中的多个 StatelessService 元素:

<?xml version="1.0" encoding="utf-8"?>
<ApplicationManifest xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" ApplicationTypeName="EchoServiceType" ApplicationTypeVersion="1.0.0" xmlns="http://schemas.microsoft.com/2011/01/fabric">
  <Parameters>
    <Parameter Name="Service1_InstanceCount" DefaultValue="1" />
    <Parameter Name="Service2_InstanceCount" DefaultValue="1" />
  </Parameters>
  <ServiceManifestImport>
    <ServiceManifestRef ServiceManifestName="MyServicePkg" ServiceManifestVersion="1.0.0" />
    <ConfigOverrides />
  </ServiceManifestImport>
  <DefaultServices>
    <Service Name="MyService1">
      <StatelessService ServiceTypeName="Service1Type" InstanceCount="[Service1_InstanceCount]">
        <SingletonPartition />
      </StatelessService>
    </Service>
    <Service Name="MyService2">
      <StatelessService ServiceTypeName="Service2Type" InstanceCount="[Service2_InstanceCount]">
        <SingletonPartition />
      </StatelessService>
    </Service>
  </DefaultServices>
</ApplicationManifest>

因此,这有效地产生了 2 个进程,并且每个进程的激活上下文都列出了两种默认服务类型(我原本希望只有一种具有这种配置)。

欢迎任何建议(关于如何在单个 exe 中配置多种服务类型)或澄清。

【问题讨论】:

  • 您真的要这样做吗?几个月前我曾想过自己这样做,但后来想起了微服务和单一职责,所以现在每个服务都进入了它自己的可执行文件。

标签: azure-service-fabric


【解决方案1】:

暂时忽略默认服务..

是的,这就是让多种服务类型共享一个主机进程的方式。您会看到 2 个进程,因为 Service Fabric 将这两个服务实例放置在不同的节点上,并且每个都需要一个主机进程。尝试使用 InstanceCount="-1" 创建每个服务,以查看两种类型共享主机进程。

好的,回到默认服务。这本质上是令人困惑的,因为应用程序清单和服务清单仅用于描述 type 信息,而不是 instance 信息。但是为了在创建应用程序实例时默认创建服务实例,您必须以声明方式指定实例及其参数。因此,您在示例中的默认服务下看到的是 XML 等价物:

PS > New-ServiceFabricService -Stateless -PartitionSchemeSingleton -InstanceCount 1 -ApplicationName fabric:/EchoService -ServiceName fabric:/EchoService/MyService1 -ServiceTypeName Service1Type

PS > New-ServiceFabricService -Stateless -PartitionSchemeSingleton -InstanceCount 1 -ApplicationName fabric:/EchoService -ServiceName fabric:/EchoService/MyService2 -ServiceTypeName Service2Type

因此,在 Service 元素中包含多个 StatelessService 元素是没有意义的,因为您正在定义要创建的服务 instances,以及服务的类型和版本。服务实例。

为了后代,这是您发布的服务清单随附的注册码:

internal static class Program
{
    private static void Main()
    {
        try
        {
            ServiceRuntime.RegisterServiceAsync("Service1Type",
                context => new Stateless1(context)).GetAwaiter().GetResult();

            ServiceRuntime.RegisterServiceAsync("Service2Type",
                context => new Stateless2(context)).GetAwaiter().GetResult();

            Thread.Sleep(Timeout.Infinite);
        }
        catch (Exception e)
        {
            ServiceEventSource.Current.ServiceHostInitializationFailed(e.ToString());
            throw;
        }
    }
}
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-03-19
    • 2015-02-15
    • 1970-01-01
    • 2021-10-04
    • 1970-01-01
    • 2010-11-24
    • 2010-09-17
    相关资源
    最近更新 更多