【总结】探索Newlife组件:服务代理利器XAgent的前世今生
本博客所有文章分类的总目录:http://www.cnblogs.com/asxinyu/p/4288836.html
Newlife XCode组件相关文章目录:http://www.cnblogs.com/asxinyu/p/4329747.html
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组件的其他和下载可以看我的博客其他文章。
namespace XAgent
{
/// <summary>代理服务例子。自定义服务程序可参照该类实现。</summary>
class AgentService : AgentServiceBase<AgentService>
{
#region 属性
/// <summary>线程数</summary>
public override int ThreadCount { get { return ; } } /// <summary>显示名</summary>
public override string DisplayName { get { return "新生命服务代理"; } } /// <summary>描述</summary>
public override string Description { get { return "用于承载各种服务的服务代理!"; } }
#endregion #region 构造函数
/// <summary>实例化一个代理服务</summary>
public AgentService()
{
// 一般在构造函数里面指定服务名
ServiceName = "XAgent";
}
#endregion #region 核心
/// <summary>核心工作方法。调度线程会定期调用该方法</summary>
/// <param name="index">线程序号</param>
/// <returns>是否立即开始下一步工作。某些任务能达到满负荷,线程可以不做等待</returns>
public override bool Work(int index)
{
// XAgent讲开启ThreadCount个线程,0<index<ThreadCount,本函数即为每个任务线程的主函数,间隔Interval循环调用
//WriteLine("任务{0},当前时间:{1}", index, DateTime.Now); return false;
}
#endregion
}
}
【总结】探索Newlife组件:服务代理利器XAgent的前世今生的更多相关文章
- 探索解析微服务下的RabbitMQ
概览 本文主要介绍如何使用RabbitMQ消息代理来实现分布式系统之间的通信,从而促进微服务的松耦合. RabbitMQ,也被称为开源消息代理,它支持多种消息协议,并且可以部署在分布式系统上.它轻量级 ...
- Nepxion Discovery【探索】微服务企业级解决方案
Nepxion Discovery[探索]微服务企业级解决方案] Nepxion Discovery[探索]使用指南,基于Spring Cloud Greenwich版.Finchley版和Hoxto ...
- win7 64位DCOM配置(关于导出excel 配置计算机组件服务)(转)
http://blog.sina.com.cn/s/blog_9323b3a50101qrxm.html [解决方案1] 1:在服务器上安装office的Excel软件. 2:在"开始&qu ...
- 已禁用对分布式事务管理器(MSDTC)的网络访问。请使用组件服务管理工具启用 DTC 以便在 MSDTC 安全配置中进行网络访问。
今天写ASP.NET程序,在网页后台的c#代码里写了个事务,事务内部对一张表进行批量插入,对另外一张表进行查询与批量插入. 结果第二张表查询后foreach迭代操作时报错:已禁用对分布式事务管理器(M ...
- MQTT客户端与服务代理的案列
服务端,采用 Mosquitto 来转发分发消息. 客户端自己写. 服务端 启动 mosquitto (底下的命令是我自己放到环境变量里面的,通过alias 运行mosquitto) Ishallbe ...
- WIN7中组件服务中的DCOM配置找不到Microsoft Excel应用程序的解决办法
转自:http://blog.csdn.net/lploveme/article/details/8215265 在运行栏中输入命令:dcomcnfg,打开组件服务管理窗口,但是却发现找不到Micro ...
- WCF技术剖析之九:服务代理不能得到及时关闭会有什么后果?
原文:WCF技术剖析之九:服务代理不能得到及时关闭会有什么后果? 我们想对WCF具有一定了解的人都会知道:在客户端通过服务调用进行服务调用过程中,服务代理应该及时关闭.但是如果服务的代理不等得到及时的 ...
- Docker Kubernetes Service 网络服务代理模式详解
Docker Kubernetes Service 网络服务代理模式详解 Service service是实现kubernetes网络通信的一个服务 主要功能:负载均衡.网络规则分布到具体pod 注 ...
- 安装完office后 在组件服务里DCOM配置中找不到
这个主要是64位系统的问题,excel是32位的组件,所以在正常的系统组件服务里是看不到的 可以通过在运行里面输入 comexp.msc -32 来打开32位的组件服务,在里就能看到excel组件了
随机推荐
- c#dataGridView奇偶数行变色
dataGridView_Performance.RowsDefaultCellStyle.BackColor = Color.Bisque; dataGridView_Performance.Alt ...
- 特征处理(Feature Processing)
[本文链接:http://www.cnblogs.com/breezedeus/p/4109456.html,转载请注明出处] 我的博客主营地迁至github,欢迎朋友们有空去看看:http://br ...
- 百度地图API多个点聚合时,标注添加的标签label地图刷新就丢失的问题解决
当将自定义的Marker(含有Label)通过MarkerClusterer 管理的时候,当地图发生任何移动.缩放 的时候,Marker 的Label 就会自动消失. 这个问题主要是由于百度的点聚合A ...
- selenium 富文本框处理
selenium 富文本框处理, 网上有用API的解决方法1:参见:http://blog.csdn.net/xc5683/article/details/8963621 群里1位群友的解决方法2:参 ...
- 第十章 PageRank——Google的民主表决式网页排名技术
搜索引擎的结果取决于两组信息:网页的质量信息,这个查询与每个网页的相关性信息.这里,我们介绍前一个. 1.PageRank算法原理 算法的原理很简单,在互联网上,如果一个网页被很多其他网页所链接,说明 ...
- centos 搭建ftp服务器
1.安装vsftpd sudo yum install vsftpd 2.配置vsftpd.conf # Allow anonymous FTP? (Beware - allowed by defau ...
- STC12C5A60S2笔记1(管脚定义)
STC12C5A60S2管脚定义 管脚1:标准IO口P1.0.ADC0 模数转换通道0.CLKOUT2 波特率发生器的时钟输出 管脚2:标准IO口P1.1.ADC1 模数转换通道1 管脚3:标准IO口 ...
- Android和Linux应用综合对比分析
原文地址:http://www.cnblogs.com/beer/p/3325242.html 免责声明: 当时写完这篇调查报告,给同事看了后,他觉得蛮喜欢,然后想把这篇文章修改一下,然后往期刊上发表 ...
- Android setTag方法的key问题
android在设计View类时,为了能储存一些辅助信息,设计一个一个setTag/getTag的方法.这让我想起在Winform设计中每个Control同样存在一个Tag. 今天要说的是我最近学习a ...
- Unity3D使用经验总结 优点篇
09年还在和其它小伙伴开发引擎的时候,Unity3D就初露头角. 当时就对这种基于组件式的设计结构很不理解. 觉得拆分过于细致,同时影响效率. 而时至今日,UNITY3D已经成为了众多团队的首选3D引 ...