Service Fabricラーニング-helloworldから(ステータスレスサービス)

8509 ワード

もともとサーバープログラムをしていたのは、xxクラウドに配備されていたが、クラウドが何なのか理解していなかった.サーバー(仮想マシン)のレンタル業者ではないか.はい、実はこれはIaaSですが、これから学ぶServiceFabric(以下SF)はPaaSです. 
まずSFはOrleansと似ていて、すべてactorモデルに基づいて、それからプログラミング方式も似ていて、大体公開インタフェースを定義して、それからバックエンドサービスはインタフェースを実現して、フロントエンドはインタフェースを呼び出します.
ここでいう前後端は実に厳密ではないが、実はサーバー上の前後端を指し、フロントエンドはサービスのフロントエンドがサーバー対応のクライアントではない.web(asp.net)や他のステータスのないゲートウェイのようなサービスが前にクライアントメッセージを受信してサービスポートを呼び出すと、それはサービスの利用者であるここの意味のフロントエンドである(語死早).  
サービスは、ステータスの有無によって次のように分けられます. ステータスレスサービスとステータスありサービス 
無状態サービスは容易に理解できるが、helloword、echoの例、計算機の例は、ユーザ入力自体が状態を保存しないことを処理するだけで、それは無状態サービスである.無状態サービスの拡張は簡単で、ノードを増加する.
しかし、コンピュータのようなサービスでは、ユーザが次回使用するのを待つためにデータを保存する必要がある場合には、ステータスのあるサービスが必要となる.当然、このときのステータスがサードパーティの記憶に託されているため、サードパーティの記憶を導入してステータスを回避する、ステータスのないサービス(偽)を継続して使用することもできる. 
もちろん、上記のやり方は構造を複雑にする、ステータスサービスを使用するよりも、追加の呼び出し待ちをもたらす可能性がある. 
サービスは状态があって、それはまた状态の着地に関连して、灾难に対応して、同期して、ロック...これらのものは私の全体のプログラミングの生涯を烦わして.SFの中で答えを探し当てることができると言われています. 
公式サイトのドキュメントの入門例は複雑すぎて、angularなどの敷居を高くして頭をかき回すものを導入しましたが、私は今日あまり勉強するつもりはありません.まずhelloworldを作って消化します.最後の機能はconsoleプログラムを通じてサービスインタフェースを呼び出し、戻ってきた文字列helloworldを受信することです. 
インストールに必要なツール
間違いなく、visual studioは必要で、私は現在の最新vs 2017コミュニティ無料版を選んだ.
次にsdkをインストールします
二無状態サービスの作成
vs->新規プロジェクトを開く->Visual C#->cloud->Serivce Fabric Application名前はHelloWorldApplication
ステータスレスサービス(stateless service)を選択します.名前はHelloWorldServiceです.
三定義インタフェース
インタフェースの作成、IHelloWorldServices.cs
定義方法Task SayHello(string msg);
リモートで呼び出すにはnugetインストールパッケージMicrosoft.ServiceFabric.Services.Remotingを使用します.
「プロジェクトファイルcsprojの編集」を開くと、次のパッケージ参照が表示されます.
  <ItemGroup>
    <PackageReference Include="Microsoft.ServiceFabric.Services" Version="3.1.301" />
    <PackageReference Include="Microsoft.ServiceFabric.Services.Remoting" Version="3.1.301" />
  ItemGroup>

IHelloWorldServiceを編集し、IServiceから継承します(先ほどインストールしたremotingパッケージで参照を追加する必要があります)
最後は以下の通り
using Microsoft.ServiceFabric.Services.Remoting;
using System;
using System.Collections.Generic;
using System.Text;
using System.Threading.Tasks;

namespace HelloWorldService
{
    public interface IHelloWorldService : IService
    {
        Task SayHello(string msg);
    }
}

ここでの戻り値はTaskタイプです.正直に言うと、初めてSFに触れたとき、Orleansと同じようにメッセージの受信と処理を非同期にしているかどうかはわかりませんが、taskの同期呼び出しでサービス処理にマルチスレッドの問題を心配する必要はありません.しかし、自社製品が同じ先進的な方法を採用しない理由はないと思います.
四実装インタフェース
HelloWorldServices.csファイルを編集し、IHelloWorldServicesインタフェースを継承し、SayHelloメソッドを実現する. 
既存のStartAsyncメソッドを削除します.(Azure Cloud Service方式の継続?)
最後のコードは次のとおりです.
    internal sealed class HelloWorldService : StatelessService, IHelloWorldService
    {
        public HelloWorldService(StatelessServiceContext context)
            : base(context)
        { }

        public Task<string> SayHello(string msg)
        {
            return Task.FromResult($"hello world! {msg}");
        }/// 
        ///              (  TCP、HTTP),                    。
        /// 
        /// 
        protected override IEnumerable CreateServiceInstanceListeners()
        {
            //return new ServiceInstanceListener[0];
            return this.CreateServiceRemotingInstanceListeners();
        }
    }

服务到此就创建完毕了. 

五 发布到本地集群

  右键HelloWorldApplication项目, 然后发布, 选择LocalNode配置, 然后发布.

  经历漫长的等待之后, 右下角出现了一个SF的橘黄色图标, 右键Manage local cluster, 可以查看和管理已经发布的applicaiton, 以及具体运行的node. 

  注意, 忘记说了, vs需要用管理员打开...

六 接下来创建客户端.

  新建项目, console application, 任意, 我选择.net Core Console Application.

  nuget获取包

  
    "Microsoft.ServiceFabric.Services" Version="3.1.301" />
    "Microsoft.ServiceFabric.Services.Remoting" Version="3.1.301" />
  

既存のアイテムを追加し、先ほどのIHelloWorldServices.csを追加します(リンクファイルを追加して同期を維持することもできますので注意).
インタフェースの同期を維持するもう1つの方法は、同じクラスライブラリを参照する別のクラスライブラリプロジェクトを構築することです(Orleansの例と同じです).
プログラムのmain関数の変更
        static void Main(string[] args)
        {
      
var client = ServiceProxy.Create(new Uri("fabric:/HelloWorldApplication/HelloWorldService"));
       string msg = Console.ReadLine();
       var result = client.SayHello(msg).Result; Console.WriteLine(result); Console.ReadKey(); }

F 5クライアントを実行する結果を表示する. 
上記の例と同様に、コンピュータサービスに拡張することもできる. 
 
誤り訂正:インタフェースがTaskに戻るのは内部でシーケンス同期呼び出しの関係を維持しているためかもしれないが、実は間違っている.SFにはactorモデルがあり、Orleansと同じように通常のステータスサービスは非同期呼び出しである.