2016-07-31 82 views
5

我试图在一个exe文件(ServiceRuntime.RegisterServiceAsync)中注册多个服务结构服务。这是否支持?如果是这样,我将如何配置它们?服务结构:在ServiceManifest.xml中允许多种服务类型

例如:ServiceManifest.xml支持多个StatelessServiceType元件ServiceTypes内:

<?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 /服务内的多个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中配置多种服务类型)或说明。

+0

你真的想这样做?我在几个月前想过自己做这件事,但后来想起了微服务和单一职责,所以现在每项服务都进入了它自己的可执行程序。 –

回答

8

的第二不顾默认的服务..

,你这是怎么得到多种服务类型共享一台主机的过程。您看到2个进程,因为Service Fabric将这两个服务实例放在不同的节点上,并且每个服务实例都需要一个主机进程。尝试使用InstanceCount =“ - 1”创建每个服务以查看两种类型的共享主机进程。

OK,回到默认服务。这本质上是令人困惑的,因为应用程序清单和服务清单仅用于描述类型信息,而不是实例信息。但是,为了在创建应用程序实例时默认创建服务实例,您必须声明性地指定实例及其参数。所以,你在默认服务有看到你的例子是什么的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 

所以也没有意义的,必须在服务元素不止一个StatelessService元素,因为你定义服务实例以及服务实例的类型和版本。

和公正的后人,这是与云服务的注册代码清单您发布的评论:

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; 
     } 
    } 
} 
}