Link の例を使用して、C#でGRPCサーバーを作成しました。ここで、次のことを実現するために、このサーバーをどのようにホストする必要があるかを理解したいと思います。
より良いアーキテクチャへの参照は大歓迎です。
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 。
もう1つのオプションを追加します。
ドットネットコアを使用すると、これをLinuxデーモンとして実行できるようになります。
現在、gRPCはASP.Net/IISとの統合をサポートしていません。サーバーをコンソールまたはWindowsサービスとしてホストする必要があります。
再起動やクラッシュが発生してもサーバーを実行し続けるのを容易にするために、これをWindowsサービスにする必要があるでしょう。コンソールアプリケーションをWindowsサービスに簡単に変換したい場合は、優れた TopShelf Nugetを使用することをお勧めします。
サービスの更新は、コンソールアプリと同じように実行できます。
net stop <service-name}>
net start <service-name>
私の会社(Shortbar)は、gRPCでHOLMSと呼ばれるホテル管理システムのアプリケーションサーバーを構築しています。設定は次のとおりです。
ConsoleRunnerとServiceRunnerは、それぞれ約200行のコードです。ほとんどの場合、アプリケーションパッケージをラップして呼び出します。
お役に立てれば。