Service Fabric學習-從helloworld開始(無狀態服務)

来源:https://www.cnblogs.com/pasoraku/archive/2018/07/09/9284855.html
-Advertisement-
Play Games

原先做伺服器程式, 都是部署在xx雲上, 也沒理解雲是個啥, 不就是個伺服器(虛擬機)租賃商嗎? 好吧, 其實這個是IaaS, 而接下來要學習的ServiceFabric(以下簡稱SF)是PaaS. 首先SF和Orleans類似, 都是基於actor模型, 然後編程方式也很像, 大概就是定義公開介面 ...


原先做伺服器程式, 都是部署在xx雲上, 也沒理解雲是個啥, 不就是個伺服器(虛擬機)租賃商嗎? 好吧, 其實這個是IaaS, 而接下來要學習的ServiceFabric(以下簡稱SF)是PaaS. 

首先SF和Orleans類似, 都是基於actor模型, 然後編程方式也很像, 大概就是定義公開介面, 然後後端服務實現介面, 前端調用介面這樣.

這裡說的前後端著實不夠嚴謹, 其實是指伺服器上的前後端, 前端是服務的前端並非伺服器對應的客戶端. 如果有web(asp.net)或是其他無狀態類似網關的服務在前面接收客戶端消息並調用服務介面, 那就是服務的使用者也就是這裡語義上的前端了(語死早).  

服務根據其是否有狀態分為: 無狀態服務和有狀態服務. 

無狀態服務很容易理解, 一個helloword, echo示例, 計算器示例, 只處理用戶輸入本身不保存狀態, 那就是無狀態服務. 無狀態服務的擴展很簡單, 增加節點既是.

然而如計算器這種服務, 如果需要保存一些數據等待用戶下次使用, 那就需要變成有狀態服務了. 當然也可以引入第三方存儲來規避狀態, 繼續使用無狀態服務(偽), 因為此時的狀態已經托付給第三方存儲了. 

當然上述做法使得結構又複雜起來了, 也可能造成額外的調用等待, 不如使用有狀態服務. 

而服務有了狀態, 那又涉及到狀態的落地, 容災, 同步, 鎖...這些東西煩擾了我整個編程生涯. 據說可以在SF中找到答案. 

官網的文檔入門案例太複雜了, 引入了angular等加高門檻攪腦汁的東西, 而我今天不打算學太多, 先做一個helloworld消化下. 最後的功能是能通過一個console程式調用服務介面, 然後接收返回的字元串helloworld. 

一 安裝必須工具

  毫無疑問, visual studio是必須的, 我選擇目前最新的vs2017社區免費版.

  然後安裝sdk

二 創建無狀態服務

  打開vs->新建項目->Visual C#->cloud->Serivce Fabric Application, 名稱為HelloWorldApplication

  選擇無狀態服務(stateless service), 名稱為HelloWorldService

三 定義介面

  創建介面, IHelloWorldService.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<string> SayHello(string msg);
    }
}

這裡的返回值是Task類型. 老實說我初次接觸SF並不清楚其是否和Orleans一樣將消息接收和處理非同步開來, 同時通過task的同步調用使服務處理不用擔心多線程問題. 但我猜自家產品沒有理由不採用同樣先進的方式吧?

四 實現介面

  編輯HelloWorldService.cs文件, 繼承IHelloWorldService介面, 實現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}");
        }/// <summary>
        /// 可選擇性地替代以創建偵聽器(如 TCP、HTTP),從而使此服務副本可以處理客戶端或用戶請求。
        /// </summary>
        /// <returns>偵聽器集合。</returns>
        protected override IEnumerable<ServiceInstanceListener> CreateServiceInstanceListeners()
        {
            //return new ServiceInstanceListener[0];
            return this.CreateServiceRemotingInstanceListeners();
        }
    }

服務到此就創建完畢了. 

五 發佈到本地集群

  右鍵HelloWorldApplication項目, 然後發佈, 選擇LocalNode配置, 然後發佈.

  經歷漫長的等待之後, 右下角出現了一個SF的橘黃色圖標, 右鍵Manage local cluster, 可以查看和管理已經發佈的applicaiton, 以及具體運行的node. 

  註意, 忘記說了, vs需要用管理員打開...

