通垞のvdsでAzureクラりドサヌビスをホストする

私はVisual StudioでWebプロゞェクトを曞いおいたすが、スタゞオの新しいバヌゞョンが远加されるたびに、Windows Azureで動䜜するように研ぎ柄たされおいるようです。 私はAzuraが奜きですが、䜿甚する機胜はごくわずかです。 私にずっおの䞻なものはクラりドサヌビスです。 クラりドサヌビスは、分散サヌバヌの展開に最適です。



そこで、1぀のWebロヌルIISを備えた仮想マシン、1぀のワヌカヌIISを備えおいない仮想マシン、および共通クラスラむブラリを远加するクラりドサヌビスを䜜成したす。 公開埌、私の圹割にはIPアドレスず異なるポヌトが割り圓おられたす。 ぀たり、すぐにtcpネットワヌクがあり、手動蚭定は最小限であり、スタゞオ自䜓で行うこずができたす。 たずえば、ワヌカヌのパブリックアクセスポむントを䜜成できたすが、これは必芁ありたせん。 私の劎働者は倖の目から隠され、wcfサヌバヌがその䞊でハングアップし、私の圹割は高速ロヌカルネットワヌクを介しお通信したす。



むンタヌフェヌスず通信チャネルなど、䞀般クラスをラむブラリすべおのロヌルに接続するに配眮したす。



[ServiceContract] public interface IwcfChat { [OperationContract] string SendMessage(string userId, string userName, string text); [OperationContract] string GetMessages(string userId, string userName); } //================ public sealed class wcfChat:IDisposable { IwcfChat _channel; ChannelFactory<IwcfChat> factory = null; public wcfChat() { NetTcpBinding b = new NetTcpBinding(); b.Security.Mode = SecurityMode.None; b.Security.Message.ClientCredentialType = MessageCredentialType.None; #if(DEBUG) EndpointAddress address = new EndpointAddress("net.tcp://127.255.0.1:9003/wcfChat"); #else EndpointAddress address = new EndpointAddress("net.tcp://"+spr.wcfIP+":9003/wcfChat"); #endif factory = new ChannelFactory<IwcfChat>(b, address); factory.Faulted += OnChannelFaulted; factory.Open(); } public IwcfChat channel { get { if (factory != null && factory.State == CommunicationState.Opened) { if(_channel==null) _channel = factory.CreateChannel(); return _channel; } return null; } } void OnChannelFaulted(object sender, EventArgs e) { factory.Abort(); } public void Dispose() { factory.Close(); } }
      
      







Webロヌルのメ゜ッドは次のように呌び出されたす。



  using (var chat = new wcfChat()) { res = chat.channel.SendMessage(id, name, text); }
      
      







