我使用Link给出的示例在C#中创建了一个GRPC服务器。现在我想弄清楚我应该如何托管这个服务器,以便我实现以下目标:
欢迎任何有关更好架构的参考资料。
答案 0 :(得分:13)
我们可以使用Microsoft.Extensions.Hosting
pacakge来托管.net核心控制台应用程序,方法是使用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();
}
}
在Program.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();
}
}
通过这样做,通用主机将自动在我们的托管服务上运行StartAsync,而托管服务又会在Server
实例上调用StartAsync,实质上是启动gRPC服务器。
当我们使用Control-C关闭主机时,通用主机将自动在我们的托管服务上调用StopAsync,这将再次调用Server
实例上的StopAsync进行清理。
对于HostBuilder中的其他配置,您可以看到此blog。
答案 1 :(得分:3)
目前gRPC不支持与ASP.Net/IIS集成。您需要在控制台或Windows服务中托管服务器。
您可能希望将其作为Windows服务,以便在重新启动或崩溃时更轻松地保持服务器正常运行。如果您想轻松将控制台应用程序转换为Windows服务,我建议您使用优秀的TopShelf Nuget。
可以像控制台应用一样更新服务。
net stop <service-name}>
net start <service-name>
答案 2 :(得分:2)
我的公司(Shortbar)正在为gRPC上的一个名为HOLMS的酒店管理系统构建应用服务器。我们的设置如下:
ConsoleRunner和ServiceRunner每个只有大约200行代码;在大多数情况下,他们只需打包应用程序包,然后调用它。
希望这会有所帮助。
答案 3 :(得分:2)
我要再增加一个选项。
使用dot net core,您现在可以将其作为Linux守护程序运行。