2016-07-31 20 views
5

'da izin verilen birden çok hizmet türü vardır Birden çok hizmet-hizmetini tek bir exe (ServiceRuntime.RegisterServiceAsync) içinde kaydetmeye çalışıyorum. Bu destekleniyor mu? Öyleyse bunları nasıl yapılandırabilirim?Hizmet Örneği: ServiceManifest.xml

Örn:

<?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> 
... 

ve ApplicationManifest.xml DefaultServices/Hizmet içinde birden StatelessService elemanlarını desteklemez: ServiceManifest.xml ServiceTypes içinde birden StatelessServiceType elemanlarını destekleyen

<?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> 

Dolayısıyla, bu etkili bir yumurtlar 2 işlem ve her işlemin 'aktivasyon bağlamında listelenen varsayılan hizmet türleri vardır (bu yapılandırmayla yalnızca bir tane beklerdim).

Herhangi bir öneri (tek bir exe içinde birden çok hizmet türünün nasıl yapılandırılacağı) veya açıklamaları kabul edilir. Birden Hizmet türlerinin bir konak sürecini paylaşmak için olsun nasıl bir saniye için varsayılan hizmetlerini dikkate almamak

+0

bunu gerçekten yapmak istiyor musunuz? Bunu birkaç ay önce kendim yapmayı düşündüm, ama daha sonra mikro hizmetleri ve tek sorumluluğu hatırladım, böylece her servis artık kendi uygulamasına giriyor. –

cevap

8

..

Evet, bu. Service Fabric, bu iki hizmet örneğini farklı düğümlere yerleştirdiği ve her birinin bir ana bilgisayar işlemine ihtiyacı olduğu için 2 işlemi görüyorsunuz. İki tip paylaşım ana bilgisayarı işlemini görmek için her hizmeti InstanceCount = "- 1" ile oluşturmayı deneyin.

Tamam, varsayılan hizmetlere geri dön. Bu, uygulama bildirimi ve hizmet bildirimi yalnızca tip türünde örnek bilgisini tanımlamak için kullanıldığı için kafa karıştırıcıdır. Ancak, bir uygulama örneği oluşturulduğunda varsayılan olarak hizmet örnekleri oluşturmak için, örnekleri ve bunların parametrelerini belirtmeniz, bildirmeniz gerekir.

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 

hizmeti tanımlayan çünkü Yani, Servis elemanı birden fazla StatelessService elemanı olması mantıklı değil: Peki sizin örnekte orada varsayılan hizmetlerinin altında gördüğünüz XML eşdeğerdir Hizmet örneğinin türü ve sürümü ile birlikte oluşturmak istediğiniz örnekleri.

Ve sadece kuşaklar için

, bu hizmet ile gider kayıt kodu Yayınladığınız manifestosunda geçerli:

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