LoginSignup
15
13

More than 5 years have passed since last update.

Docker を利用して MagicOnion & .Net Core の開発環境を整える

Last updated at Posted at 2018-11-24

はじめに

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);
}

commit:サービス定義の作成

サーバーの作成

サーバープロジェクトの作成

サーバープロジェクトを .NET Core コンソールアプリ で作成します。

NuGet パッケージのインストール (サーバー)

MagicOnion をインストールします。

Install-Package MagicOnion

参照の追加 (サーバー)

サービス定義プロジェクト を参照に追加します。

.csproj
<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();
    }
}

commit:サーバーの作成

クライアントの作成

今回は単純なクライアントではなく、ASP.NET Core を利用した Swagger をクライアントとして利用します。

クライアントプロジェクトの作成

クライアントプロジェクトを ASP.NET Core Web アプリケーション で作成します。

NuGet パッケージのインストール (クライアント)

MagicOnionMagicOnion.HttpGateway をインストールします。

Install-Package MagicOnion
Install-Package MagicOnion.HttpGateway

参照の追加 (クライアント)

サービス定義プロジェクト と サーバープロジェクト を参照に追加します。

.csproj
<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));
    }
}

ここまでで一通り動作するので、マルチスタートアッププロジェクトでサーバーとクライアントを実行し動作確認しておくといいです。

commit:クライアントの作成

コンテナー オーケストレーター サポートの追加

今回は Docker Compose を利用します。
サーバープロジェクト と クライアントプロジェクト で Visual Studio でプロジェクトを右クリックから コンテナー オーケストレーター サポート を追加します。
docker-compose.ymlDockerfile は自動生成されたものから変更する必要はありません。

commit:コンテナー オーケストレーター サポートの追加

host の変更

Docker で動作するように host を変更します。

サーバープロジェクト

Program.cs
var server = new global::Grpc.Core.Server
{
    Services = { service },
    Ports = { new ServerPort("0.0.0.0", 12345, ServerCredentials.Insecure) }
};

クライアントプロジェクト

Startup.cs
app.UseMagicOnionHttpGateway(magicOnion.MethodHandlers, new Channel("magiconionindocker.server", 12345, ChannelCredentials.Insecure));

commit:host の変更

TODO

  • host / port の設定ファイル化
15
13
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
15
13