gpt4 book ai didi

c# - 尝试在 Service Fabric 中容器化和发布 StatelessService 时出现异常

转载 作者:行者123 更新时间:2023-12-02 18:26:38 25 4
gpt4 key购买 nike

我有一个 .NET Core Reliable Service,它几乎是一个模板服务,从 Add > New Service Fabric Service > .NET Core Stateless Service 获得。这意味着它包含 ServiceEventSource , 一个 Stateless1继承自 StatelessService 的类类和 Program.cs . Program.cs的内容是默认的:

private static void Main()
{
try
{
ServiceRuntime.RegisterServiceAsync("Stateless1Type",
context => new Stateless1(context)).GetAwaiter().GetResult(); ServiceEventSource.Current.ServiceTypeRegistered(Process.GetCurrentProcess().Id, typeof(Stateless1).Name);
Thread.Sleep(Timeout.Infinite);
}
catch (Exception e)
{ ServiceEventSource.Current.ServiceHostInitializationFailed(e.ToString());
throw;
}
}


现在,一切正常,我能够正确启动 Service Fabric 应用程序并查看日志等。

根据以下文章,我想要完成的是将此服务容器化: https://docs.microsoft.com/en-us/azure/service-fabric/service-fabric-services-inside-containers .这意味着我添加了 SFBinaryLoader.cs并将以下文件添加到我的 Program.cs :
static Program()
{
SFBinaryLoader.Initialize();
}


但是,通过尝试这样做会出现许多文档 Unresolved 问题和问题。

我正在使用 microsoft/service-fabric-reliableservices-windowsservercore:1803作为构建容器的基础镜像。这是因为 windows server 主机是 1803 版本。运行 CreateDockerPackage.ps1 后我注意到 Microsoft.ServiceFabric.Data.Interfaces.dllSystem.Fabric.*.dll正在被删除。

我认为这就是为什么我们必须在运行时再次提供。这是由 SFBinaryLoader.cs 执行的。通过在 AppDomain.CurrentDomain.AssemblyResolve 上添加事件监听器.这个类应该看 FabricCodePath环境变量(在运行时看起来绑定(bind)到 C:\SFFabricBin\ 目录)并手动添加这些二进制文件。

我想说,为了让程序运行,我还必须删除 *.deps.json来自容器的文件,因为我在运行 dotnet Stateless1.dll 之前就遇到了异常声明在 *.deps.json 上声明的一些丢失的二进制文件找不到文件。

现在,看起来我的容器可以通过结构正常启动,并且程序集正在正确加载。但是,每当尝试通过以下行将服务注册到结构时:
ServiceRuntime.RegisterServiceAsync("Stateless1Type",
context => new Stateless1(context)).GetAwaiter().GetResult();

这会引发以下异常:

An exception occurred registering the service System.Fabric.FabricException: Service Type is already registered. ---> System.Runtime.InteropServices.COMException: Exception from HRESULT: 0x80071BD1 at System.Fabric.Interop.NativeRuntime.IFabricRuntime.EndRegisterStatelessServiceFactory(IFabricAsyncOperationContext context) at System.Fabric.Interop.Utility.<>c__DisplayClass22_0.b__0(IFabricAsyncOperationContext context) at System.Fabric.Interop.AsyncCallOutAdapter21.Finish(IFabricAsyncOperationContext context, Boolean expectedCompletedSynchronously)
--- End of inner exception stack trace ---
at Microsoft.ServiceFabric.Services.Runtime.ServiceRuntime.RegisterServiceAsync(String serviceTypeName, Func
2 serviceFactory, TimeSpan timeout, CancellationToken cancellationToken) at Eventellect.Fabric.TestDocker.Program.Main() in C:\MyLocalPath\StatelessService\Program.cs:line 33



你知道为什么会这样吗?我也觉得很奇怪我的 发表 服务结构对我的本地路径一无所知。

我已经包围了 RegisterServiceAsynctry...catch 内调用阻塞,但是,即使线程成功进入休眠并且我的 docker 容器没有停止,我的 Stateless1.cs 中的操作永远不会上课。这意味着甚至没有调用构造函数。

有什么我可能会丢失的吗?

最佳答案

我遇到了同样的问题,但我实现了以不同于 microsoft 文档中指示的方式将无状态服务容器化。

  • microsoft/service-fabric-reliableservices-windowsservercore:1803 docker 镜像已安装 .Net Core 运行时 2.0。如果您的无状态服务在更高版本上运行,它将无法工作。出于这个原因,我以这种方式构建了我的 docker 镜像 docker image servicefabric-runtime .
  • 我意识到 SFBinaryLoader.cs 类对于在容器内运行 Service Fabric Reliable Services 或 Reliable Actors 不是必需的。我没有将它添加到我的代码中。
  • 我没有执行 CreateDockerPackage.ps1 来构建容器,我只修改了 ServiceManifest.xml 来更改 EntryPoint 部分,如下所示:
  •     <EntryPoint>
    <ContainerHost>
    <ImageName>statelesscontainer:0.1</ImageName>
    </ContainerHost>
    </EntryPoint>
  • 我将构建项目的输出路径更改为 pub/,并根据步骤 1 在无状态服务的根目录中手动添加了 Dockerfile,如下所示:
  •     FROM edalx/servicefabric-runtime:dotnetcore-3.1.2
    WORKDIR /app
    ADD pub .
    CMD ["ApiService.exe"]
  • 除了在 ApplicationManifest.xml 中,您还需要添加 PortBinding 标记。
  •   <ContainerHostPolicies CodePackageRef="Code" Isolation="process" ContainersRetentionCount="2">
    <HealthConfig />
    <PortBinding ContainerPort="0" EndpointRef="ServiceEndpoint" />
    <ImageOverrides>
    <Image Name="edalx.azurecr.io/statelesscontainer:0.1" />
    </ImageOverrides>
    </ContainerHostPolicies>
  • 我正在使用 Visual Studio Community 2019 进行部署,它会自动检测到它是一个容器,并像非容器化服务一样显示向导,它会完成所有工作。

  • 我尝试使用 hyperv 隔离,但对我来说它不起作用。

    你可以在我的 repo https://github.com/edalx/servicefabric-examples/tree/master/servicefabric-container 中找到一个完整的例子。

    关于c# - 尝试在 Service Fabric 中容器化和发布 StatelessService 时出现异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60895445/

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