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運行客戶端, 查看結果. 

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

 


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

-Advertisement-
Play Games
更多相關文章
  • #!/usr/bin/env python #Python 3.7.0 元祖常用方法 __author__ = "lrtao2010" #元祖和列表類似,只不過元祖一旦被創建一級元素不可更改(增刪改)。 # a = ('123',['abc'],'b',345,['6','7','d'],) # a... ...
  • 本篇介紹日誌的使用,包括系統預設的控制台日誌和第三方NLog日誌管理。 ...
  • 一. 承上聲明 在上一個章節里,啰里啰嗦寫了一堆關於介紹SignalR的“廢話”,從這一篇開始往後正式擼代碼,這期間不少人(包括 張善友大哥)建議我直接用.Net Core下的SignalR,關於此簡單說一下,雖然我們要跟上時代步伐,但目前絕多數.Net項目都是基於 .Net FrameWork下的 ...
  • 為什麼有這篇文章 最近在學ASP.NET MVC項目中使用Ioc,選用了Unity作為依賴註入的容器組件,在網上找了相關的文章簡單實現了依賴註入,但想用文件配置的方式進行容器註入的註冊,發現相關的文章實現的方式不適用,因為網上的文章大多是使用Unity 4.0.1的版本,而目前最新的Unity版本是 ...
  • Asp.Net Core 使用Quartz基於界面畫介面管理做定時任務 ...
  • C# .Net CSV文件讀寫 兩個集合尋找不同的值 複製可用 ...
  • 關於對象轉換已經有不少輪子(AutoMapper,TinyMapper) .出於項目需要,手動造一個簡單輪子。先貼代碼 g>1.採用靜態泛型類緩存,避免了拆箱裝箱操作。 2.對於轉換對象中有,欄位名一樣但是類型不一樣的類時仍可以用 1 public static class Mapper<TSour ...
  • 0.簡介 在 Abp 框架內部實現了工作單元,在這裡講解一下,什麼是工作單元? Unit Of Work(工作單元)模式用來維護一個由已經被業務事物修改(增加、刪除或更新)的業務對象組成的列表。Unit Of Work模式負責協調這些修改的持久化工作以及所有標記的併發問題。在數據訪問層中採用Unit ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...