1. 程式人生 > >【總結】探索Newlife元件:服務代理利器XAgent的前世今生

【總結】探索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,其識別率相對較高。網上這個技術點的資料真心不多,後來於部落格園找到一篇博文,但是那個