六 接下來創建客戶端.

  新建項目, console application, 任意, 我選擇.net Core Console Application.

  nuget獲取包

  <ItemGroup>
    <PackageReference Include="Microsoft.ServiceFabric.Services" Version="3.1.301" />
    <PackageReference Include="Microsoft.ServiceFabric.Services.Remoting" Version="3.1.301" />
  </ItemGroup>

  添加現有項, 將剛纔的IHelloWorldService.cs添加進去(註意可以選擇添加鏈接文件保持同步)

  保持介面同步的還有一個方法是另建一個類庫項目, 引用同一個類庫(如同Orleans示例中一樣)

  修改Program中的main函數

        static void Main(string[] args)
        {
      
var client = ServiceProxy.Create<IHelloWorldService>(new Uri("fabric:/HelloWorldApplication/HelloWorldService"));
       string msg = Console.ReadLine();
       var result = client.SayHello(msg).Result; Console.WriteLine(result); Console.ReadKey(); }

F5運行客戶端, 查看結果. 

同上示例, 還可以拓展為計算器服務. 

 

糾錯: 上面說介面返回是Task可能是因為內部維持序列同步調用的關係, 其實是錯誤的. SF還有actor模型, 才和Orleans一樣, 普通的有狀態服務仍會非同步調用.


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 二、排序Product 1.按名稱對產品進行排序,以特定順序顯示一個列表的最簡單方式就是先將列表排序,再遍歷並顯示其中的項。 C#1.1 使用IComparer對ArrayList進行排序 product類 1 using System.Collections; 2 using System.Com ...
  • 之前由於一個項目的需要(簡單說一下,一個網頁游戲,裁判的頁面點擊開始按鈕,玩家便可以開始游戲),研究了很久,最終一個同事跟我推薦了SignalR。距離項目結束已經有一段時間了,再來回顧一下SignalR的簡單實現吧。 1.什麼 SignalR? ASP.NET SignalR 是為.NET 開發者提 ...
  • 一、其實有現成的 先來看看Windows10進度條的兩種模式: 網上有不少介紹仿製Windows10進度條的文章,也都實現了不錯的效果。而我再開一文的原因是覺得如果在這基礎上添加一些功能,比如圓點的數量,圓點的大小等等,效果可能會更好一些。接觸過UWP的朋友應該知道,其框架中自帶了進度條控制項,以 P ...
  • 《代碼大全》的第二章:介紹隱喻(類比)的思維方式, 《經濟學原理》的第二章:介紹怎麼像經濟學家一樣思考, 《電腦的心智操作系統之哲學原理》的第一章:介紹學習操作系統的思維, 所以我也儘早地介紹我寫本系列中會經常運用的學習思維。 ...
  • 一、c#版本中添加的功能: C#2.0 泛型 部分類型 匿名方法 迭代器 可空類型 Getter / setter單獨可訪問性 方法組轉換(代表) Co- and Contra-variance for delegates 靜態類 Delegate inference 泛型 部分類型 匿名方法 迭代 ...
  • 序 在前面的文章C# 如何插入、修改、刪除Word批註一文中介紹瞭如何操作Word批註的一些方法,在本篇文章中繼續介紹操作Word批註的方法。分以下三種情況來介紹: 1. 插入圖片到Word批註 2. 讀取Word批註 3. 回覆Word批註 所需工具 Free Spire.Doc for .NET ...
  • 在一個正常的項目中,登錄註冊的密碼是密文傳輸到後臺服務端的,也就是說,首先前端js對密碼做處理,隨後再傳遞到服務端,服務端解密再加密傳出到資料庫裡面。Dotnet已經提供了RSA演算法的加解密類庫,我們只需要引用下就好,前端js也有對RSA演算法的封裝,解決了加解密演算法之後,剩下的就是要確保公私鑰的傳輸 ...
  • 一、第一步導入api 二、窗體初始化的時候,開啟剪切板切換 三、窗體關閉時,移除監聽 三、重寫窗體的WndProc方法處理監聽 運行結果: ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...