基於.NET CORE微服務框架 -surging的介紹

来源:http://www.cnblogs.com/zhushengliang/archive/2017/07/16/7192486.html
-Advertisement-
Play Games

一、前言         至今為止編程開發已經11個年頭,從 VB6.0,ASP時代到ASP.NET再到MVC, 從中見證了.NET技術發展,從無畏無知的懵懂少年,到現在的中年大叔,從中的酸甜苦辣也只有本人自知。隨著歲月的成長,技 ...


一、前言

        至今為止編程開發已經11個年頭,從 VB6.0,ASP時代到ASP.NET再到MVC, 從中見證了.NET技術發展,從無畏無知的懵懂少年,到現在的中年大叔,從中的酸甜苦辣也只有本人自知。隨著歲月的成長,技術也從原來的三層設計到現在的領域驅動設計,從原來的關係型資料庫SQL 2000到現在的NOSQL (mongodb,couchbase,redis),從原來基於SOAP協議的web service到現在基於restful 協議的web api,wcf,再到現在rpc微服務。技術的成長也帶來歲月的痕跡。

        現在微軟又出了.NET CORE,為了緊跟微軟的步伐,研究了將近1年,從中看了不少開源代碼,如NetEscapades.Configuration,eShopOnContainers,rabbit.RPC等等,從中學到了不少知識,後面利用所學加上自己的想法,開發出分散式微服務框架surging。開源地址:點擊打開鏈接。下麵會以三篇文章的形式介紹

surging

1.基於.NET CORE微服務框架 -surging的介紹和簡單示例 (開源)

2.剝析surging的架構思想

3.後續surging的架構完善工作

二、什麼是surging

surging從中文譯義來說,衝擊,洶涌,也可以翻譯成風起雲涌。我所希望的是.net core 能成為i最流行的技術。

surging從技術層面來說就是基於RPC協議的分散式微服務技術框架,框架依賴於Netty 進行非同步通信,採用Zookeeper作為服務註冊中心,集成了哈希,隨機和輪詢作為負載均衡演算法

1.服務化應用基本框架

框架的執行過程如下:

1.服務提供者啟動,根據RPC協議通過配置的IP和port綁定到netty上

2.註冊服務信息存儲至Zookeeper

3.客戶端CreateProxy調用服務時,從記憶體中拿到上次通知的所有效的服務地址,根據路由信息和負載均衡機制選擇最終調用的服務地址,發起調用

2.簡單示例

  創建IModuleServices

   IUserService.cs:

+ View Code?
12345678910111213141516171819[ServiceBundle]  //服務標記  public interface IUserService  {      Task<string> GetUserName(int id);       Task<bool> Exists(int id);       Task<int>  GetUserId(string userName);       Task<DateTime> GetUserLastSignInTime(int id);       Task<UserModel> GetUser(int id);       Task<bool> Update(int id, UserModel model);       Task<IDictionary<string, string>> GetDictionary();            Task TryThrowException();  }

 創建領域對象

 UserModel:

?
123456789[ProtoContract] public class UserModel {     [ProtoMember(1)]     public string Name { get; set; }      [ProtoMember(2)]     public int Age { get; set; } }

 

 AssemblyInfo.cs,擴展AssemblyModuleType來標識模塊,根據AssemblyModuleType進行相關規則的反射註冊

?
123456[assembly: AssemblyTitle("Surging.IModuleServices.Common")][assembly: AssemblyDescription("業務模塊介面")][assembly: AssemblyModuleType(ModuleType.InterFaceService)] // 如果此項目向 COM 公開,則下列 GUID 用於類型庫的 ID[assembly: Guid("2103624d-2bc2-4164-9aa5-1408daed9dee")]

 

創建Domain Service

PersonService.cs

?
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364[ModuleName("Person")]  //標識實例化名稱    public class PersonService : ServiceBase,IUserService    {        #region Implementation of IUserService        private readonly UserRepository _repository;        public PersonService(UserRepository repository)        {            this._repository = repository;        }                 public Task<string> GetUserName(int id)        {            return GetService<IUserService>("User").GetUserName(id);        }         public Task<bool> Exists(int id)        {            return Task.FromResult(true);        }         public Task<int> GetUserId(string userName)        {            return Task.FromResult(1);        }         public Task<DateTime> GetUserLastSignInTime(int id)        {            return Task.FromResult(DateTime.Now);        }         public Task<UserModel> GetUser(int id)        {            return Task.FromResult(new UserModel            {                Name = "fanly",                Age = 18            });        }         public Task<bool> Update(int id, UserModel model)        {            return Task.FromResult(true);        }         public Task<IDictionary<string, string>> GetDictionary()        {            return Task.FromResult<IDictionary<string, string>>(new Dictionary<string, string> { { "key", "value" } });        }         public async Task Try()        {            Console.WriteLine("start");            await Task.Delay(5000);            Console.WriteLine("end");        }         public Task TryThrowException()        {            throw new Exception("用戶Id非法!");        }         #endregion Implementation of IUserService    }}

 UserService.cs

