異構(相容dubbo)SOA系統架構(.net)優化升級

来源:http://www.cnblogs.com/xiangji/archive/2016/11/18/6078712.html
-Advertisement-
Play Games

前面一片文章已經提高我們公司的異構(相容dubbo)SOA系統架構,解決了不少技術痛點,也還算比較完善,也順利推廣開來。 但是作為項目的開發者,自己產品的問題心裡是清楚的,離自己滿意還是有不小的距離。 在推廣的同時,我緊張的進入了下一個版本的開發,讓它更加完善。 原來的版本號是1.0,現在版本升級為 ...


前面一片文章已經提高我們公司的異構(相容dubbo)SOA系統架構,解決了不少技術痛點,也還算比較完善,也順利推廣開來。

但是作為項目的開發者,自己產品的問題心裡是清楚的,離自己滿意還是有不小的距離。

在推廣的同時,我緊張的進入了下一個版本的開發,讓它更加完善。

原來的版本號是1.0,現在版本升級為1.1且已經開發完成併發布(內部),本次升級主要內容如下:

1、修正了一些bug 2、簡化了SOA使用   強化IOC的作用,解耦對象關聯性   使用公司內部Nuget管理SOA及相關依賴   簡化方法調用及方法參數(儘量只保留必須的參數) 3、性能提升、cpu和線程資源占用適當下降   高效非同步線程,減少應用程式啟動時間   高效對象復用節省記憶體和cpu消耗 4、穩定性提升   增加故障轉移(出錯的節點將會在負載均衡列表中移除,避免服務異常zookeeper未及時通知導致的大量報錯)   優化zookeeper連接狀態檢測和維護(連接中斷及時重新連接)   增加服務端優雅下線機制 5、強化配置   增加了很多可選配置滿足業務和性能需要   可以對單個服務單獨個性化配置 6、強化日誌   對SOA內部幾乎每個組件和每個服務都可以配置單獨的日誌   可以開啟所有日誌也可以選擇性的開啟部分日誌   以上開發測試工作耗了三個多月,當然這裡麵包含一些基礎建設工作,其意義不只是SOA受益,比如內部Nuget、日誌、IOC容器優化,
 一、1.1版本使用控制台做服務端的例子 1、使用Nuget安裝Fang.SOA 所有引用(含ZooKeeper和Thrift)一鍵搞定 2、其實要安裝的東西還是挺多的,如果沒有Nuget就會讓人崩潰 3、不要被太多組件(dll)嚇到,大部分dll很小的,都是獨立的功能 4、服務端的代碼非常簡單
    class Program
    {
        static IContainer _container;
        static void Main(string[] args)
        {
            IContainer container = _container = new SimpleContainer()
                .SOALoadSettings();//載入appSettings配置
            CreateHelloWorld(container);//HelloWorld服務
            container.SOAStart();//啟動所有服務
            Console.ReadLine();
        }
        /// <summary>
        /// HelloWorld服務
        /// </summary>
        /// <param name="container"></param>
        private static void CreateHelloWorld(IContainer container)
        {
            string serviceName = "com.fang.HelloWorld$Iface";//服務名
            var service = new HelloWorldImp();//服務實現邏輯
            container.SOAProvider<HelloWorldService.Iface>(serviceName, service);//註冊服務
        }
    }

哈哈,簡單吧。

除了簡單還有什麼?是不是也非常的流暢啊

你沒看錯,以上區區幾個行代碼就完成了SOA服務的發佈工作

5、對比1.0版本少的東西

5.1 ZKInit方法沒有了

這是一個重大變化,原來是要先把zooKeeper連接上才可以"發佈"服務的

現在沒有這個必須前提了,zooKeeper連接非同步化了,需要zooKeeper的時候從IOC容器中獲取,如果容器沒有非同步連接zooKeeper並保存到IOC容器中,以後需要的時候隨時取

5.2 增加了container(IOC容器)

這也是一個重大變化,現在SOA配置是依賴容器的,實際所有的參數都是從容器獲取,程式初始化的時候給需要的每個參數在容器裡面註入了預設值,如果需要配置覆蓋預設值即可

上面的SOALoadSettings就是容器擴展方法,用於把appSettings中SOA相關節點的數據載入容器中

其實幾乎SOA各大組件、運行需要對象、對象緩存服用很多都是用該容器實現的

5.3 1.0版本中ZKConsumer一哥的位置被無情的拋棄了

1.0版本中ZKConsumer幾乎是.net SOA直接交互的唯一一個類

