2016-07-31 79 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; 
     } 
    } 
} 
}