コンテンツにスキップ

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

Tip

2018年末に記載したドキュメントで内容が陳腐化しています。

はじめに

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

前提条件

  • Visual Studio がインストールされていること
  • Docker がインストールされていること

サービス定義の作成

サービス定義プロジェクトの作成

サービス定義プロジェクトを .NET Standard クラスライブラリ で作成します。

NuGet パッケージのインストール (サービス定義)

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

1
Install-Package MagicOnion

インターフェースの作成

1
2
3
4
public interface IMyFirstService : IService<IMyFirstService>
{
    UnaryResult<int> SumAsync(int x, int y);
}

commit:サービス定義の作成

サーバーの作成

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

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

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

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

1
Install-Package MagicOnion

参照の追加 (サーバー)

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

1
2
3
<ItemGroup>
  <ProjectReference Include="..\MagicOnionInDocker.ServiceDefinition\MagicOnionInDocker.ServiceDefinition.csproj" />
</ItemGroup>

サービスの作成

1
2
3
4
5
6
7
8
9
public class MyFirstService : ServiceBase<IMyFirstService>, IMyFirstService
{
    public async UnaryResult<int> SumAsync(int x, int y)
    {
        Logger.Debug($"Received:{x}, {y}");

        return x + y;
    }
}

サーバーの起動

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
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 をインストールします。

1
2
Install-Package MagicOnion
Install-Package MagicOnion.HttpGateway

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

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

1
2
3
4
<ItemGroup>
  <ProjectReference Include="..\MagicOnionInDocker.Server\MagicOnionInDocker.Server.csproj" />
  <ProjectReference Include="..\MagicOnionInDocker.ServiceDefinition\MagicOnionInDocker.ServiceDefinition.csproj" />
</ItemGroup>

クライアントの起動

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
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 を変更します。

サーバープロジェクト

1
2
3
4
5
var server = new global::Grpc.Core.Server
{
    Services = { service },
    Ports = { new ServerPort("0.0.0.0", 12345, ServerCredentials.Insecure) }
};

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

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

commit:host の変更

TODO

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

最終更新日: 2021-12-10 07:38:31

Tag
Back to top