後來隨著SOA系統完善,我發現ZKConsumer擔不起一哥這個角色就拋棄了它,啟用與SOA"毫無關係"的IContainer(容器介面)

這會是以後的趨勢,我們"不再需要牢記"每個系統個性化的業務名詞(類),我們使用IContainer通用對象的擴展方法來定義簡單Api

我們使用一個系統的方法就變成了引用該系統的Nuget包(dll),引用該系統的命名空間,然後在IContainer下找該系統的Api(擴展方法)來用即可

啟動一個系統就變成了給該系統配置容器,可以通過文件配置也可以通過代碼配置

5.4 有人可能說還少一堆配置,這全都預設值可不行 那些配置可以在appSettings中配置,每個服務還可以單獨配置,提供了一堆IContainer的擴展方法來配置 把1.0例子中的配置全加上後的代碼如下:
        private static void CreateHelloWorld(IContainer container)
        {
            string serviceName = "com.fang.HelloWorld$Iface";//服務名
            var service = new HelloWorldImp();//服務實現邏輯
            string serviceIp = "192.168.109.166";//發佈服務使用ip
            int servicePort = 5000;//發佈服務使用埠
            string group = "kg";//應用程式分組
            string serviceVersion = "1.0.0";//服務版本
            int serviceTimeOut = 5000; //服務超時閾值(單位Millisecond)
            int alertElapsed = 3000; //服務執行耗時監控報警閾值(單位Millisecond)
            int alertFailure = 10; //服務每分鐘出錯次數監控報警閾值
            container.SOAServiceHost(serviceIp, servicePort, serviceName)
                .SOAServiceGroup(group, serviceName)
                .SOAServiceVersion(serviceVersion, serviceName)
                .SOAServiceTimeout(serviceTimeOut, serviceName)
                .SOAAlertelapsed(alertElapsed, serviceName)
                .SOAAlertfailure(alertFailure, serviceName);
            container.SOAProvider<HelloWorldService.Iface>(serviceName, service);//註冊服務
        }

有人說,你這代碼更多了,這算對1.0版的退化

其一、並不是每個服務都有那麼多個性化的配置,提供必須參數的簡單api提高使用體驗

其二、配置多元化了,代碼配置不再是不二選擇,必須寫的代碼更少了

  二、日誌配置 1、日誌配置是本次升級的主要內容之一 一個容器擴展方法SOALog就可以搞所有SOA的日誌記錄,增加日誌後的代碼如下:
        static void Main(string[] args)
        {
            IContainer container = _container = new SimpleContainer()
                .SOALoadSettings()//載入appSettings配置
                .SOALog();//開啟所有日誌
            CreateHelloWorld(container);//HelloWorld服務
            Console.ReadLine();
        }

2、開啟日誌預設效果如下:

這是我本地15號至今一直在跑的本地測試服務,日誌文件稍微有點大,但是日誌性能還是比較可靠的,全日誌下幾乎不影響高併發的執行耗時 預設按天分文件,當然也可以不記錄文件,輸出到控制台或者資料庫等,這樣的話就要配置了,配置一個日誌工廠到容器中,超出本文範疇不再展開   3、能不能其開啟部分日誌 當然可以,提供了一堆日誌配置方法(容器擴展方法),SOALog只是他們的總司令而已 呵呵,這麼多款日誌配置,總有一款適合你。   三、1.1版客戶端的例子 1、直接上代碼(nuget安裝引用同服務端)
    public class HelloWorldTest
    {
        static IContainer _container;
        public static void Test()
        {
            IContainer container = _container = new SimpleContainer()
                .SOALoadSettings()//載入appSettings配置
                .SOALog();
            Subcribe(container);//訂閱com.fang.HelloWorld
            string str = null;
            do
            {
                str = Console.ReadLine();
                if (string.Equals(str, "Exit", StringComparison.CurrentCultureIgnoreCase))
                    return;
                Console.WriteLine("callDemo");
                CallService();//調用服務
            } while (true);
        }
        private static void Subcribe(IContainer container)
        {
            string serviceName = "com.fang.HelloWorld$Iface";//服務名
            string serviceGroup = "kg";//服務分組
            container.SOAConsumer<HelloWorldService.Iface>(serviceName, serviceGroup, zooKeeper);
        }
        private static void CallService()
        {
            if (_container == null)
                return;
            string results = null;
            using (var resource = _container.SOAService<HelloWorldService.Iface>())
            {
                if (resource == null)
                    return results;
                HelloWorldService.Iface service = resource.Service;
                if (service == null)
                {
                    Console.WriteLine("service is null");
                    return results;
                }
                else
                {
                    var socket = resource.Socket;
                    Console.WriteLine(string.Concat(socket.Host, ":", socket.Port.ToString(), "為您服務"));
                }
                try
                {
                    results = service.sayHello("Word");
                }
                catch (Exception ex)
                {
                    var socket = resource.Socket;
                    if (socket != null)
                        Console.WriteLine(string.Concat(socket.Host, ":", socket.Port.ToString(), "出錯"));
                    Console.WriteLine(ex.Message);
                }
            }
        }
    }

