web-dev-qa-db-ja.com

Service Fabricアプリケーションをバージョン管理して分離する方法は?

すべてのサービスファブリック examples は、単一ソリューションのサービスファブリックの例を示しています。これは、サービス間の完全な依存関係の分離が必要なマイクロサービスの哲学にcounter行くようです。このパターンを手動で実行することもできますが、より一般的な方法は、各サービスを独自のリポジトリおよびソリューション/プロジェクトにすることで強制することです。

サービスファブリックサービスをどのように管理および展開し、複数のソリューション(複数のGitリポジトリ内)を使用してサービス契約(ServiceInferfaces)を実施しますか?

例えば。

Service Fabric Solution
      App1 - Customers
         - Service1 [Carts] From Other Solution
         - Service2 [LocationInfo]From Other Solution
         - Service3 [REST WebAPI for Admin] From Other Solution
      App2 - Products
         - Service4 [Status]From Other Solution
         - Service5 [Firmware]From Other Solution
         - Service6 [Event Stream] From Other Solution

External Solution
   - Service1
External Solution
   - Service2
External Solution
   - Service3

External Solution
   - Service4
External Solution
   - Service5
External Solution
   - Service6

1)開発者として、現在のすべてのバージョンのアプリ/サービスをチェックアウトしてビルドしたいと思います。すべてのマニフェストを管理するServiceFabricプロジェクトを起動し、それをローカルの開発クラスターにデプロイしたいと思います。ソリューション間で同じサービスインターフェイスを適用したいと思います。アプリケーションはサービスの外部にあるため、これをどのように行うかわかりません。

2)DevOpsチームとして、アプリのプルダウン、ビルド、Azureへのデプロイを自動化したいです。

個別のソリューションを介して分離を「実施」するにはどうすればよいですか。ただし、それらをまとめてクラスターにデプロイするのは簡単です。また、DEV、QA、およびPROD環境用に一意に構成された各クラスターをデプロイするパイプラインを簡単に作成できます。

これを可能にするワークフロー/プロセス/プロジェクトの構造は何ですか?それも可能ですか?

27
FlavorScape

うん、それは可能だ-私は以前にこれらの線に沿って何かをしたことがある。これらはすぐに頭に浮かぶ考えです...

各ServiceFabricソリューションには、そのアプリケーションのサービスから公開するインターフェイスのみを含む「パブリック」プロジェクトがあります。このプロジェクトからの出力は、nugetパッケージとしてパッケージ化して、プライベートリポジトリにプッシュすることができます。これを「インターフェース」プロジェクトと呼ぶこともできますが、アプリケーションの内部でインターフェースの一部を検討したい場合は、すべてのインターフェースを公開する必要はありません。これらは、別の非公開プロジェクトで定義できます。

別のアプリケーションによって公開されているサービスを参照する必要がある他のソリューションは、関連するnugetパッケージをプルダウンして、サービスインターフェイスへの参照を取得する必要がありました。

今、これには問題がないわけではありません。

  • 消費側のアプリケーションは、サービスのプロキシを構築するために、サービスのアドレスを知る必要があります。それらをnugetパッケージのどこかで定義された定数として公開するか、完全なDIルートをたどり、どこでもDIコンテナーに結合することを気にしない場合(またはそれを抽象化しようとする場合)、公開することができます。依存するアプリケーションに代わってサービスプロキシの作成を行うラムダとしてサービスインターフェイスを登録できるnugetパッケージのモジュール。
  • あなたははるかに契約違反に対してより脆弱です。 youがアプリケーション/サービスのデプロイメントの粒度と調整を担当するようになったため、メソッドのシグネチャの更新には十分注意する必要があります。
  • 細かくなりすぎる可能性があります。おっしゃるように、Service Fabricツールは、1つのソリューションに複数のサービスを含めるようにガイドします。上記のアプローチを使用しても、サービスをある程度論理的にグループ化しようとします。つまり、アプリケーションとサービスの間で1対1のマッピングを行わないでください。これは、価値があるよりも間違いなく苦痛になります。

お役に立てば幸いです。

編集:

DIモジュールにサービスインターフェースを登録する例(Autofacスタイル)...

これは、パブリックnugetパッケージから公開するDIモジュールになります。

using System;
using Autofac;
using Microsoft.ServiceFabric.Services.Remoting.Client;

public class MyAppModule : Module
{
    protected override void Load(ContainerBuilder builder)
    {
        builder.Register(component => ServiceProxy.Create<IMyService>(new Uri("fabric:/App/MyService"))).As<IMyService>();
        // Other services...
    }
}

そして、消費するアプリケーションのProgram.csには、次のようなものを含めます。

public static void Main()
{
    try
    {
        var container = ConfigureServiceContainer();

        ServiceRuntime.RegisterServiceAsync(
            "MyConsumingServiceType",
            context => container.Resolve<MyConsumingService>(new TypedParameter(typeof(StatefulServiceContext), context))).GetAwaiter().GetResult();
        ServiceEventSource.Current.ServiceTypeRegistered(Process.GetCurrentProcess().Id, typeof(MyConsumingService).Name);

        Thread.Sleep(Timeout.Infinite);
    }
    catch (Exception e)
    {
        ServiceEventSource.Current.ServiceHostInitializationFailed(e.ToString());
        throw;
    }
}

private static IContainer ConfigureServiceContainer()
{
    var containerBuilder = new ContainerBuilder();

    // Other registrations...

    containerBuilder.RegisterModule<MyAppModule>();

    return containerBuilder.Build();
}

もちろん、このアプローチは、サービスをパーティション化していない場合にのみ機能します...

15
Mike Goatly

また、xml\wsdlまたはjson\swaggerのいずれかを使用してhttpベースで、自動生成または手動で作成されたhttpclientプロキシなど、疎結合の少ないプロトコルを使用することもできます。

ナゲットライブラリ、nuspecなどの管理コストは高くなります。

1
user1496062