はじめに
Docker を利用して MagicOnion & .Net Core の開発環境を整えます。
2018/12/14 に MagicOnion のバージョンが 2.0.3 になりました。
基本的にこの記事の通りで動作しますが、GitHub へのリンクは古いバージョンのものです。
前提条件
- Visual Studio がインストールされていること
- .NET Core 2.2 SDK がインストールされていること (2018/12/15 追記)
- Docker がインストールされていること
サービス定義の作成
サービス定義プロジェクトの作成
サービス定義プロジェクトを .NET Standard クラスライブラリ で作成します。
NuGet パッケージのインストール (サービス定義)
MagicOnion
をインストールします。
Install-Package MagicOnion
インターフェースの作成
public interface IMyFirstService : IService<IMyFirstService>
{
UnaryResult<int> SumAsync(int x, int y);
}
サーバーの作成
サーバープロジェクトの作成
サーバープロジェクトを .NET Core コンソールアプリ で作成します。
NuGet パッケージのインストール (サーバー)
MagicOnion
をインストールします。
Install-Package MagicOnion
参照の追加 (サーバー)
サービス定義プロジェクト を参照に追加します。
<ItemGroup>
<ProjectReference Include="..\MagicOnionInDocker.ServiceDefinition\MagicOnionInDocker.ServiceDefinition.csproj" />
</ItemGroup>
サービスの作成
public class MyFirstService : ServiceBase<IMyFirstService>, IMyFirstService
{
public async UnaryResult<int> SumAsync(int x, int y)
{
Logger.Debug($"Received:{x}, {y}");
return x + y;
}
}
サーバーの起動
class Program
{
static void Main(string[] args)
{
GrpcEnvironment.SetLogger(new Grpc.Core.Logging.ConsoleLogger());
var service = MagicOnionEngine.BuildServerServiceDefinition(isReturnExceptionStackTraceInErrorDetail: true);
var server = new global::Grpc.Core.Server
{
Services = { service },
Ports = { new ServerPort("localhost", 12345, ServerCredentials.Insecure) }
};
// launch gRPC Server.
server.Start();
Console.ReadLine();
}
}
クライアントの作成
今回は単純なクライアントではなく、ASP.NET Core を利用した Swagger をクライアントとして利用します。
クライアントプロジェクトの作成
クライアントプロジェクトを ASP.NET Core Web アプリケーション で作成します。
NuGet パッケージのインストール (クライアント)
MagicOnion
と MagicOnion.HttpGateway
をインストールします。
Install-Package MagicOnion
Install-Package MagicOnion.HttpGateway
参照の追加 (クライアント)
サービス定義プロジェクト と サーバープロジェクト を参照に追加します。
<ItemGroup>
<ProjectReference Include="..\MagicOnionInDocker.Server\MagicOnionInDocker.Server.csproj" />
<ProjectReference Include="..\MagicOnionInDocker.ServiceDefinition\MagicOnionInDocker.ServiceDefinition.csproj" />
</ItemGroup>
クライアントの起動
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
var service = MagicOnionEngine.BuildServerServiceDefinition(new Assembly[] { Assembly.GetAssembly(typeof(MyFirstService)) }, new MagicOnionOptions(true)
{
MagicOnionLogger = new MagicOnionLogToGrpcLogger()
});
// Add MagicOnionServiceDefinition for reference from Startup.
services.Add(new ServiceDescriptor(typeof(MagicOnionServiceDefinition), service));
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
var magicOnion = app.ApplicationServices.GetService<MagicOnionServiceDefinition>();
var xmlPath = Path.Combine(AppContext.BaseDirectory, "MagicOnionInDocker.ServiceDefinition.xml");
app.UseMagicOnionSwagger(magicOnion.MethodHandlers, new MagicOnion.HttpGateway.Swagger.SwaggerOptions("MagicOnionInDocker.Server", "Swagger Integration Test", "/")
{
XmlDocumentPath = xmlPath
});
app.UseMagicOnionHttpGateway(magicOnion.MethodHandlers, new Channel("localhost:12345", ChannelCredentials.Insecure));
}
}
ここまでで一通り動作するので、マルチスタートアッププロジェクトでサーバーとクライアントを実行し動作確認しておくといいです。
コンテナー オーケストレーター サポートの追加
今回は Docker Compose を利用します。
サーバープロジェクト と クライアントプロジェクト で Visual Studio でプロジェクトを右クリックから コンテナー オーケストレーター サポート
を追加します。
docker-compose.yml
と Dockerfile
は自動生成されたものから変更する必要はありません。
commit:コンテナー オーケストレーター サポートの追加
host の変更
Docker で動作するように host を変更します。
サーバープロジェクト
var server = new global::Grpc.Core.Server
{
Services = { service },
Ports = { new ServerPort("0.0.0.0", 12345, ServerCredentials.Insecure) }
};
クライアントプロジェクト
app.UseMagicOnionHttpGateway(magicOnion.MethodHandlers, new Channel("magiconionindocker.server", 12345, ChannelCredentials.Insecure));
TODO
- host / port の設定ファイル化