2017-01-10 19 views
0

サービスファブリックを使用して.netで書かれた典型的なWindowsサービスをAzureに移行します。AzureサービスファブリックでWindowsサービスを移行するには

これを実装するには、Windowsサービスの.exeを使用し、アプリケーションパッケージをサービスファブリッククラスタに展開するゲスト実行可能ファイルとして、1つのマイクロサービスを含む1つのサービスファブリックアプリケーションを作成します。

サービスファブリックアプリケーションをクラスタにデプロイした後で、アプリケーションがすべてのノードで自動的に起動するようにするには、アプリケーションが任意の単一ノードで実行されている必要があります。私はWindowsサービスが一度に1つのノードでのみ実行される必要があります。

これを実装するには親切にお手伝いしてください。

+0

サービスのインスタンス数を1に指定できます。これも読んでください:http://stackoverflow.com/a/39786939/5946937 – LoekD

答えて

1

アイデアの背後にあるサービスファブリックは、配備や実行からサービスを管理するためのものです。サービスファブリックインスタンスにサービス/アプリケーションをデプロイしたら、Windowsサービスをインストールする必要はありません。 TopShelfのようなものを使用している場合は、exeを実行すれば、すべてがサービスファブリック内で完全に正常に動作します。

2

ゲスト実行可能ファイルとしてサービスを確実に実行できます。 1つのノードが設定することによって行うことが可能になっていてください、それが唯一のインスタンスがそうのように、マニフェストに1までカウント動作します、あなたが実際にそれを移行することができ、

<Parameters> 
    <Parameter Name="GuestService_InstanceCount" DefaultValue="-1" /> 
    </Parameters> 
    ... 
    <DefaultServices> 
    <Service Name="GuestService"> 
     <StatelessService ServiceTypeName="GuestServiceType" 
         InstanceCount="[GuestService_InstanceCount]"> 
     <SingletonPartition /> 
     </StatelessService> 
    </Service> 
    </DefaultServices> 

するか、SFではないだけで、再ホストに環境が...

あなたのWindowsサービスは.NETで書かれている場合、あなたはサービスファブリックの恩恵を受けるためにwan't [サービスファブリックで信頼性の高いサービスをWindowsサービスからコードを移行する作業はすべきではありません大きくなる。

基本的なサービスの例:

を使用すると、サービスファブリックアプリケーションでステートレスサービスを作成することから始めた場合は(コメントは削除)のように見えるサービスの実装で終わる: 内部シールクラスのMigratedService:StatelessService { 公共MigratedService(StatelessServiceContextコンテキスト) :ベース(コンテキスト) {}

protected override IEnumerable<ServiceInstanceListener> CreateServiceInstanceListeners() 
    { 
     return new ServiceInstanceListener[0]; 
    } 

    protected override async Task RunAsync(CancellationToken cancellationToken) 
    { 
     // TODO: Replace the following sample code with your own logic 
     //  or remove this RunAsync override if it's not needed in your service. 
     long iterations = 0; 
     while (true) 
     { 
      cancellationToken.ThrowIfCancellationRequested(); 
      ServiceEventSource.Current.ServiceMessage(this.Context, "Working-{0}", ++iterations); 
      await Task.Delay(TimeSpan.FromSeconds(1), cancellationToken); 
     } 
    } 

RunAsync方法は、サービスが起動しているとすぐに実行を開始クラスタ内のノード上で実行されます。クラスタが何らかの理由でサービスを停止するか、別のノードに移動することになるまで、クラスタは実行を継続します。

Windowsサービスコードには、開始時に実行されるメソッドが必要です。

protected override void OnStart(string[] args) 
{ 
    System.Timers.Timer timer = new System.Timers.Timer(); 
    timer.Interval = 60000; // 60 seconds 
    timer.Elapsed += new System.Timers.ElapsedEventHandler(this.OnTimer); 
    timer.Start(); 
} 

public void OnTimer(object sender, System.Timers.ElapsedEventArgs args) 
{ 
    ... 
    DoServiceStuff(); 
    Console.WriteLine("Windows Service says hello"); 
} 

OnTimerでそのコードをつかむと、あなたのRunAsync方法でそれを置く(および他のコードが必要):あなたが継続的に何かをやって起動するTimerまたは類似の設定ここでは通常、

protected override async Task RunAsync(CancellationToken cancellationToken) 
{ 
    while (true) 
    { 
     cancellationToken.ThrowIfCancellationRequested(); 
     DoServiceStuff(); 
     ServiceEventSource.Current.ServiceMessage(this.Context, 
      "Reliable Service says hello"); 
     await Task.Delay(TimeSpan.FromSeconds(60), cancellationToken); 
    } 
} 

Task.Delay(...)に注意してください、それはTimerだために、あなたのWindowsサービスが持っていたとして、それが同じ間隔に設定する必要があります。

Windowsサービスにログインしていて、ETWを使用している場合は、そのまま使用できます。たとえば、ログ分析(https://docs.microsoft.com/en-us/azure/log-analytics/log-analytics-service-fabric)を使用するなど、Azureからこれらのログを見る方法を設定するだけです。

シャットダウン時に継続して特定のコードを実行し、起動時にサービスに送信されるパラメータ(データベースへの接続文字列など)がある場合は、移行する必要があるかもしれません。サービスの構成設定に変換する必要がある場合は、開始点としてSO 33928204を参照してください。