本博客所有文章分类的总目录: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的前世今生的更多相关文章

  1. 探索解析微服务下的RabbitMQ

    概览 本文主要介绍如何使用RabbitMQ消息代理来实现分布式系统之间的通信,从而促进微服务的松耦合. RabbitMQ,也被称为开源消息代理,它支持多种消息协议,并且可以部署在分布式系统上.它轻量级 ...

  2. Nepxion Discovery【探索】微服务企业级解决方案

    Nepxion Discovery[探索]微服务企业级解决方案] Nepxion Discovery[探索]使用指南,基于Spring Cloud Greenwich版.Finchley版和Hoxto ...

  3. win7 64位DCOM配置(关于导出excel 配置计算机组件服务)(转)

    http://blog.sina.com.cn/s/blog_9323b3a50101qrxm.html [解决方案1] 1:在服务器上安装office的Excel软件. 2:在"开始&qu ...

  4. 已禁用对分布式事务管理器(MSDTC)的网络访问。请使用组件服务管理工具启用 DTC 以便在 MSDTC 安全配置中进行网络访问。

    今天写ASP.NET程序,在网页后台的c#代码里写了个事务,事务内部对一张表进行批量插入,对另外一张表进行查询与批量插入. 结果第二张表查询后foreach迭代操作时报错:已禁用对分布式事务管理器(M ...

  5. MQTT客户端与服务代理的案列

    服务端,采用 Mosquitto 来转发分发消息. 客户端自己写. 服务端 启动 mosquitto (底下的命令是我自己放到环境变量里面的,通过alias 运行mosquitto) Ishallbe ...

  6. WIN7中组件服务中的DCOM配置找不到Microsoft Excel应用程序的解决办法

    转自:http://blog.csdn.net/lploveme/article/details/8215265 在运行栏中输入命令:dcomcnfg,打开组件服务管理窗口,但是却发现找不到Micro ...

  7. WCF技术剖析之九:服务代理不能得到及时关闭会有什么后果?

    原文:WCF技术剖析之九:服务代理不能得到及时关闭会有什么后果? 我们想对WCF具有一定了解的人都会知道:在客户端通过服务调用进行服务调用过程中,服务代理应该及时关闭.但是如果服务的代理不等得到及时的 ...

  8. Docker Kubernetes Service 网络服务代理模式详解

    Docker Kubernetes  Service 网络服务代理模式详解 Service service是实现kubernetes网络通信的一个服务 主要功能:负载均衡.网络规则分布到具体pod 注 ...

  9. 安装完office后 在组件服务里DCOM配置中找不到

    这个主要是64位系统的问题,excel是32位的组件,所以在正常的系统组件服务里是看不到的 可以通过在运行里面输入 comexp.msc -32 来打开32位的组件服务,在里就能看到excel组件了

随机推荐

  1. SQL之DDL

    DDL是SQL定义语言,它主要包括三个关键字:create  ,alter , drop(数据库关键字不分大小写 ),主要操作对象 有数据库.表.索引.视图等 操作                   ...

  2. mingw编译rtmp库

    下载rtmpdump-2.4 进到里面的librtmp目录下面,执行命令:make SYS=mingw CRYPTO= 这样就编译成功静态库和动态库,如何安装到/usr/local/下面? 执行命令: ...

  3. Struts2中获取servlet API的几种方式

    struts2是一个全新的MVC框架,如今被广大的企业和开发者所使用,它的功能非常强大.这给我们在使用servlet 纯java代码写项目的时候带来了福音.但是一般来说,我们的项目不到一定规模并不需要 ...

  4. CentOS7 bonding配置

    操作系统:CentOS Linux release 7.1.1503 (Core) 网卡适配器: eno1.eno2 bonding类型:mode=1 (active-backup),主-备份策略 网 ...

  5. linux配置java环境变量(详细) -copy

    一. 解压安装jdk 在shell终端下进入jdk-6u14-linux-i586.bin文件所在目录, 执行命令 ./jdk-6u14-linux-i586.bin 这时会出现一段协议,连继敲回车, ...

  6. [转]phoneGap3.0安装步骤(以windows下的android环境为例):

    phoneGap3.0安装步骤(以windows下的android环境为例): 环境: WIN系统,JDK,Android,Eclipse,Ant,Git,PhoneGap3.x (Cordova) ...

  7. 配置WCF同时支持WSDL和REST,swaggerwcf生成文档

    配置WCF同时支持WSDL和REST,SwaggerWCF生成文档 VS创建一个WCF工程,通过NuGet添加SwaggerWcf 创建完成后通过 程序包管理控制台 pm>Install-Pac ...

  8. [Asp.net 开发系列之SignalR篇]专题五:SignalR支持的平台

    SignalR支持多种服务器和客户端配置.此外,每种传输方式都有自身的要求限制:如果某种传输方式不被系统支持,SignalR能够优雅地将故障转移到其他类型的传输方式.关于SignalR所支持的传输方式 ...

  9. 使用阿里云负载均衡遭遇的http重定向https的问题

    昨天解决了在阿里云负载均衡上部署https证书的问题(详见一个空行引起的阿里云负载均衡上部署https证书的问题),并完成了部署,负载均衡的监听配置是这样的: 用户与负载均衡之间走https协议,负载 ...

  10. angular.js 例子

    angular.js是一个前端的MVC框架,12年的时候曾近在一个portal平台的项目中使用过. 下面给出一个angular.js的典型例子,涵盖一些基础的知识点,用以复习备忘: <html ...