我如何在本地 运行 Service Fabric exe
How do I run a Service Fabric exe locally
我如何通过执行 *.exe
文件 运行 在本地 运行 本地 运行 建立一个建立在服务架构之上的服务?
目前它只是抛出一个异常然后应用程序被终止。
我希望能够在隔离中启动服务,这样我就可以在创建服务包之前对服务进行端到端测试,然后再将其部署为应用程序的一部分。我之前使用 TopShelf 和 Web Jobs 完成过此操作,但这似乎不适用于 Service Fabric,即使它只是构建在控制台应用程序之上。
您需要一个本地 service fabric 集群 来调试 Service Fabric
应用程序,但首先您需要安装 The Azure Service Fabric SDK
,检查这个 article 来帮助你做到这一点。
然后在您的本地集群中部署您的应用程序,这个 Microsoft 的 article 可能会很有用。
您可以将常规控制台应用程序添加到您的解决方案中,引用服务项目。然后,您可以使用服务上下文和状态管理器的模拟来创建服务的实例。
Here's 一个有助于模拟的包。
Here's如何使用。
它的使用不限于单元测试场景。确保为远程服务执行依赖注入(使用 IServiceProxyFactory
/ IActorProxyFactory
)而不是使用 ServiceProxy.Create
.
如果您使用 FabricClient
,您也必须为此进行依赖注入。
当我想 运行 作为独立的 kestrel 在本地进行操作时,我将 Program.cs
替换为以下通用主机(对于 dotnet core 3.1+)
public static class Program
{
public static void Main(string[] args)
{
Host
.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder => webBuilder.UseStartup<Startup>())
.Build()
.Run();
}
}
如果您像我一样正在使用某些实践,例如配置服务结构应用程序以读取应用程序设置等,这可能就足够了。 Startup.cs
相同,因此 IoCC 注册和托管服务相同。
我必须确保我的服务结构服务尽可能标准的唯一一点特别之处如下:
在主服务中(例如:无状态服务)
protected override IEnumerable<ServiceInstanceListener> CreateServiceInstanceListeners()
{
return new ServiceInstanceListener[]
{
new ServiceInstanceListener(serviceContext =>
new KestrelCommunicationListener(serviceContext, "ServiceEndpoint", (url, listener) =>
{
ServiceEventSource.Current.ServiceMessage(serviceContext, $"Starting Kestrel on {url}");
return new WebHostBuilder()
.UseKestrel()
.UseCommonConfiguration() //this is custom
.ConfigureServices(
services => services
.AddSingleton<StatelessServiceContext>(serviceContext))
.UseContentRoot(Directory.GetCurrentDirectory())
.UseStartup<Startup>()
.UseServiceFabricIntegration(listener, ServiceFabricIntegrationOptions.None)
.UseUrls(url)
.Build();
}))
};
}
注意 UseCommonConfiguration()
扩展名是:
public static class WebHostBuilderExtensions
{
public static IWebHostBuilder UseCommonConfiguration(this IWebHostBuilder builder)
{
builder.ConfigureAppConfiguration((hostingContext, config) =>
{
var env = hostingContext.HostingEnvironment;
config
.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
.AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true, reloadOnChange: true)
.AddEnvironmentVariables();
if (env.IsDevelopment())
{
var appAssembly = Assembly.Load(new AssemblyName(env.ApplicationName));
config.AddUserSecrets(appAssembly, optional: true);
}
});
return builder;
}
}
我想找到一种干净的方式来交换 Program.cs
取决于我 运行 Web 应用程序作为启动还是 运行 Service Fabric 应用程序包含服务作为启动。
为了避免设置服务结构的麻烦并直接在本地计算机上调试 Web 应用程序,您可以在我的博客中关注这篇文章 -> Quest Solution
您将能够调试 ASP.net 应用程序,而无需在本地安装 Service fabric 集群。
我如何通过执行 *.exe
文件 运行 在本地 运行 本地 运行 建立一个建立在服务架构之上的服务?
目前它只是抛出一个异常然后应用程序被终止。
我希望能够在隔离中启动服务,这样我就可以在创建服务包之前对服务进行端到端测试,然后再将其部署为应用程序的一部分。我之前使用 TopShelf 和 Web Jobs 完成过此操作,但这似乎不适用于 Service Fabric,即使它只是构建在控制台应用程序之上。
您需要一个本地 service fabric 集群 来调试 Service Fabric
应用程序,但首先您需要安装 The Azure Service Fabric SDK
,检查这个 article 来帮助你做到这一点。
然后在您的本地集群中部署您的应用程序,这个 Microsoft 的 article 可能会很有用。
您可以将常规控制台应用程序添加到您的解决方案中,引用服务项目。然后,您可以使用服务上下文和状态管理器的模拟来创建服务的实例。
Here's 一个有助于模拟的包。
Here's如何使用。
它的使用不限于单元测试场景。确保为远程服务执行依赖注入(使用 IServiceProxyFactory
/ IActorProxyFactory
)而不是使用 ServiceProxy.Create
.
如果您使用 FabricClient
,您也必须为此进行依赖注入。
当我想 运行 作为独立的 kestrel 在本地进行操作时,我将 Program.cs
替换为以下通用主机(对于 dotnet core 3.1+)
public static class Program
{
public static void Main(string[] args)
{
Host
.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder => webBuilder.UseStartup<Startup>())
.Build()
.Run();
}
}
如果您像我一样正在使用某些实践,例如配置服务结构应用程序以读取应用程序设置等,这可能就足够了。 Startup.cs
相同,因此 IoCC 注册和托管服务相同。
我必须确保我的服务结构服务尽可能标准的唯一一点特别之处如下:
在主服务中(例如:无状态服务)
protected override IEnumerable<ServiceInstanceListener> CreateServiceInstanceListeners()
{
return new ServiceInstanceListener[]
{
new ServiceInstanceListener(serviceContext =>
new KestrelCommunicationListener(serviceContext, "ServiceEndpoint", (url, listener) =>
{
ServiceEventSource.Current.ServiceMessage(serviceContext, $"Starting Kestrel on {url}");
return new WebHostBuilder()
.UseKestrel()
.UseCommonConfiguration() //this is custom
.ConfigureServices(
services => services
.AddSingleton<StatelessServiceContext>(serviceContext))
.UseContentRoot(Directory.GetCurrentDirectory())
.UseStartup<Startup>()
.UseServiceFabricIntegration(listener, ServiceFabricIntegrationOptions.None)
.UseUrls(url)
.Build();
}))
};
}
注意 UseCommonConfiguration()
扩展名是:
public static class WebHostBuilderExtensions
{
public static IWebHostBuilder UseCommonConfiguration(this IWebHostBuilder builder)
{
builder.ConfigureAppConfiguration((hostingContext, config) =>
{
var env = hostingContext.HostingEnvironment;
config
.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
.AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true, reloadOnChange: true)
.AddEnvironmentVariables();
if (env.IsDevelopment())
{
var appAssembly = Assembly.Load(new AssemblyName(env.ApplicationName));
config.AddUserSecrets(appAssembly, optional: true);
}
});
return builder;
}
}
我想找到一种干净的方式来交换 Program.cs
取决于我 运行 Web 应用程序作为启动还是 运行 Service Fabric 应用程序包含服务作为启动。
为了避免设置服务结构的麻烦并直接在本地计算机上调试 Web 应用程序,您可以在我的博客中关注这篇文章 -> Quest Solution
您将能够调试 ASP.net 应用程序,而无需在本地安装 Service fabric 集群。