【總結】探索Newlife元件:服務代理利器XAgent的前世今生
XAgent是新生命開發團隊X元件的其中一個專案,石頭今天在群裡揭開了其神祕的面紗,很多的不懂和不解,總結成此文,以備後用。
1.XAgent的基本介紹
1.1 XAgent的來源
XAgent是一個服務代理程式,它出現的初衷,是為了解決寫Windows服務不方便的問題。因為用Visual Stuido寫的Windows服務程式,需要建立一個特殊的專案,安裝的時候還需要特殊的命令,所以對新手來說,非常繁瑣,跟令人討厭的是不好除錯(也許你有好的方法,但是要讓更多人,短時間掌握是有難度的)。試問,多少人會去掛載一個Windows服務程序進行除錯麼?所以,XAgent橫空出世!所謂Windows服務程式,一點也不特別,完完全全就是一個exe。
1.2 第一代XAgent
一個普通的應用程式,比如WinForm也可以做服務程式。XAgent是一個控制檯寫的exe程式,只不過它繼承了Service類。控制器啟動這個類,再用sc命令安裝到服務裡面,這樣服務就可以很好的工作了。XAgent開頭就檢查引數,如果這個exe附帶了引數,就進行特殊操作;如果沒有引數,就啟動一個選單;沒有引數的時候,就顯示如下這個介面:
2,4,5很重要。其中-i引數,就表示安裝服務。有2種安裝方式,1種是命令列 Test.exe -i;另一種是先啟動Test.exe,然後按2鍵。按2以後,是下面這個樣子:
-i就可以把當前exe安裝到服務裡面,Test.exe -run,帶有引數,這樣子,Windows服務啟動 的時候,其實是帶有-run引數的。3就是啟動了,所以,用XAgent,根本就不需要寫安裝解除安裝的指令碼命令。重點看看4,5點功能:
XAgent的設計中,有一個大大的StartWork/StopWork,代表服務的開始和停止,迴圈除錯呼叫的就是它們。StartWork裡面開一個執行緒,定時呼叫Work(index)函式,單步除錯就是呼叫Work,所以支援輪詢式服務;如果用4,就呼叫一次work,相當於執行一次輪詢。這樣就很方便我們除錯程式碼了,因為現在是控制檯狀態,而業務程式碼在work裡面。所以業務程式碼可以供多個方面使用:
1.控制檯呼叫
2.Windows服務呼叫
3.除錯呼叫
在XAgent裡面,只要你在控制檯下除錯業務程式碼沒有問題,到了Windows服務裡面,也沒有問題,這就是第一代XAgent。
2.第二代XAgent
XAgent可以掛載無數個Windows服務,也就是它註冊成為一個Windows服務程式,但是裡面可以含有很多個服務。第一代XAgent很爛,但有很重要的意義。第二代XAgent,每個服務有自己的StartWork/Work(index)/StopWork。然後XAgent會啟動一個管理執行緒,擁有最高優先順序,每個服務的迴圈都有一個邏輯執行緒,普通優先順序,管理執行緒會實時監控每一個工作執行緒的資源狀況,以及整個服務程式的資源狀況。配置檔案有監控指標:
如果工作執行緒超過時間沒有向管理執行緒彙報,那麼管理執行緒會把它幹掉,重新啟動XAgent.MaxActive,如果佔用記憶體、執行緒數過高,XAgent乾脆讓整個服務重啟XAgent.AutoRestart是自動重啟時間;XAgent的重啟絕對不是簡單重啟,它重啟之前,會停止所有工作執行緒的輪詢,也就是等每個執行緒完成當前的work(index)。一次輪詢就是最小工作顆粒,只要你在這次work裡面做好你的事情,就不會造成資料丟失。管理執行緒等所有執行緒的work完成了才會真正重啟服務的,這是一個最高優先順序的排程,避免有的工作執行緒開小灶,自己開執行緒不受管制,XAgent.AutoRestart就是定時重啟的功能。理論上,99.9%的服務程式,只要每天得到重啟一次,就可以無限的工作下去。
3.第三代XAgent
第二代XAgent還是不夠完美,從第三代開始,加上了“看門狗”功能。看下圖:
雙服務或者多個服務互相監視,每一個用XAgent做的服務程式都帶有這個功能,真正的產品裡面,最少用兩個Windows服務,分為AB兩個,A的看門狗監視B,B的看門狗監視A,誰也不會死;如果環境過於惡劣,你不妨多開幾個小夥伴;XAgent的看門狗有漏洞,那就是,AB互相監視以後,誰也滅不了它……,你必須趕在另一個啟動它之前把兩個程序都幹掉。其實可以開個小門的,發現特殊通道進去的就退出,不要監視,禁用也不行,XAgent會重新把它啟用,這樣子,用XAgent寫的程式,就有了不死之身,所以我說XAgent是網路程式的最佳搭檔。
XAgent修改架構,從DLL變成了Exe,因為XAgent已經很成熟,沒有什麼必要擴充套件了。我們要寫Windows服務的時候,只需要建立一個類,實現IService介面,這個介面在核心庫裡面,然後在XAgent配置檔案配置一下,XAgent就會載入你的服務類,直接啟動,我們自己根本就不用寫exe專案。比如我們做一個網站,突然要用到一個很小的功能,需要Windows服務,這個時候,我們乾脆在業務類庫裡面加上一個實現了IService的類,配置好XAgent,XAgent就可以安裝Windows服務了,這就是第三代XAgent。
4.總結
1.它自身是控制檯程式,可以註冊成為Windows服務,但是,它帶有WinForm類,可以在登入使用者的右下角有個小圖示,使用者可以通過它撥出一個WinForm設定介面,然後你就可以做你想做的事情。
2.XAgent在實現一個簡單的HttpServer,支援使用者通過瀏覽器訪問控制服務,不支援ASP.Net,但是支援XTemplate;有了這個HttpServer,XAgent就可以分散式協同排程了。
看一段示例程式碼吧,關於X元件的其他和下載可以看我的部落格其他文章。
1 namespace XAgent 2 { 3 /// <summary>代理服務例子。自定義服務程式可參照該類實現。</summary> 4 class AgentService : AgentServiceBase<AgentService> 5 { 6 #region 屬性 7 /// <summary>執行緒數</summary> 8 public override int ThreadCount { get { return 2; } } 9 10 /// <summary>顯示名</summary> 11 public override string DisplayName { get { return "新生命服務代理"; } } 12 13 /// <summary>描述</summary> 14 public override string Description { get { return "用於承載各種服務的服務代理!"; } } 15 #endregion 16 17 #region 建構函式 18 /// <summary>例項化一個代理服務</summary> 19 public AgentService() 20 { 21 // 一般在建構函式裡面指定服務名 22 ServiceName = "XAgent"; 23 } 24 #endregion 25 26 #region 核心 27 /// <summary>核心工作方法。排程執行緒會定期呼叫該方法</summary> 28 /// <param name="index">執行緒序號</param> 29 /// <returns>是否立即開始下一步工作。某些任務能達到滿負荷,執行緒可以不做等待</returns> 30 public override bool Work(int index) 31 { 32 // XAgent講開啟ThreadCount個執行緒,0<index<ThreadCount,本函式即為每個任務執行緒的主函式,間隔Interval迴圈呼叫 33 //WriteLine("任務{0},當前時間:{1}", index, DateTime.Now); 34 35 return false; 36 } 37 #endregion 38 } 39 }
相關推薦
【總結】探索Newlife元件:服務代理利器XAgent的前世今生
XAgent是新生命開發團隊X元件的其中一個專案,石頭今天在群裡揭開了其神祕的面紗,很多的不懂和不解,總結成此文,以備後用。 1.XAgent的基本介紹 1.1 XAgent的來源 XAgent是一個服務代理程式,它出現的初衷,是為了解決寫Windows服務不方便的問題。因為用Visual St
【原創】探索Newlife X元件利器之:XCoder點滴[附下載]
XCode讓我一個外行業餘者轉變為一個半專業的開發人員,心懷感激,讓我把更多的精力關注在業務,而不是資料庫,儲存過程,sql,以及編寫一遍一遍的垃圾程式碼。在這裡我不對Newlife XCode做過多介紹,XCode曾經是一個輕量級ORM元件,現在XCode加上XCoder,變成了一個非常強大的資
【Kubernetes】最佳實踐3:服務部署與彈性伸縮
作者:彭靖田 在Kubernetes的世界中,一切服務都是跑在容器中的,最簡單的容器組是Pod。基於現實世界中的具體任務,Kubernetes抽象了更高階的容器組,如:ReplicaSet、Deployment、Job等。對於Web型別的長週期服務來說,重點考察兩個需求:
【SpringCloud】(五):服務註冊到Eureka Server
上篇文章我們建立了Eureka Server例項。本篇文章我們把使用者服務和電影服務註冊到Eureka Server上。(服務消費者和服務提供者) 首先我們以註冊使用者服務為整個講述核心 註冊文件,SpringCloud官網,我們定位到How to Includ
WebForm框架頁面上js修改服務端控制元件導致後臺不能正確獲取到控制元件值的問題【總結】
WebForm框架頁面上js修改服務端控制元件導致後臺不能正確獲取到控制元件值的問題 頁面程式碼 <td><span id="sp_notice_type_item">公告型別</span></td
【2】循序漸進學 Zabbix :安裝配置 Zabbix Server 服務端
use 簡單的 config .cn href 之前 zab quit 關閉 上一篇 【1】循序漸進學 Zabbix :初識與基礎依賴環境搭建( LNMP ) 安裝 Zabbix Server 上篇我們在 192.16
【日積月累】MongoDB 註冊為 Window 服務時遇到的問題總結
一、Error creating service: 名稱已用作服務名或服務顯示名。 (1078) 啟動 MongoDB 服務總是很麻煩的,因此一般通過註冊為系統服務,隨系統啟動。一般是通過配置檔案啟動,配置檔案內容: #ip繫結,限制ip訪問 bind_ip=192.168.
【譯】Consul 1.4:多資料中心服務網路
NOV 14 2018 THE CONSUL TEAM 我們很高興地宣佈HashiCorp Consul1.4 將將可廣泛使用。Consul 是一個分散式服務網格, 可用於在任何執行平臺以及公共或私有云之間的連線、安全和配置服務。此版本引入了一個完全重新設計的 ACL系統和第一個具有多資料中心支援的企業級Co
轉:【總結】推薦系統中常用算法 以及優點缺點對比
必須 根據 是把 簡單的 con upload 推薦算法 成功 這一 轉:http://www.sohu.com/a/108145158_464065 在推薦系統簡介中,我們給出了推薦系統的一般框架。很明顯,推薦方法是整個推薦系統中最核心、最關鍵的部分,很大程度上
轉:【總結】推薦系統中常用演算法 以及優點缺點對比
轉:http://www.sohu.com/a/108145158_464065 在推薦系統簡介中,我們給出了推薦系統的一般框架。很明顯,推薦方法是整個推薦系統中最核心、最關鍵的部分,很大程度上決定了推薦系統性能的優劣。目前,主要的推薦方法包括:基於內容推薦、協同過濾
【JanusGraph】第七章:JanusGraph服務
第七章:JanusGraph服務 Chapter 7. JanusGraph Server JanusGraph使用Gremlin Server作為服務元件對客戶端請求進行請求處理響應。當JanusGraph打包的時候,Gremlin Server就被稱為JanusGr
【總結】AngularJs的UI元件ui-Bootstrap
引入 <script src="/Scripts/angular.js"></script> <script src="/Scripts/ui-bootstrap-tpls-1.3.2.js"></scrip
【基於WinForm+Access區域網共享資料庫的專案總結】之篇一:WinForm開發總體概述與技術實現
【小記】:最近基於WinForm+Access資料庫完成一個法律諮詢管理系統。本系統要求類似網頁後臺管理效果,並且基於區域網內,完成多客戶端操作同一資料庫,根據許可權不同分別執行不同功能模組。核心模組為級聯統計型別管理、資料庫諮詢資料扇形統計、樹的操作、諮詢資料的管理、手寫分頁、Excel資料
【SpringCloud Greenwich版本】第四章:服務消費者(ribbon)
一、SpringCloud版本 本文介紹的Springboot版本為2.1.1.RELEASE,SpringCloud版本為Greenwich.RC1,JDK版本為1.8,整合環境為IntelliJ IDEA 二、Ribbon介紹 Ribbon是一個客戶端負載均衡器,它可以很好地
【SpringCloud Greenwich版本】第三章:服務消費者(Feign)
一、SpringCloud版本 本文介紹的Springboot版本為2.1.1.RELEASE,SpringCloud版本為Greenwich.RC1,JDK版本為1.8,整合環境為IntelliJ IDEA 二、Feign介紹 Feign是一個宣告式的Web服務客戶端。這使得W
【.net基礎】--DropDownList控制元件:兩級聯動
最近學習Asp.Net,發現很多控制元件都很有意思,例如:Canlender,AdRotator等。以前只知道有這樣的頁面效果,但是對這些控制元件瞭解並不多。不怕不知道,就怕不知道。
【翻譯】【總結】UGUI:實現滑鼠懸停效果的方法
翻譯自:http://answers.unity3d.com/questions/901195/ugui-on-hover.html 1.在場景中放置物體TestButton 2.為TestButton新增元件EventTrigger 3.點選Add New Event T
【VC++】(一):MFC在Picture control控制元件中顯示Bitmap
今天在《VC++指紋模式識別系統及演算法概述》一書中,看到有一段程式碼——在Picture Control中顯示Bitmap。把它的程式碼和顯示結果摘出來,作為今天的小小學習成果,鼓勵一下自己。程式碼
【基於WinForm+Access區域網共享資料庫的專案總結】之篇三:Access遠端連線資料庫和窗體打包部署
【小記】:最近基於WinForm+Access資料庫完成一個法律諮詢管理系統。本系統要求類似網頁後臺管理效果,並且基於區域網內,完成多客戶端操作同一資料庫,根據許可權不同分別執行不同功能模組。核心模組為級聯統計型別管理、資料庫諮詢資料扇形統計、樹的操作、諮詢資料的管理、手寫分頁、Excel資料
【基於WPF+OneNote+Oracle的中文圖片識別系統階段總結】之篇一:WPF常用知識以及本專案設計總結
【小記】:大膽嘗試才能突破,某個中醫藥大學有一批圖片需要處理(ORC),然後進行資料探勘。之前沒有接觸過ORC這個東西,但是還是應允了。在網上搜索一番,關於中文圖片識別,最終敲定為基於微軟的OneNote,其識別率相對較高。網上這個技術點的資料真心不多,後來於部落格園找到一篇博文,但是那個