我们可以使用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中的其他配置可以看这篇博客。