すべてのサービスファブリック 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環境用に一意に構成された各クラスターをデプロイするパイプラインを簡単に作成できます。
これを可能にするワークフロー/プロセス/プロジェクトの構造は何ですか?それも可能ですか?
うん、それは可能だ-私は以前にこれらの線に沿って何かをしたことがある。これらはすぐに頭に浮かぶ考えです...
各ServiceFabricソリューションには、そのアプリケーションのサービスから公開するインターフェイスのみを含む「パブリック」プロジェクトがあります。このプロジェクトからの出力は、nugetパッケージとしてパッケージ化して、プライベートリポジトリにプッシュすることができます。これを「インターフェース」プロジェクトと呼ぶこともできますが、アプリケーションの内部でインターフェースの一部を検討したい場合は、すべてのインターフェースを公開する必要はありません。これらは、別の非公開プロジェクトで定義できます。
別のアプリケーションによって公開されているサービスを参照する必要がある他のソリューションは、関連するnugetパッケージをプルダウンして、サービスインターフェイスへの参照を取得する必要がありました。
今、これには問題がないわけではありません。
お役に立てば幸いです。
編集:
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();
}
もちろん、このアプローチは、サービスをパーティション化していない場合にのみ機能します...
また、xml\wsdlまたはjson\swaggerのいずれかを使用してhttpベースで、自動生成または手動で作成されたhttpclientプロキシなど、疎結合の少ないプロトコルを使用することもできます。
ナゲットライブラリ、nuspecなどの管理コストは高くなります。