?
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364[ModuleName("User")]//標識實例化名稱   public class UserService: IUserService    {        #region Implementation of IUserService        private readonly UserRepository _repository;        public UserService(UserRepository repository)        {            this._repository = repository;        }         public Task<string> GetUserName(int id)        {            return Task.FromResult($"id:{id} is name fanly.");        }         public Task<bool> Exists(int id)        {            return Task.FromResult(true);        }         public Task<int> GetUserId(string userName)        {            return Task.FromResult(1);        }         public Task<DateTime> GetUserLastSignInTime(int id)        {            return Task.FromResult(DateTime.Now);        }         public Task<UserModel> GetUser(int id)        {            return Task.FromResult(new UserModel            {                Name = "fanly",                Age = 18            });        }         public Task<bool> Update(int id, UserModel model)        {            return Task.FromResult(true);        }         public Task<IDictionary<string, string>> GetDictionary()        {            return Task.FromResult<IDictionary<string, string>>(new Dictionary<string, string> { { "key", "value" } });        }         public async Task Try()        {            Console.WriteLine("start");            await Task.Delay(5000);            Console.WriteLine("end");        }         public Task TryThrowException()        {            throw new Exception("用戶Id非法!");        }         #endregion Implementation of IUserService    }}

 

AssemblyInfo.cs,擴展AssemblyModuleType來標識模塊,根據AssemblyModuleType進行相關規則的反射註冊

?
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364[ModuleName("User")]//標識實例化名稱   public class UserService: IUserService    {        #region Implementation of IUserService        private readonly UserRepository _repository;        public UserService(UserRepository repository)        {            this._repository = repository;        }         public Task<string> GetUserName(int id)        {            return Task.FromResult($"id:{id} is name fanly.");        }         public Task<bool> Exists(int id)        {            return Task.FromResult(true);        }         public Task<int> GetUserId(string userName)        {            return Task.FromResult(1);        }         public Task<DateTime> GetUserLastSignInTime(int id)        {            return Task.FromResult(DateTime.Now);        }         public Task<UserModel> GetUser(int id)        {            return Task.FromResult(new UserModel            {                Name = "fanly",                Age = 18            });        }         public Task<bool> Update(int id, UserModel model)        {            return Task.FromResult(true);        }         public Task<IDictionary<string, string>> GetDictionary()        {            return Task.FromResult<IDictionary<string, string>>(new Dictionary<string, string> { { "key", "value" } });        }         public async Task Try()        {            Console.WriteLine("start");            await Task.Delay(5000);            Console.WriteLine("end");        }         public Task TryThrowException()        {            throw new Exception("用戶Id非法!");        }         #endregion Implementation of IUserService    }}

 

3.服務端

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

-Advertisement-
Play Games
更多相關文章
  • Win10系統桌面右鍵新建沒有內容怎麼恢復 添加txt文本文檔 添加word、excel、ppt ...
  • #Centos visudo運行普通用戶$(whomai)執行sudo操作 http://www.cnblogs.com/xianyunhe/archive/2011/08/08/2124342.html 在/etc/gdm/custom.conf文件中添加以下內容 [daemon] Automat ...
  • 標簽:MSSQL/SQLServer/域控制器提升的先決條件驗證失敗/密碼不符合要求 概述 在安裝WindowsServer2012域控出現administrator賬戶密碼不符合要求的錯誤,但是實際該賬戶存在密碼且密碼複雜也符合要求!!! 一、問題描述 二、處理方法 運行如下命令後,重新運行檢查。 ...
  • 查看當前目錄: pwd 查看文件具體大小: ls -l 返回上一級: cd.. 返回根目錄: cd / 創建一個隱藏文件: vim .test 顯示隱藏文件: ls -a 編輯文件: 1.vim 文件名 2.按i進入插入模式 3.寫完文件之後按esc,再按shift+:鍵,再輸入wq,回車,文件就保 ...
  • 安裝office,直接引用COM控制項 C#4提供對PIA引用的一種方式:鏈接(編譯器只會將PIA中需要的部分直接嵌入到程式集中),變體(variant)被視為動態類型,以減少強制轉換需要的開銷; 不安裝office,拷貝相關dll到運行目錄,直接引用; 拷貝的dll版本最好是12及以上,12以下有兼 ...
  • 背水一戰 Windows 10 之 控制項(媒體類): Image, MediaElement ...
  • 本篇將介紹 ASP.NET Core MVC 中的過濾器的基本知識以及如何工作的。 ...
  • 忽然一想好久不寫博客了,工作原因個人原因,這些天一直希望一天假如36個小時該多好,但是,假如不可能。 由於近期在項目中接觸了lucene,這個已經沒有人維護的全文搜索框架,確實踩了不少坑,為什麼用lucene呢?其實我也不知道 關於lucene原理和全文搜索引擎的一些介紹,園子里有這幾篇寫的還是很好 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...