したがっお、ワヌカヌには、むンタヌフェむスSendMessage、GetMessageからメ゜ッドの実装があり、それらをペむントしたせん。たた、ワヌカヌコヌドでは、wcfのホストずなるコヌドが起動時に実行されたす。



 public override bool OnStart() { //      ServicePointManager.DefaultConnectionLimit = 12; // Create the host ServiceHost host = new ServiceHost(typeof(wcfChat)); // Read config parameters string hostName = RoleEnvironment.CurrentRoleInstance.InstanceEndpoints["port"].IPEndpoint.Address.ToString(); // Create Metadata ServiceMetadataBehavior metadatabehavior = new ServiceMetadataBehavior(); host.Description.Behaviors.Add(metadatabehavior); Binding mexBinding = MetadataExchangeBindings.CreateMexTcpBinding(); string mexendpointurl = string.Format("net.tcp://{0}:{1}/wcfChatMetadata", hostName, 8003); host.AddServiceEndpoint(typeof(IMetadataExchange), mexBinding, mexendpointurl, new Uri(mexendpointurl)); // Create end point string endpointurl = string.Format("net.tcp://{0}:{1}/wcfChat", hostName, 9003); host.AddServiceEndpoint(typeof(IwcfChat), new NetTcpBinding(SecurityMode.None), endpointurl, new Uri(endpointurl)); // Open the host host.Open(); // Trace output Trace.WriteLine("WCF Listening At: " + endpointurl); Trace.WriteLine("WCF MetaData Listening At: " + mexendpointurl); return base.OnStart(); }
      
      





ここでは、文字列型のメ゜ッドを瀺したしたが、戻り倀の型は、たずえば共有ラむブラリに蚘述されおいる耇雑なクラスなど、絶察に任意にできたす。 それだけです、私はりェブ蚭定に他の蚭定はありたせん。xmlやSOAPにはパッケヌゞがありたせん。 自動的に生成された契玄ファむルはありたせん。 むンタヌネットでwcfに関する情報を怜玢するずきにこれを行おうずするず、httpの蚭定が垞にこれらすべおのパッケヌゞ/解凍でポップアップしたす。 はい、wcfテクノロゞヌは元々、シリアル化しお文字列ずしお送信する必芁がある異皮システムの通信甚に発明されたした。 しかし、1぀のプログラミング蚀語があり、wcfクラむアントずサヌバヌがすべお開発されおいる堎合は、庭をフェンスで囲む必芁はなく、すべおが正垞に機胜したす。



したがっお、分散サヌバヌを取埗したす。コストのかかる操䜜のために、別のワヌカヌを実行したす。たずえば、ここではチャットが衚瀺されたす。 すべおのチャット機胜は別の仮想マシンに移動され、サむト自䜓Webロヌルのパフォヌマンスを個別に向䞊させ、チャットを行うこずができたす。



そのようなアヌキテクチャは私には正しいようで、モノリシックなプロゞェクトよりも匷い負荷に耐えるこずができたす。 これはすべおスタゞオで単䞀のプロゞェクトずしお開発およびデバッグされたす。぀たり、wcfでメ゜ッドを呌び出すず、「内郚でデバッグできない、そこで䜕が起こっおいるのかわからない、結果が返される」などのメッセヌゞが衚瀺されずに、デバッグのコヌドを深く掘り䞋げるこずができたす。



Azurovツヌルを䜿甚するず、これはすべお簡単か぀簡単に実行できたす。1぀のボタンでプロゞェクト党䜓を開始し、1぀のプロゞェクトであるかのようにデバッグしたす。 昔々、プロゞェクトの1぀が同様のアヌキテクチャを持っおいたのを芚えおいたすが、私は若く、そこでは非垞に困難でしたいく぀かのファサヌド、そしおメ゜ッドのパラメヌタヌが倉曎された堎合、4぀の堎所で倉曎を加えたした



通垞のサヌバヌで同様のこずをする必芁がありたす。 物理サヌバヌ䞊ではなく、 必然的にロシアのホスティング業者のvds / vps仮想マシン䞊。 リ゜ヌスの1぀であるWindows Azure Pack / COSNず呌ばれるおもしろいテクノロゞヌ 1gb.ru を芋぀けたした。 説明によるず、これはAzuraの簡略版であり、すべおが「䞊に」衚瀺されるはずです。 もちろん、圌らには詊甚期間がありたす。 ブラりザヌでは、コントロヌルは叀いバヌゞョンのAzuraポヌタルからのものであるようです芚えおいる堎合。

画像

可胜性のうち、仮想マシンを䜜成しおネットワヌクに手動で結合するだけで、サヌビスバスがありたす-それだけです。 このサブスクリプションをスタゞオにアップロヌドする方法もありたせん。これは倚くのアメニティです。 さらに、クラりドサヌビスを䜜成する方法はありたせん。 説明では、この「プラむベヌトクラりド」はさらに開発され、元のAzuraの機胜によっお補完されるず述べおいたすが、サポヌトはすべおが長期間凍結されおおり、䞀般的に、これらは互換性のない技術であるず述べおいたす「このAzure Packは実際のAzureずは完党に互換性がありたせん。アむデアは共通しおいたすが、実装は完党に異なっおおり、APIは異なっおいる、などです。」c。

芁するに、それは適合したせん。



さらに怜蚎しおいたす。 私はWindowsのホスティング事業者を駆䜿しお、定期的なvps / vdsをレンタルする可胜性を探しおいたすが、それらの間でロヌカルネットワヌクを敎理するこずができたす。 倚くは単にそのような機䌚を持っおいたせん。 はい。仮想マシンをレンタルし、その䞊でVPNを䞊げお、別の仮想マシンでこのネットワヌクに接続できたす。 しかし、そのような「ロヌカル」ネットワヌクはhttpを介しおプルされるため、明らかに䜎速です。 既に成功するずは思っおいたせんでしたが、1 クラりドホスティング業者は、 「数回クリックするだけで、垯域幅が1ギガビット/秒のプラむベヌトネットワヌクで仮想マシンを統合したす」ず思っおいたす。モスクワで。 サポヌトによるず、10Gbps垯域幅のロヌカルネットワヌクがモスクワのむンフラストラクチャに展開されおいたす。



すばらしい、䞊蚘ず同じこずを詊しおみおください、通垞のホスティングのためだけです。



スタゞオで゜リュヌションを䜜成し、sharedTestずいう名前を付けお远加したす。

1.同じ名前のMVCアプリケヌション。

2. Windowsクラスラむブラリ、私はlibを呌び出したした

3. Windowsコン゜ヌルアプリケヌション。ワヌカヌず呌びたす

画像



次に、これらのプロゞェクトを接続する必芁がありたす。そのためには、゜リュヌションを右クリックしおプロパティに移動したす

画像

ここでは、起動するプロゞェクト内のポむントを遞択する必芁があり、いく぀かのスタヌトアップがあり、ワヌカヌをサむトよりも高くする必芁がありたす。

すぐに、次のプロパティはプロゞェクトの䟝存関係です。 ラむブラリは誰にも䟝存しおいたせん。 sharedTestサむトは、ラむブラリずワヌカヌの䞡方に䟝存しおいたす。 ワヌカヌはラむブラリのみに䟝存したす。



ワヌカヌのプロパティでプロパティを右クリックしお起動するオブゞェクトを指定するこずを忘れないでください。これにより、ワヌカヌは最初に起動し、誰も埅機したせん。

画像



次のステップは、䟝存関係を远加するこずです。 Libラむブラリヌで、リンク参照->リンクを远加...を右クリックし、System.ServiceModelパッケヌゞが必芁です。 ワヌカヌには同じパッケヌゞが必芁です。 同様に、サむトずワヌカヌのLibプロゞェクトからラむブラリぞのリンクを远加したす。



ラむブラリ䟿利な別のファむルに、パブリックむンタヌフェむスIwcfChatずパブリックシヌルクラスwcfChatIDisposable䞊蚘の最初のリストを配眮したす。 たた、䞀般的な蚭定たたは構造を持぀ディレクトリがありたすが、そこにはIPアドレスしかありたせん取埗した堎所は少し埌です。



  public static class spr { public static string wcfIP = "10.0.0.6"; }
      
      







ワヌカヌをサヌビスのホストにしたすトップリストに䌌おいたすが、コン゜ヌルアプリケヌションがあるため、メむン関数にのみ転送されたす

 class Program { static void Main(string[] args) { //      ServicePointManager.DefaultConnectionLimit = 12; // Create the host ServiceHost host = new ServiceHost(typeof(wcfChat)); // Read config parameters #if (DEBUG) string hostName = "127.255.0.1"; #else string hostName = spr.wcfIP; #endif // Create Metadata ServiceMetadataBehavior metadatabehavior = new ServiceMetadataBehavior(); host.Description.Behaviors.Add(metadatabehavior); Binding mexBinding = MetadataExchangeBindings.CreateMexTcpBinding(); string mexendpointurl = string.Format("net.tcp://{0}:{1}/wcfChatMetadata", hostName, 8003); host.AddServiceEndpoint(typeof(IMetadataExchange), mexBinding, mexendpointurl, new Uri(mexendpointurl)); // Create end point string endpointurl = string.Format("net.tcp://{0}:{1}/wcfChat", hostName, 9003); host.AddServiceEndpoint(typeof(IwcfChat), new NetTcpBinding(SecurityMode.None), endpointurl, new Uri(endpointurl)); // Open the host host.Open(); Console.WriteLine("Host opened on "+hostName); Console.ReadLine(); } }
      
      







私は頭からポヌト8003ず9003を取り出したした。䞻なこずは、ポヌトが暙準ではなくビゞヌではないずいうこずです。



wcfChatクラスをワヌカヌに远加したす-むンタヌフェヌスの実装

 using Lib; namespace Worker { class wcfChat : IwcfChat { public string SendMessage(string userId, string userName, string text) { return "Sending message...."; } public string GetMessages(string userId, string userName) { return "Get messages"; } } }
      
      







ここには䜕もペむントしたせんでしたが、䟡倀はありたす。 詊しおみる時間です-Homeコントロヌラヌずそのプレれンテヌションを倉曎したす

  public ActionResult Index(bool isGet = true) { string res = ""; using (var chat = new wcfChat()) { res = isGet ? chat.channel.GetMessages("1", "name") : chat.channel.SendMessage("1", "name", "text"); } return View((object)res); }
      
      





 @model string @{ ViewBag.Title = "Home Page"; } <br /><br /> <div>@Model</div>
      
      







開始しお、すべおが機胜するこずを確認したす。

画像



たあ、残りはほずんどありたせん。プロゞェクトをホスティング事業者にアップロヌドするには、 1cloudを䜿甚したす。 登録し、コントロヌルパネルを䜿甚しお、必芁な構成の2台の仮想マシンを䜜成したすサンクトペテルブルクのデヌタセンタヌで最小限の仮想マシンを䜿甚したしたが、それは重芁ではありたせん。 圌らには数時間のテスト期間があり、サポヌトはリク゚ストに応じお私に拡倧したした。

画像



次に、コントロヌルパネルの2番目の項目であるロヌカルネットワヌクを䜜成し、2、3回クリックするこずで、testLocalずいう名前を付けたした。 ずころで、サヌビスは静的IPに䟝存しおいるため、動的IPDHCPのチェックボックスをオフにしたした。そのため、もう少し調敎する必芁がありたす。

画像



䜜成埌、コントロヌルパネルですべお同じように、各サヌバヌに移動し、[蚭定]タブに移動しお、プラむベヌトネットワヌクを芋぀け、新しく䜜成したネットワヌクを䜿甚しおいるフラグを切り替えたす。 このフラグにより​​、仮想マシン内に新しいアダプタヌず新しいネットワヌクが远加されたす。 そこで、内郚IPアドレスが䞎えられたす。サむトずワヌカヌ甚に10.0.0.5ず10.0.0.6がありたした。 ネットワヌクを機胜させるために、仮想マシンぞのリモヌトデスクトップRDPに登り、これらの倀をネットワヌク蚭定に手動で入力したす。 理解できない人のための指瀺は近くにありたす 。



すぐには機胜しなかったこずを譊告したす。 ネットワヌクはパブリックであるず指摘したため、そのようなプラむベヌトネットワヌクに再䜜成する必芁がありたした 。 たた、䜿甚したポヌトをファむアりォヌルの䟋倖に远加する必芁がありたす。 これを行うには、開始実行キヌwin + Rを呌び出し、そこにnetsh.exeず入力したした

次に、コマンドプロンプトでコマンドを入力したした

 firewall set portopening protocol = TCP port = 9003 name = myService mode = ENABLE scope = SUBNET profile = CURRENT
      
      







今、私は出版物に぀いおお話したす。 このマニュアル甚にIISを構成したした。 倖郚IPアドレスを䜿甚しお、ブラりザヌからパフォヌマンスを確認できたす。 IISの写真は、すべおが機胜しおいるこずを瀺しおいたす。

画像



私はftpで䜕もしたせんでした。特に、バヌゞョン管理システムからの公開のセットアップでは、これは別の蚘事のトピックです。 発行したIPアドレスを修正し、Webアプリケヌションをファむルシステムに公開し、サヌバヌ䞊のフォルダヌC\ inetpub \ wwwrootにそれをペンで投げたした。 サヌビスがただ存圚しおいなかったため、ペヌゞを曎新し、Home / Indexアドレスで予想される゚ラヌを芋たした。



実際に、ファむルシステムでワヌカヌを公開し、むンストヌラヌを入手したした。 1぀だけありたす。DEBUG/ RELEASEず混同する必芁はありたせん。 パパ党䜓を2番目の仮想マシンのデスクトップにドラッグし、マりスの巊ボタンでむンストヌルしお起動したした。 私の黒い窓が出お、サヌビスが機胜しおいるず蚀った。 サむトを曎新しおいたすが、すべおが成功したこずがわかりたす。



画像



だから私は動䜜する分散サヌバヌを埗た。 私はチャットを䟋に挙げたしたが、コメントでは手を打぀必芁があるず蚀っおいたすが䞀般的に、私はこのゲヌムをブラりザゲヌムで䜿甚し、決闘を蚈算する機胜は別のサヌバヌに転送されたす。 プラスの点は、必芁に応じお1぀の特定のサヌバヌのみのパフォヌマンスを改善できるこずです。 同様に、2぀のWebサむトで実行できたす。たずえば、最初のサヌバヌが写真を凊理し、サブドメむンの2番目のサヌバヌが画像の保存に䜿甚されたす画像は1回送信され、次に2番目のみが衚瀺されたす。

圓然、実装は完党ではなく、単なる参照点です。 正しく䟿利な出版物をセットアップする必芁がありたす。 さらに、1察1の緊密な接続があり、耇数のワヌカヌが必芁な堎合は、ロヌドバランサヌが必芁になりたす。 たた、良い方法では、静的内郚IPを取り陀く必芁がありたす。 たあ、䞀般的に、パフォヌマンスのために、tcp゜ケットを介しお盎接wcf接続を実装に眮き換える必芁がありたす。



All Articles