如何托管GRPC服务?

Gaw*_*sad 10 c# grpc

我使用Link提供的示例在C#中创建了一个GRPC服务器.现在我想弄清楚我应该如何托管这个服务器,以便我实现以下目标:

  • 我应该将此服务器设置为控制台应用程序还是Windows服务.如果我把它变成一个Windows服务,那么更新服务将是麻烦的(这是一个很大的负面),如果我把它变成一个控制台应用程序,那么更新将只需要关闭exe.但这与错误关闭相同的价格有关.还有其他更好的方法吗?
  • 使用IIS时,这个问题不会出现,因为我可以简单地从LB中删除该站点并停止网站执行更新,但由于GRPC不会成为IIS的一部分,我不确定是什么方法可以实现这一点.

欢迎任何有关更好架构的参考资料.

Fei*_*hou 14

Microsoft.Extensions.Hosting通过使用HostBuilder API开始构建gRPC主机并进行设置,我们可以使用pacakge来托管.net核心控制台应用程序.

为了运行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();
    }
}
Run Code Online (Sandbox Code Playgroud)

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

通过这样做,通用主机将自动在我们的托管服务上运行StartAsync,而托管服务又会在Server实例上调用StartAsync,实质上是启动gRPC服务器.

当我们使用Control-C关闭主机时,通用主机将自动在我们的托管服务上调用StopAsync,这将再次调用实例上的StopAsync,Server这将进行一些清理.

对于HostBuilder中的其他配置,您可以看到此博客.


Kev*_*evM 3

目前 gRPC 不支持与 ASP.Net/IIS 集成。您需要将服务器托管在控制台中或作为 Windows 服务。

您可能希望这是一项 Windows 服务,以便更轻松地在重新启动或崩溃时保持服务器运行。如果您想轻松地将控制台应用程序转换为 Windows 服务,我建议使用优秀的TopShelf Nuget。

更新服务可以像控制台应用程序一样完成。

  • 停止 Windows 服务。net stop <service-name}>
  • 复制更新的程序集。
  • 启动Windows服务net start <service-name>