Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# GRPC服务应如何托管?_C#_Grpc - Fatal编程技术网

C# GRPC服务应如何托管?

C# GRPC服务应如何托管?,c#,grpc,C#,Grpc,我已经用C#创建了一个GRPC服务器,使用的示例是。现在我想弄清楚我应该如何托管此服务器,以便实现以下目标: 我应该将此服务器设置为控制台应用程序还是Windows服务。如果我将其设置为windows服务,则更新该服务将非常麻烦(这是一个很大的负面影响),如果我将其设置为控制台应用程序,则更新只需关闭exe即可。但这是错误地关闭同一家公司的代价。还有其他更好的办法吗 有了IIS,这个问题就不会出现了,因为我可以简单地从LB中删除该站点并停止该站点以执行更新,但由于GRPC不会成为IIS的一部分

我已经用C#创建了一个GRPC服务器,使用的示例是。现在我想弄清楚我应该如何托管此服务器,以便实现以下目标:

  • 我应该将此服务器设置为控制台应用程序还是Windows服务。如果我将其设置为windows服务,则更新该服务将非常麻烦(这是一个很大的负面影响),如果我将其设置为控制台应用程序,则更新只需关闭exe即可。但这是错误地关闭同一家公司的代价。还有其他更好的办法吗
  • 有了IIS,这个问题就不会出现了,因为我可以简单地从LB中删除该站点并停止该站点以执行更新,但由于GRPC不会成为IIS的一部分,所以我不确定如何使其正常工作

欢迎任何关于更好体系结构的参考。

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

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

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

  • 停止Windows服务<代码>净止点
  • 复制更新的程序集
  • 启动Windows服务
    net Start
    • 我的公司(Shortbar)正在gRPC上为名为HOLMS的酒店管理系统构建应用服务器。我们的设置如下:

      • 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事件日志
      ConsoleRunner和ServiceRunner各自只有大约200行代码;在大多数情况下,它们只是包装应用程序包,并调用到其中


      希望这有帮助

      我将再添加一个选项


      使用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容器。。。正确的?