gpt4 book ai didi

azure - 如何迁移 Azure Service Fabric 中的 Windows 服务

转载 作者:行者123 更新时间:2023-12-01 07:28:38 25 4
gpt4 key购买 nike

我想使用 Service Fabric 将用 .net 编写的典型 Windows 服务迁移到 Azure。

为了实现这一点,我正在创建一个服务结构应用程序,其中包含一个微服务作为 guest 可执行文件,该应用程序使用 Windows 服务的 .exe 并将应用程序包部署到服务结构集群。

在集群上部署服务结构应用程序后,我希望 Windows 服务应在所有节点上自动安装和启动,但应用程序随时在任何单个节点上运行。我希望 Windows 服务一次只能在一个节点上运行。

请帮助实现这一点。

最佳答案

您当然可以将服务作为 guest 可执行文件运行。确保它只在一个节点上运行可以通过在 list 中将实例计数设置为 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 服务代码中,您应该有一个在启动时运行的方法。这通常是您设置计时器或类似的地方,以开始连续执行某些操作:

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 方法(以及您需要的任何其他代码)中:

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://learn.microsoft.com/en-us/azure/log-analytics/log-analytics-service-fabric )。

您可能需要迁移的其他事项是,您是否在关闭、继续时运行特定代码,以及是否在启动时向服务发送了任何参数(例如数据库的连接字符串)。这些需要转换为服务的配置设置,请查看 SO 33928204作为一个起点。

关于azure - 如何迁移 Azure Service Fabric 中的 Windows 服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41569030/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com