`

基于xmlrpc的远程控制管理

阅读更多

此文转自:http://hellohank.iteye.com/blog/773894

前段时间在做一个日终系统(统一管理所有客户端系统中各定时任务的一个系统)时,实现了其中一个远程管理客户端程序运行状态的模块。这里写出来与大家共享,如有不足之处,希望大家指出共同探讨完善!
在这个远程控制的模块中,对其的基本的需求如下:
· 启动/终止等远程客户端系统中指定的程序;
· 请求要异步,不能占用服务端系统(即日终系统)的资源,即启动客户端程序之后,就与客户端断开连接,让客户端自己运行;
· 可以随时查看指定客户端的指定程序的运行状态,便于监控;
· 如果客户端程序有发生线程死琐、无法连接服务等环境异常时,能够自动预警(即实时监控);
· 程序执行过程中(包括执行成功后)各种对应的状态可以返回到服务端;

根据上面的需求,首先想到的是这个模块的结构将是服务器/客户端模式。考虑使用这种模式的设计,则接下来应该考虑选择什么样的远程方式。当然,如果自己实现一个远程连接功能,小弟自认为能力还不足,呵呵,所以不得不从现有的远程连接方式中选择一个作为自己远程连接的基础。
在对比各种远程方式的对比中,我发现两种远程技术满足我的要求(可以用于异构系统间、调用方式灵活、使用上可以无限扩展):xmlrpc和JMX。
再继续对比这两种技术的优缺点:
优点:
 xmlrpc:配置简单、使用方便;
 JMX:JDK中自带的,因此不需要第三方jar包支持即可使用;同时也可以动态加载/卸载客户端bean(这是我最想要的功能)
缺点:
 xmlrpc:需要第三方jar包支持;
 JMX:需要服务端开通相应的端口支持,因此可能会存在很大的安全隐患;
对比上面主要、简单的优缺点之后,考虑到在企业应用中安全问题往往是占优先位置的,而且最主要的是,JMX在企业应用的发布时,需要开端口,这个过程挺痛苦的。因此,这里不得不摒弃JMX(虽然我也用JMX验证并实现了整个模块的控制功能)。
在选择了xmlrpc为远程连接的工具之后,就着手设计整个结构了:

整体设计
从使用角度来划分其总体设计:先在服务端发起一个操作请求,传输到客户端,客户端作相应的响应,然后将操作的最终结果返回服务端,便于服务端的后续操作。在额外的角度来说,还有一个实时监控功能。从这里来看,由于在请求方面来说,服务端与客户端都相互有信息传递的功能,因此,这里的整体分为三个模块:服务端——公共端——客户端。
其总体设计的UML图如下:

 

 

在上图中,灰色表示服务端的系统(即日终系统)、深蓝色表示服务端模块、淡黄色表示公共模块、桔黄色表示客户端模块、青色表示客户端系统。其中,灰色和青色是在具体使用时的结合部分。真正的该远程控制模块的部分为:深蓝色、淡黄色和桔黄色。

详细设计
服务端模块
在服务端模块中主要的功能是主动发起请求与实时监控!这两个类分别是OssXmlrpcClientFactory、OssListenClientStatusExcutor。
OssXmlrpcClientFactory类主要是提供对客户端操作的主要一些接口,当然,也有方便扩展的接口。
在上面的代码中,其方法中主要提供了常用的操作!再看监听程序:OssListenClientStatusExcutor。从其中的代码(见附件中的代码)也可以看出,这里是监控指定的客户端系统中指定的方法。
客户端模块
在客户端需要说明客户端受控程序遵守的规则,即需要继承OssXmlClientSupport类,表示该类接受服务端的控制,也就是相当于接受协议一样,这样可以防止一些不愿意被控制的类也被误控!
为了将程序执行的状态返回到服务端,客户端需要一个执行回返状态的功能类:ConnectServerExcutor。
这两个类的详细功能请参考代码!
公共模块
除了上面两个模块所说的功能以外,其余的功能(如:线程管理、远程连接响应处理等)都属于公共模块中内容,这一模块在客户端/服务端都需要!
在这个模块中,重要的类有如下:
· OssXmlrpcRemoteExcutor。这是远程响应的类。
· OssXmlrpcServlet。这是初始化OssXmlrpcRemoteExcutor到xmlrpc的环境中以及将每次远程请求转为单例模式。xmlrpc执行时是需要将被调用的类的信息存放到它的容器中,这里有比较详细的说明:http://former.iteye.com/blog/223673,我这里因为只需要通过OssXmlrpcRemoteExcutor作为“网关”,因此我因需要将它加入到xmlrpc中即可,其关键代码如下:

Java代码 复制代码
  1. mapping.load(Thread.currentThread().getContextClassLoader(), getDefaultProps());   
  2. ……   
  3.      /**  
  4.   * 将提供服务的类,从系统中加载进来  
  5.   */  
  6.  protected Properties getDefaultProps() {   
  7.   Properties props = new Properties();   
  8.   props.put(OssXmlrpcRemoteExcutor.class.getSimpleName(), OssXmlrpcRemoteExcutor.class.getName());   
  9.   return props;   
  10.  }  
mapping.load(Thread.currentThread().getContextClassLoader(), getDefaultProps());
……
     /**
  * 将提供服务的类,从系统中加载进来
  */
 protected Properties getDefaultProps() {
  Properties props = new Properties();
  props.put(OssXmlrpcRemoteExcutor.class.getSimpleName(), OssXmlrpcRemoteExcutor.class.getName());
  return props;
 }

 

使用说明
服务端系统
1、环境配置
· 加载xmlrpc的三个jar包。
· 服务端需要实现:OssXmlrpcRemoteResponse接口的类。如果不是Spring容器的话,需要重新实现FindInstanceClass接口并在OssXmlrpcUtils中重新指定。
· 由于需要接受客户端传递回来的请求,因此需要在web.xml中配置如下:

Xml代码 复制代码
  1. <servlet>  
  2.  <servlet-name>XmlRpcServlet</servlet-name>  
  3.  <servlet-class>com.cloudtech.xmlrpc.common.OssXmlrpcServlet   
  4.  </servlet-class>  
  5. </servlet>  
  6. <servlet-mapping>  
  7.  <servlet-name>XmlRpcServlet</servlet-name>  
  8.  <url-pattern>/xmlrpc</url-pattern>  
  9. </servlet-mapping>  
 <servlet>
  <servlet-name>XmlRpcServlet</servlet-name>
  <servlet-class>com.cloudtech.xmlrpc.common.OssXmlrpcServlet
  </servlet-class>
 </servlet>
 <servlet-mapping>
  <servlet-name>XmlRpcServlet</servlet-name>
  <url-pattern>/xmlrpc</url-pattern>
 </servlet-mapping>

 
2、初始化
这里的初始化其实是初始化两个内容:远程连接的连接配置信息,即xmlrpc远程配置信息;监听程序。具体的初始化方式示例如下:

Java代码 复制代码
  1. import java.net.URL;   
  2.   
  3. import org.apache.xmlrpc.client.XmlRpcClientConfigImpl;   
  4.   
  5. import com.cloudtech.xmlrpc.common.OssXmlrpcPoolManager;   
  6. import com.cloudtech.xmlrpc.server.OssListenClientStatusExcutor;   
  7.   
  8. public class OssXmlrpcRemoteInit {   
  9.     public void init() {   
  10.         // TODO 如果不希望影响系统启动速度,可以启用新线程执行下面的过程   
  11.         initRemote();   
  12.         initListener();   
  13.     }   
  14.   
  15.     /**  
  16.      * 初始化监听器  
  17.      */  
  18.     protected void initListener() {   
  19.         // TODO 先初始化需要监听的程序,这里就不实现了   
  20.         OssListenClientStatusExcutor.startListen();   
  21.     }   
  22.   
  23.     /**  
  24.      * 初始化远程连接。  
  25.      */  
  26.     protected void initRemote() {   
  27.         XmlRpcClientConfigImpl config = new XmlRpcClientConfigImpl();   
  28.         try {   
  29.             // 连接到客户端。   
  30.             config.setServerURL(new URL("http://tfc.vemic.com:8081/xmlrpc"));// 这里是客户端的xmlrpc配置   
  31.             config.setEnabledForExtensions(true);   
  32.             config.setEnabledForExceptions(true);   
  33.             config.setBasicEncoding("GBK");   
  34.             config.setConnectionTimeout(30000);   
  35.             config.setContentLengthOptional(false);   
  36.             config.setReplyTimeout(0);   
  37.             OssXmlrpcPoolManager.createXmlRpcClient("localhost", config);// 这是连接池管理类。   
  38.         } catch (Exception e) {   
  39.             e.printStackTrace();   
  40.         }   
  41.     }   
  42. }  
import java.net.URL;

import org.apache.xmlrpc.client.XmlRpcClientConfigImpl;

import com.cloudtech.xmlrpc.common.OssXmlrpcPoolManager;
import com.cloudtech.xmlrpc.server.OssListenClientStatusExcutor;

public class OssXmlrpcRemoteInit {
	public void init() {
		// TODO 如果不希望影响系统启动速度,可以启用新线程执行下面的过程
		initRemote();
		initListener();
	}

	/**
	 * 初始化监听器
	 */
	protected void initListener() {
		// TODO 先初始化需要监听的程序,这里就不实现了
		OssListenClientStatusExcutor.startListen();
	}

	/**
	 * 初始化远程连接。
	 */
	protected void initRemote() {
		XmlRpcClientConfigImpl config = new XmlRpcClientConfigImpl();
		try {
			// 连接到客户端。
			config.setServerURL(new URL("http://tfc.vemic.com:8081/xmlrpc"));// 这里是客户端的xmlrpc配置
			config.setEnabledForExtensions(true);
			config.setEnabledForExceptions(true);
			config.setBasicEncoding("GBK");
			config.setConnectionTimeout(30000);
			config.setContentLengthOptional(false);
			config.setReplyTimeout(0);
			OssXmlrpcPoolManager.createXmlRpcClient("localhost", config);// 这是连接池管理类。
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

 
客户端系统
1、环境配置
· 加载xmlrpc三个jar包。
· 加载远程控制模块的公共模块包、客户端模块包。
· 由于需要被服务端连接操作,因此需要对外提供xmlrpc远程服务,因此需要在web.xml中配置如下:
 

Java代码 复制代码
  1. <servlet>   
  2.   <servlet-name>XmlRpcServlet</servlet-name>   
  3.   <servlet-class>com.cloudtech.xmlrpc.common.OssXmlrpcServlet   
  4.   </servlet-class>   
  5.  </servlet>   
  6.  <servlet-mapping>   
  7.   <servlet-name>XmlRpcServlet</servlet-name>   
  8.   <url-pattern>/xmlrpc</url-pattern><!-- 注意这里的配置与上面的代码的客户端连接的对应关系 -->   
  9.  </servlet-mapping>  
<servlet>
  <servlet-name>XmlRpcServlet</servlet-name>
  <servlet-class>com.cloudtech.xmlrpc.common.OssXmlrpcServlet
  </servlet-class>
 </servlet>
 <servlet-mapping>
  <servlet-name>XmlRpcServlet</servlet-name>
  <url-pattern>/xmlrpc</url-pattern><!-- 注意这里的配置与上面的代码的客户端连接的对应关系 -->
 </servlet-mapping>

 
· 为了将执行的状态返回到服务端,这里还需要配置ConnectServerExcutor类到系统环境中(如果该类中的默认值与服务端的配置是一致的,则倒可以不需要配置),其配置示例:
 

Xml代码 复制代码
  1. <bean class="com.cloudtech.xmlrpc.client.ConnectServerExcutor">  
  2.  <property name="serverURL" value="http://tfc.vemic.com/xmlrpc" />  
  3. </bean>  
 <bean class="com.cloudtech.xmlrpc.client.ConnectServerExcutor">
  <property name="serverURL" value="http://tfc.vemic.com/xmlrpc" />
 </bean>

2、编写代码
接下来就可以使用它的控制功能了:

Java代码 复制代码
  1. import org.springframework.stereotype.Service;   
  2.   
  3. import com.cloudtech.xmlrpc.client.OssXmlClientSupport;   
  4.   
  5. @Service  
  6. public class OssTriggerDemo extends OssXmlClientSupport {//注意这里继承了OssXmlClientSupport   
  7.  public void execute() {   
  8.   System.err.println("executeDemo...");   
  9.   for (int i = 1true; i++) {   
  10.    System.out.println("第" + i + "次循环!");   
  11.    try {   
  12.     Thread.sleep(100);   
  13.    } catch (InterruptedException e) {   
  14.     e.printStackTrace();   
  15.    }   
  16.   }   
  17.  }   
  18. }  
import org.springframework.stereotype.Service;

import com.cloudtech.xmlrpc.client.OssXmlClientSupport;

@Service
public class OssTriggerDemo extends OssXmlClientSupport {//注意这里继承了OssXmlClientSupport
 public void execute() {
  System.err.println("executeDemo...");
  for (int i = 1; true; i++) {
   System.out.println("第" + i + "次循环!");
   try {
    Thread.sleep(100);
   } catch (InterruptedException e) {
    e.printStackTrace();
   }
  }
 }
}

 注意:上面的@Service是使用Spring的注解将该类扫描到Spring容器中去,这样“网关”类OssXmlrpcRemoteExcutor就可以通过Spring获取到该类。
3、控制演示
在服务端,发起控制请求:

Java代码 复制代码
  1. public void testRemote() {   
  2.  try {   
  3.   OssXmlrpcClientFactory.execute("localhost""OssTriggerDemo.execute");   
  4.  } catch (OssXmlrpcException e) {   
  5.   e.printStackTrace();   
  6.  }   
  7. }  
 public void testRemote() {
  try {
   OssXmlrpcClientFactory.execute("localhost", "OssTriggerDemo.execute");
  } catch (OssXmlrpcException e) {
   e.printStackTrace();
  }
 }

 
说明
· 如果需要认证,则可以在OssXmlrpcServlet、ConnectServerExcutor有对应的用户名、密码设置。
· 客户端受控的类需要加载到环境中,或者,可以重新实现接口FindInstanceClass来获取到指定类的实例化。

结语
· 这是一开始的雏形,现在应用于公司的日终系统中之后,有些地方已经完善过了,具体改的地方也不记得了……
· 由于能力有限,写出的也点这个水平了,希望大家能够给出建议完善它!

分享到:
评论

相关推荐

    xmlrpc基于xml rpc实现源代码

    XMLRPC因其简单性和易用性,在许多应用场景中得到了广泛应用,如在Web服务、设备控制、分布式系统通信等方面。对于需要在不同语言和系统之间实现简单、快速通信的开发者来说,XMLRPC-C是一个值得考虑的工具。

    xmlrpc简单示例

    3. **软件集成**:在多软件协同工作的场景下,XMLRPC可作为不同软件间交互的桥梁,例如,一个项目管理工具通过XMLRPC调用版本控制系统获取代码变更信息。 4. **API接口**:提供公开的API接口时,开发者可以选择...

    xmlRpc应用

    3. 远程控制:例如,通过XML-RPC可以实现对博客系统、CMS内容管理系统或其他远程应用的远程控制。 4. 分布式计算:在分布式系统中,XML-RPC可以用于节点间的通信,实现任务分发、状态同步等功能。 三、XML-RPC实现...

    XmlRpc+Spring+Hibernate系统(源码)

    XmlRpc+Spring+Hibernate系统是一种基于Java的分布式应用程序开发架构,它将三种强大的技术整合在一起,以实现高效、灵活和可扩展的后端服务。在这个系统中,XML-RPC(远程过程调用)用于跨网络通信,Spring框架提供...

    Python-PyRat基于pythonXmlRPC完成的远控开源项目

    总的来说,Python PyRat项目是一个利用Python的XmlRPC库进行远程控制的实践案例,它展示了如何通过网络实现跨设备的命令执行和资源管理。对于想要学习网络编程和远程控制技术的Python开发者来说,这是一个非常有价值...

    python3-xmlrpc-ssl-basic-auth:具有SSL和基本身份验证的线程化Python 3 XML RPC服务器

    在"python3-xmlrpc-ssl-basic-auth"项目中,我们关注的是一个特化的实现,它包含了SSL(Secure Sockets Layer)加密以及HTTP的基本身份验证,以增强服务器的安全性和访问控制。 首先,让我们了解XML RPC的基本概念...

    rtorrent.py:rtorrent_xmlrpc 的简单包装器,可轻松使用 rtorrent 进行基本操作

    它通过 XMLRPC 接口与其他程序进行通信,允许远程控制和脚本化操作。XMLRPC 是一种轻量级的远程过程调用协议,它使用 HTTP 作为传输协议,XML 作为编码格式。 `rtorrent.py` 的主要作用就是封装这个 XMLRPC 通信...

    odoo_xmlrpc_node_red:使用Node-RED测试Node JS odoo_xmlrpc

    综上所述,这个项目的核心在于利用 Node-RED 创建一个图形化的流程,通过 Node.js 的 XML-RPC 客户端与 Odoo 系统交互,实现对 Odoo 的自动化管理和控制。通过学习和理解这些知识点,你可以更好地理解和使用该项目,...

    xmlrpc-jukebox-开源

    XMLRPC-Jukebox是一个开源项目,它提供了一个可扩展的自动点唱机系统,利用XML-RPC(远程过程调用)技术实现不同组件之间的通信。XMLRPC是一种简单、轻量级的网络通信协议,允许程序在不同的网络环境或操作系统之间...

    使用 XML-RPC 为 C++ 应用程序启用 Web 服务

    | 接口设计 | 消息特定的处理控制 | 简单明了的调用/响应 | 基于资源和状态 | | 开发难度 | 高 | 低 | 中等 | **使用 XML-RPC 为 C++ 应用程序启用 Web 服务的步骤** 1. **选择库**:选择一个合适的 XML-RPC 库,...

    astitray-开源

    "astitray-开源"是一款基于XMLRPC框架的桌面应用工具,主要功能是实现自动拨号,通过一个托盘图标来便捷地管理电话系统。这款软件的独特之处在于它结合了两个独立的工具,使得操作更加简便高效。 首先,我们要了解...

    amt.py:使用命令行控制 Intel AMT 9.0 远程机器的简单 python 脚本

    标题中的“amt.py”是一个基于Python编写的脚本,用于通过命令行接口远程控制配备了Intel AMT(主动管理技术)9.0的设备。Intel AMT是一种嵌入在硬件中的远程管理技术,允许管理员在操作系统关闭、挂起或未启动的...

    raj-开源

    总的来说,raj-开源项目是一个强大且灵活的远程管理工具,利用XMLRPC技术实现了跨平台的远程控制,同时,开源社区的支持使得项目持续进化,满足不断变化的技术需求。对于那些需要高效远程管理存储设备的开发者和IT...

    audiowidgets-core_2.11-1.6.1.zip

    4. **Git分支管理**:"master" 分支是Git版本控制系统中的默认分支,通常用于存放项目的主要开发代码。开发者可以创建其他分支进行新功能的开发或修复错误,然后合并回master以保持主分支的稳定性。 5. **构建与...

    WordPress.v2.3.1.Simp.Chinese

    2. **xmlrpc.php**:这是一个远程发布协议文件,允许用户通过支持XML-RPC的第三方应用程序(如微软的Word)来发布或编辑博客文章,实现了远程控制和管理博客的功能。 3. **wp-app.php**:这个文件在较早版本的...

    UCHome二次开发参考手册

    - **/xmlrpc.php:** XML-RPC服务端点,调用`/source/class_xmlrpc.php`进行处理,支持远程过程调用协议。 以上是对UCHome文件系统结构及其主要文件功能的详细介绍。通过对这些文件的理解和掌握,开发者能够更好地...

    joomla1.5

    XML-RPC 允许不同平台上的应用进行远程过程调用,Joomla 1.5 提供了 XML-RPC 支持,使得网站可以与其他支持该协议的服务交互,如博客发布、内容同步等。 5. **INSTALL.php** - 这是 Joomla 安装过程的关键文件,它...

    3.0 XML-RPC 官方示例+源码+官网地址资料.rar

    XML-RPC(XML Remote Procedure Call)是一种通过网络调用远程服务器上的函数或方法的技术,它使用XML作为数据交换格式,并基于HTTP协议进行通信。在3.0版本中,XML-RPC进一步提升了性能和安全性,使其成为分布式...

    Joomla 1.5.15

    10. **xmlrpc**:XML-RPC服务,允许远程调用Joomla站点的方法,如WordPress的pingback和trackback功能。 **四、安全与升级** Joomla 1.5.15虽然稳定,但随着时间推移,可能会出现安全漏洞。用户应及时关注官方的...

Global site tag (gtag.js) - Google Analytics