C# GRPC服务应如何托管?
我已经用C#创建了一个GRPC服务器,使用的示例是。现在我想弄清楚我应该如何托管此服务器,以便实现以下目标:C# GRPC服务应如何托管?,c#,grpc,C#,Grpc,我已经用C#创建了一个GRPC服务器,使用的示例是。现在我想弄清楚我应该如何托管此服务器,以便实现以下目标: 我应该将此服务器设置为控制台应用程序还是Windows服务。如果我将其设置为windows服务,则更新该服务将非常麻烦(这是一个很大的负面影响),如果我将其设置为控制台应用程序,则更新只需关闭exe即可。但这是错误地关闭同一家公司的代价。还有其他更好的办法吗 有了IIS,这个问题就不会出现了,因为我可以简单地从LB中删除该站点并停止该站点以执行更新,但由于GRPC不会成为IIS的一部分
- 我应该将此服务器设置为控制台应用程序还是Windows服务。如果我将其设置为windows服务,则更新该服务将非常麻烦(这是一个很大的负面影响),如果我将其设置为控制台应用程序,则更新只需关闭exe即可。但这是错误地关闭同一家公司的代价。还有其他更好的办法吗
- 有了IIS,这个问题就不会出现了,因为我可以简单地从LB中删除该站点并停止该站点以执行更新,但由于GRPC不会成为IIS的一部分,所以我不确定如何使其正常工作
欢迎任何关于更好体系结构的参考。目前gRPC不支持与ASP.Net/IIS集成。您需要将服务器托管在控制台中或作为Windows服务 您可能希望这是一个Windows服务,以使服务器在重新启动或崩溃时更容易运行。如果您想轻松地将控制台应用程序转换为Windows服务,我建议您使用优秀的Nuget 更新服务可以像使用控制台应用程序一样完成
- 停止Windows服务<代码>净止点
- 复制更新的程序集
- 启动Windows服务
net Start
- Application是一个执行服务器实际工作的.NET类库(程序集)
- HOLMS.Application.ConsoleRunner是承载HOLMS.Application的C#控制台应用程序。控制台运行程序被(1)开发人员(问题中提到)以及(2)在Docker容器内运行的生产场景使用,其中容器运行时(例如Amazon ECS)实现作业控制/缩放。它遵循“12因素应用程序”指导原则,包括将自身作为单个、独立、无状态进程运行、快速启动/关闭和环境变量配置注入。系统记录到标准输出,标准输出在产品环境中被排空(例如相扑、logstash等)。这就是我们的SaaS多租户解决方案投入生产的方式
- HOLMS.Application.ServiceRunner将HOLMS.Application打包到Windows服务中,用于更传统的内部部署情况,其中客户的IT团队将自己运行服务。此软件包使用Windows注册表进行配置,并依赖Windows服务作业控制进行启动/关闭/重新启动。它会记录到Windows事件日志
- 我的公司(Shortbar)正在gRPC上为名为HOLMS的酒店管理系统构建应用服务器。我们的设置如下:
希望这有帮助 我将再添加一个选项
使用dot net core,您现在可以将其作为Linux守护程序运行。我们可以使用
Microsoft.Extensions.Hosting
Pacake来托管.net core控制台应用程序,方法是使用HostBuilder API开始构建gRPC主机并进行设置
为了运行gRPC服务,我们首先需要在托管服务中启动/停止gRPC.Core.Server
。托管服务基本上是一段代码,主机启动时由主机运行,停止时由主机运行。以下代码实现了一个GrpcHostedService
以覆盖IHostedService
接口:
using System.Threading;
using System.Threading.Tasks;
using Grpc.Core;
using Microsoft.Extensions.Hosting;
namespace Grpc.Host
{
public class GrpcHostedService: IHostedService
{
private Server _server;
public GrpcHostedService(Server server)
{
_server = server;
}
public Task StartAsync(CancellationToken cancellationToken)
{
_server.Start();
return Task.CompletedTask;
}
public async Task StopAsync(CancellationToken cancellationToken) => await _server.ShutdownAsync();
}
}
在程序.cs
中,使用HostBuilder API开始构建grpc主机并进行设置:
public class Program
{
public static async Task Main(string[] args)
{
var hostBuilder = new HostBuilder()
// Add configuration, logging, ...
.ConfigureServices((hostContext, services) =>
{
// Better to use Dependency Injection for GreeterImpl
Server server = new Server
{
Services = {Greeter.BindService(new GreeterImpl())},
Ports = {new ServerPort("localhost", 5000, ServerCredentials.Insecure)}
};
services.AddSingleton<Server>(server);
services.AddSingleton<IHostedService, GrpcHostedService>();
});
await hostBuilder.RunConsoleAsync();
}
}
公共类程序
{
公共静态异步任务主(字符串[]args)
{
var hostBuilder=new hostBuilder()
//添加配置、日志记录。。。
.ConfigureServices((主机上下文,服务)=>
{
//更好地使用GreeterImpl的依赖注入
服务器=新服务器
{
服务={Greeter.BindService(新的GreeterImpl())},
端口={new ServerPort(“localhost”,5000,ServerCredentials.unsecure)}
};
services.AddSingleton(服务器);
services.AddSingleton();
});
等待hostBuilder.RunConsoleAsync();
}
}
通过这样做,通用主机将在我们的托管服务上自动运行StartAsync,然后在服务器
实例上调用StartAsync,基本上启动gRPC服务器
当我们使用Control-C关闭主机时,通用主机将在托管服务上自动调用StopAsync,这将再次在服务器
实例上调用StopAsync,该实例将执行一些清理
对于HostBuilder中的其他配置,您可以看到这一点。考虑到系统的性质,它听起来应该是可靠的,并且具有一定的容错性。这是一个通常不会与控制台应用程序联系在一起的特性。一个巨大的负面影响。另一方面,Windows服务是可恢复的。好消息,好消息!加入aspnetcore 3.0 gRPC后,获得了第一方支持,他们为TopShelf提供了工人服务。您好,谢谢您的回答。你能详细说明一下你对“/”使用GreeterImpl依赖注入更好”的评论意见吗?DI可以减少紧密耦合,最好在一个项目中使用统一的设计模式。可能只有我一个人,但我一辈子都不知道如何将greeter服务注入服务。这是在ConfigureServices中完成的,因此未构建DI容器。。。正确的?