註:1.1客戶端還是滿滿的容器擴展方法,簡潔的Api,和服務端一樣可以使用容器配置服務的個性化的參數(這裡就不展開了)

 

2、執行效果如下:

CallService
192.168.109.166:3459為您服務
Hello word

CallService
192.168.109.166:3458為您服務
Hello word

CallService
192.168.109.166:3457為您服務
Hello word

CallService
192.168.109.166:3456為您服務
Hello word

CallService
192.168.109.166:3459為您服務
Hello word

CallService
192.168.109.166:3458為您服務
Hello word

CallService
192.168.109.166:3457為您服務
Hello word

我本地跑著4個服務,按輪詢提供服務

  五、暢想將來版本 前面基本把本次升級的內容展示出來,算是我比較滿意的版本,其性能和穩定性已經不輸java的dubbox。 但是我還想繼續優化,我在這裡也整理幾條尚未實現但是我很期待的功能 1、完全容器配置支持   就是和dubbo一樣在spring容器中配置一下就可以了 2、DI支持   把服務工廠Aop封裝為服務介面,需要使用直接從DI服務介面對象,執行方法開始獲取一個真實對象,執行方法結束回收 3、多種容錯演算法和多種負載均衡演算法可配置 待我完成手頭其他更緊急的工作,將啟動下一版本的開發    
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 每一部主機都有自己的路由表 封包到下一個路由器 下一個路由器的路由表來傳送 traceroute 查看封包在各路由的流向 一:路由表產生的類型 1.依據網路介面產生的 IP 而存在的路由: Linux 系統下的路由表是由小網域排列到大網域 [root@bird yum.repos.d]# route ...
  • 1、介紹 Keeaplived主要有兩種應用場景,一個是通過配置keepalived結合ipvs做到負載均衡(LVS+Keepalived),有此需求者可參考以往博文:http://lizhenliang.blog.51cto.com/7876557/1343734。另一個是通過自身健康檢查、資源接 ...
  • linux系統基本原則:1、由自由的單一的小程式組成,組合小程式完成負責的任務。2、一切皆文件,3、儘量避免捕獲用戶介面,也就是說用戶輸入命令後就能直接返回結果。4、配置文件保存為純文本格式。 GUI介面:圖形介面 CLI介面:命令介面,需要用戶輸入命令。 命令提示符:prompt root 管理員 ...
  • 有時候文件夾下有好多圖片什麼的,文件名稱不是統一的格式,想統一一下,於是google找到以下方法,進入要操作的目錄,按住shift鍵的同時,單擊滑鼠右鍵,你會看到在此處打開命令行視窗的字樣點擊下就進入 了DOS操作視窗了 ...
  • 任何用戶最常做的事要數創建和編輯文件,包括文檔、報告和文字,vi(Visual Editor)是一個有效而相對簡單的全熒幕編輯,使用vi,只要記著少量基本指令,就可以開始起步,再學習其他更復 雜的指令,而系統管理員則使用vi管理和維護系統。vi是包含在SCO System V作業系統中的全熒幕編輯, ...
  • TensorFlow 這個不用多介紹了吧,大家都知道,Google的開源深度學習軟體庫,官網點這裡:https://www.tensorflow.org/ 當然這個工具官方支持裝在 Ubuntu 和 Mac OS X 上,想要在 Windows 下使用,就需要藉助 Docker 了,看了幾篇相關的 ...
  • HTTP API也有兩種操作:寫入和查詢,本文就先給大家介紹一下 InfluxDB的HTTP API的寫入操作方式。 在InfluxDB學習的上一篇文章:InfluxDB學習之InfluxDB的基本操作 中,我們提到 InfluxDB操作有三種方式,其中一種是HTTP API的方式。 HTTP AP ...
  • 1、get方式 發送頁 <form id="form1" runat="server"> <div> <a href="WebForm2.aspx?name=5">調轉到Form2</a> <asp:Button ID="button2" Text="跳轉頁面" runat="server" onc ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...