簡體   English   中英

如何在Azure Service Fabric中遷移Windows Service

[英]How To migrate windows service in Azure service fabric

我想使用Service Fabric將以.net編寫的典型Windows服務遷移到Azure。

為實現此目的,我正在創建一個服務結構應用程序,其中包含一個作為來賓可執行文件的微服務,該服務使用Windows服務的.exe,並將應用程序包部署到服務結構群集。

在群集上部署Service Fabric應用程序后,我希望Windows Service應該在所有節點上自動安裝並啟動,但是應用程序隨時都可以在任何單個節點上運行。 我希望Windows服務一次只能在一個節點上運行。

請幫助實現這一目標。

您當然可以將其服務作為來賓可執行文件運行。 通過將清單中的實例計數設置為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編寫的,而您又不想從Service Fabric中受益,那么將代碼從Windows服務遷移到Service Fabric中的可靠服務的工作就不會太大。

基本服務示例:

如果首先在Service Fabric應用程序中創建無狀態服務,那么最終將獲得如下服務實現(已刪除注釋):

 internal sealed class MigratedService : StatelessService { public MigratedService(StatelessServiceContext context) : base(context) { } 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服務代碼中,您應該有一個在啟動時運行的方法。 通常,您可以在其中設置一個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);
    }
}

現在,在OnTimer獲取該代碼並將其放入您的RunAsync方法(以及您需要的任何其他代碼)中:

 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(...) ,應將其設置為與Windows服務的Timer間隔相同。

現在,如果您已經登錄Windows服務並且使用了ETW,那么應該可以立即使用。 您只需要設置某種方式立即從Azure查看這些日志,例如使用Log Analytics( https://docs.microsoft.com/en-us/azure/log-analytics/log-analytics-service-fabric )。

您可能還需要遷移的其他事情是,如果在關閉,繼續時運行特定的代碼,並且在啟動時有任何參數發送給服務(例如,數據庫的連接字符串)。 那些需要轉換為服務的配置設置,請參閱SO 33928204作為起點。

服務結構背后的想法是,它可以從部署和運行中管理您的服務。 將服務/應用程序部署到服務結構實例后,就像運行Windows服務(kinda)一樣,因此您無需安裝Windows服務。 如果您使用的是TopShelf之類的工具,則只需運行exe,一切就可以在服務結構中正常運行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM