web-dev-qa-db-ja.com

GRPCサービスはどのようにホストする必要がありますか?

Link の例を使用して、C#でGRPCサーバーを作成しました。ここで、次のことを実現するために、このサーバーをどのようにホストする必要があるかを理解したいと思います。

  • このサーバーをコンソールアプリケーションまたはWindowsサービスにする必要があります。それをWindowsサービスにすると、サービスの更新は面倒になり(これは大きなマイナスです)、コンソールアプリにすると、更新にはexeをシャットダウンするだけで済みます。しかし、それは誤って同じものを閉じるという代償を伴います。他にもっと良い方法はありますか?
  • IISでは、LBからサイトを削除し、Webサイトを停止して更新を実行できるため、この問題は発生しませんが、GRPCはIISの一部ではないため、私はそうではありません。これを機能させる方法は何かを確認してください。

より良いアーキテクチャへの参照は大歓迎です。

12
GawdePrasad

Microsoft.Extensions.Hosting pacakgeを使用して、HostBuilderAPIを使用してgRPCHostの構築とセットアップを開始することにより、.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();
    }
}

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

14
Feiyu Zhou

もう1つのオプションを追加します。

ドットネットコアを使用すると、これをLinuxデーモンとして実行できるようになります。

3
frostymarvelous

現在、gRPCはASP.Net/IISとの統合をサポートしていません。サーバーをコンソールまたはWindowsサービスとしてホストする必要があります。

再起動やクラッシュが発生してもサーバーを実行し続けるのを容易にするために、これをWindowsサービスにする必要があるでしょう。コンソールアプリケーションをWindowsサービスに簡単に変換したい場合は、優れた TopShelf Nugetを使用することをお勧めします。

サービスの更新は、コンソールアプリと同じように実行できます。

  • Windowsサービスを停止します。 net stop <service-name}>
  • 更新されたアセンブリをコピーします。
  • Windowsサービスを開始しますnet start <service-name>
3
KevM

私の会社(Shortbar)は、gRPCでHOLMSと呼ばれるホテル管理システムのアプリケーションサーバーを構築しています。設定は次のとおりです。

  • HOLMS.Applicationは、サーバーの実際の作業を行う.NETクラスライブラリ(アセンブリ)です。
  • HOLMS.Application.ConsoleRunnerは、HOLMS.ApplicationをホストするC#コンソールアプリケーションです。コンソールランナーは、(1)利便性のために開発者(質問で言及)、および(2)コンテナーランタイム(Amazon ECSなど)がジョブ制御/スケーリングを実装するDockerコンテナー内で実行される本番シナリオによって使用されます。これは、単一のスタンドアロンのステートレスプロセスとしての実行、高速の起動/シャットダウン、環境変数の構成インジェクションなど、「12要素アプリ」のガイドラインに従います。システムはstdoutにログを記録しますが、stdoutはprod環境(Sumo、logstashなど)で排出されます。これが、SaaSマルチテナントソリューションが本番環境に移行する方法です。
  • HOLMS.Application.ServiceRunnerは、HOLMS.ApplicationをWindowsサービスにパッケージ化し、顧客のITグループがサービスを自分で実行する従来のオンプレミスの状況に対応します。このパッケージは、構成にWindowsレジストリを使用し、起動/シャットダウン/再起動をWindowsサービスジョブ制御に依存します。 Windowsイベントログに記録します。

ConsoleRunnerとServiceRunnerは、それぞれ約200行のコードです。ほとんどの場合、アプリケーションパッケージをラップして呼び出します。

お役に立てれば。

2
David Albrecht