自动的虚拟机发现和自助连接

按即插即用方式发现和连接虚拟机

在虚拟化的数据中心中,复杂设备的部署和移除需要执行多个配置步骤。在重新配置时,需要在不同虚拟机(VM)中运行的相同产品的不同组件以及不同 VM 中运行的不同产品之间建立和中断通信。过去,这个过程是手动的,操作负担很重;或者通过用静态值调用预定义脚本来完成,不太灵活。在本文中,作者建议使用 StereoCable 解决这个问题,StereoCable 为虚拟化数据中心中的复杂虚拟设备提供自动的即插即用支持。这样就可以自动地发现 VM 并根据预定义的连接策略把它们相互连接起来。

Giuseppe Ciano, Tivoli Cloud Solutions 的首席设计师, IBM

Giuseppe Ciano 于 1997 年加入 IBM,担任 Rome SWG Tivoli Lab 的软件工程师。他作为 Tivoli 组合中不同产品的开发人员和设计师工作了 11 年。他目前是 IBM Service Delivery Manager 等 Tivoli Cloud Solutions 产品的首席设计师。他还是 StereoCable 的设计师。



Maurizio Simeoni, 高级工程师,Tivoli, IBM

Maurizio Simeoni 毕业于 University of Roma "La Sapienza" 的电信工程专业。他是 IBM Rome Tivoli 的高级工程师。他目前从事 IBM Service Delivery Manager。他在开发和支持软件应用程序方面有超过 10 年经验。他对 StereoCable 的设计和开发做出了贡献。



Alessio D'Amico, IBM Tivoli Services 的 IT 架构师, IBM

Alessio D'Amico 于 1999 年加入 IBM,担任 Rome SWG Lab 的软件工程师。在他的职业生涯里,他参与过从项目管理、业务分析、设计和构建直至实现的整个项目生命周期。目前,他负责基于 Tivoli 产品组合的服务管理和云计算解决方案的设计和实现。他擅长的主要领域包括系统管理、供应、服务管理、虚拟化和云计算。



Antonio Perrone, 高级软件工程师, IBM

Antonio Perrone 于 1989 年以优异的成绩从意大利 University of Bari 的信息科学专业毕业。他于 1990 年加入 IBM,担任过多个开发和支持职位。他从 1996 年起在 IBM Tivoli 部门工作,目前担任网络性能管理方面的架构师。他感兴趣的领域包括系统管理、性能和可用性、知识表达、数据集成、事务和过程建模及软件开发。



Luigi Pichetti, 高级技术员,Tivoli,SPDA, IBM

Luigi Pichetti 是 CloudBurst 和 IBM Service Delivery Manager(用于提供服务和发挥虚拟设备优势的解决方案)的 Tivoli 架构师。他负责基于映像的安装项目,其目标是使用激活引擎和 StereoCable 等虚拟化技术高效地分发产品。Luigi 在开发和设计系统管理领域的企业应用程序方面有 19 年经验。在此之前,他曾经负责 Tivoli Configuration Manager 和 Common Inventory Technology 组件的架构团队。



Francesco Dauri, 团队负责人,TWS Test L3, IBM

Francesco Dauri 在 Information Management 部门担任 DB2 顾问一年时间,主要关注于 DB2 高可用性、数据调优和优化。他在检验团队担任了 4 年的 Tivoli Workload Scheduler 产品软件工程师。他的专长包括测试技术(CVT、IVT、SVT 等)、敏捷方法学、易用性测试技术和用户界面设计,主要关注使用 Flex 技术的富 Internet 应用程序。



2010 年 12 月 29 日

虚拟设备(appliance)是预先构建的软件解决方案,它们由一个或多个虚拟机组成,作为一个单元进行打包、更新、维护和管理。与传统的硬件设备不同,这些软件设备让客户能够轻松地购买、部署和管理预先集成的软件组合。这可以缩短实现价值的时间,简化软件的开发、分发和管理。

虚拟设备正在改变软件的分发模式,因为它们让应用程序构建者能够针对应用环境优化软件组合,向最终用户提供可立即使用的软件服务。

但是,当前的虚拟设备只包含一个虚拟机(VM),而现代的企业应用程序采用面向服务架构(SOA)其中包含多个层,每个层包含一个或多个机器。单一 VM 模型对于这种应用程序是不够的。要想以软件设备的形式分发多层的服务,就需要由多个 VM 组成的复杂的虚拟设备,其中的 VM 应该能够互操作。

例如,请考虑一个由三层组成的典型的 web 应用程序。web 层实现表示逻辑,应用服务器层实现业务逻辑,后端数据库层存储数据。简单的实现方法是把这个应用程序分为三个虚拟机,每层一个。这样,应用程序可以从占用一个物理主机的一部分扩展到占用三个物理主机。

在虚拟化数据中心中,复杂设备的部署和移除需要执行多个配置步骤,然后才能运行虚拟设备:

  1. 通过重新配置分配与 OS 相关的参数,比如 IP、主机名、密码等网络信息。
  2. 通过重新配置在以下组件和产品之间建立/中断通信:
    • 在不同虚拟机中运行的相同产品的不同组件
    • 在不同虚拟机中运行的不同产品

什么是激活引擎?

激活引擎是嵌入在虚拟设备中的软件,部署之后设备第一次引导时激活它。

在几种技术中使用这种虚拟机激活引擎概念的例子参见以下文章:

上面列表中的第一个问题由激活引擎技术解决;激活引擎是嵌入在虚拟设备中的软件,部署之后设备第一次引导时激活它。可以编写并提供激活引擎和定制插件,从而在目标系统上配置虚拟设备。

第二个问题还没有解决。目前,重新配置需要手动执行,或者通过用静态输入值调用预定义脚本来完成。我们建议通过在虚拟化数据中心中实现复杂虚拟设备的即插即用支持来解决这个问题。这样就可以自动地发现虚拟机并根据一些预定义的但比较灵活的连接策略把它们连接起来;StereoCable 对激活引擎起补充作用,可以与它同时存在。实际上,可以使用激活引擎在引导时自动地配置 StereoCable。

StereoCable 的设计原理

在讨论系统架构和工作流之前,我们先来介绍本文的关键概念 StereoCable。

定义 StereoCable

StereoCable 是一种工件,描述如何在不同虚拟机中运行的两个实体之间建立基于角色的协作关系,例如:

(PRODA_UI,PRODA_SERVER) ... (PRODA_SERVER,PRODB_SERVER) ... (PRODA_UI,PRODB_SERVER)

一个 StereoCable 工件由两部分(我们称之为角色)组成:

  • 插座角色(socket role)。插座描述一个实体为了与另一个实体建立协作关系需要提供的信息。如果在环境中给一个 VM 分配插座角色,那么它就要发布插座定义指定的信息。
  • 插头角色(plug role)。插头描述一个实体为了与另一个虚拟机中运行的另一个实体建立协作关系需要执行的操作。如果在环境中给一个 VM 分配插头角色,那么它:
    1. 在同一环境中寻找作为相应的插座的 VM
    2. 获取发布的插座信息
    3. 执行插头定义中描述的操作

为了表示 StereoCable 工件,已经定义了一个 XML 模式。清单 1 是 StereoCable 信息的示例:

清单 1. XML 格式的 StereoCable 信息
<StereoCable>
  <StereoCableID>StereoCableID1</StereoCableID>
    <Description>PRODA UI Automatic Reconfiguration</Description>
    <PlugSection>
      <Description>PRODA UI Server</Description>
      <PlugID>PRODA_UI</PlugID>
      <ConfigurationActions>
        <ConfigurationAction>
          <Description>Description</Description>
          <ID>ID</ID>
          <Trigger>Deployment</Trigger>
          <Action>
            <ActionType>script</ActionType>
            <ActionDetail>
              <ConfigurationParameters>
              	<ConfigurationParamter>
              		<ConfigurationName>host</ConfigurationName>
              	</ConfigurationParamter>
              	<ConfigurationParamter>
              		<ConfigurationName>port</ConfigurationName>
              	</ConfigurationParamter>
              	<ConfigurationParamter>
              		<ConfigurationName>name</ConfigurationName>
              	</ConfigurationParamter>
              	<ConfigurationParamter>
              		<ConfigurationName>user</ConfigurationName>
              	</ConfigurationParamter>
              </ConfigurationParameters>
              <Operation>/pino/driver4/scripts/PRODAUI.sh</Operation>
            </ActionDetail>
          </Action>
        </ConfigurationAction>
      </ConfigurationActions>
    </PlugSection>
    <SocketSection>
      <Description>PRODA Master</Description>
      <SocketID>PRODA_SERVER</SocketID>
      <PublishedParameters>
        <ConfigurationParameter>
          <ConfigurationName>host</ConfigurationName>
          <ConfigurationValue>nc125050.romelab.it.ibm.com</ConfigurationValue>
        </ConfigurationParameter>
        <ConfigurationParameter>
        	<ConfigurationName>port</ConfigurationName>
        	<ConfigurationValue>31117</ConfigurationValue>
                     </ConfigurationParameter>
        <ConfigurationParameter>
        	<ConfigurationName>name</ConfigurationName>
        	<ConfigurationValue>PRODA-istributed</ConfigurationValue>
</ConfigurationParameter>
        <ConfigurationParameter>
        	<ConfigurationName>user</ConfigurationName>
        	<ConfigurationValue>PRODA85mdm</ConfigurationValue>
</ConfigurationParameter>
      </PublishedParameters>
    </SocketSection>
</StereoCable>

StereoCable 组件

图 1 说明 StereoCable 系统的组件。

图 1. StereoCable 组件
StereoCable 组件

StereoCable 系统由以下组件组成:

  • StereoCable 引擎:它是在 VM 中装载的一个软件实体,它根据 XML 格式的 StereoCable 信息处理分配的角色。这个引擎还能够处理 VM 事件(例如部署新的 VM 或删除现有的 VM)以执行适当的配置操作。
  • StereoCable 注册表:这个存储库记录可用的插座,并在收到请求时把它们提供给插头(根据预定义的约束)。这个组件不是必需的,因为在某些厂商的虚拟化实现中 VM 可以直接发布和共享这类信息。
  • StereoCable 用户界面/命令行界面:这个软件实体用于操作 VM、插头和插座信息以及显示它们之间的关系。可以通过用户界面访问连接到 StereoCable 注册表和直接连接 VM 的信息。

(本文中提供的 StereoCable 实现支持 VMware;具体地说,支持 VMware ESX 3.5 和 vSphere 4。激活引擎使用 VMware VI SDK API 进行连接,StereoCable 注册表是 VMware VirtualCenter。支持的来宾操作系统是 SLES10。)

接下来,讨论 StereoCable 如何处理操作。


StereoCable 处理

我们看看在使用 StereoCable 时会遇到的两类处理 — 引擎启动处理和 StereoCable 的动态处理(与传统的 VM 连接发现和重新配置过程相比,StereoCable 工件具有自动化优势)。对于本节,我们认为提供一系列步骤和流程图可以更清楚、简洁地说明处理过程。

StereoCable 启动和动态处理的主要步骤

引擎启动过程要执行以下步骤:

  1. StereoCable 引擎连接注册表以获取角色和 StereoCable。如果引擎使用的协议允许的话,这个步骤可以包含注册表自动发现,例如 SLP (service discovery protocol) 允许计算机和其他设备在 LAN 中寻找服务而不需要提前配置。
  2. 获取 VM 角色和 VM 所属的环境。
  3. 获取与 VM 相关联的 StereoCable。
  4. StereoCable 引擎处理 StereoCables.xml 文件中包含的 StereoCable。
  5. 对这个 VM 禁用全部 StereoCable 功能。
  6. 对于 StereoCables.xml 中的所有插座角色,如果插座角色与 VM 角色之一相同,那么:
    1. 检查依赖性是否是 OK。如果不是,就把这个插座放在工作队列中。
    2. 获取 XML 文件中描述的插座属性。
    3. 发布插座属性。
    4. 发布信息,说明这个插座现在已经激活。
    5. 发送一个发布插座的事件。
    6. 把插座放在 StereoCable 激活表中;还指定插头要连接到的信息。
  7. 对这个 VM 启用全部 StereoCable 功能。
  8. 对于 StereoCables.xml 中的所有插头角色,如果插头角色与 VM 角色之一相同,那么:
    1. 检查依赖性是否是 OK。如果不是,就把这个插头放在工作队列中。
    2. 获取 XML 文件中描述的相关插座信息(角色等)。
    3. 寻找属于同一环境的提供正确插座的 VM。
    4. 对于发现的所有 VM:
      1. 如果发现了多个 VM,根据 XML 文件中定义的规则决定选择哪个 VM。
      2. 如果插座的状态是激活的,获取发布的插座属性。
      3. 调用配置操作;作为参数传递获取的信息。
      4. 发布信息;表明这个插头现在已经激活,还描述它连接到哪个插座。
      5. 发送一个发布插头的事件。
      6. 把插头放在 StereoCable 激活表中,指定它连接到哪个插座。
    5. 如果没有 VM 可用,或者有 VM 可用但插座没有激活,就把这个 StereoCable 放在要处理的工作队列中,指定它需要的角色和环境。

下面是 StereoCable 动态处理的步骤(紧接前面的步骤):

  1. 定期收集 StereoCable 事件(创建插座、删除插座、更新插座)和与具有特定角色的 VM 相关的事件(VM 部署和 VM 移除)。
  2. 对于工作队列中的所有插头角色:
    1. 如果发现一个新的 VM,它发布所请求的激活的插座,那么:
      1. 如果插座的状态是激活的,获取发布的插座属性。
      2. 调用配置操作,作为参数传递获取的信息。
      3. 发布信息,表明这个插头现在已经激活,还描述它连接到哪个插座。
      4. 从 StereoCable 工作队列中删除此插头。
      5. 把插头放在 StereoCable 激活表中,还指定它连接到哪个插座。
      6. 发送一个发布插头的事件。
    2. 如果从数据中心中移除一个 VM,而 StereoCable 激活表中保存的一个插头正在使用它发布的插座,那么:
      1. 调用删除配置操作,作为参数传递与此插座相关的信息。
      2. 从 StereoCable 激活表中删除此插头。
      3. 把此插头放在工作队列中。
      4. 发布信息,说明此插头现在没有激活,连接中断。
      5. 发送一个取消发布插头的事件。

下面的流程图描述这些步骤:

StereoCable 如何执行启动和动态处理
StereoCable 如何执行启动和动态处理

(查看这个流程图的大版本。)

UI 和 CLI 显示数据中心中 VM 之间的 StereoCable 连接;它们还提供已经建立的连接以及相关插头和插座的详细信息。

关于 StereoCable 动态处理

建立 StereoCable 连接之后,由于引擎能够处理相关事件,这些连接是真正动态的:

  • 引擎能够处理发布插座、删除插座等事件,从而激活、删除或取消激活连接。
  • 在发布、更新或删除插座时,引擎还会生成事件,从而把变动通知用户。

图 2 说明引擎如何处理事件。

图 2. 处理事件
处理事件

创建 StereoCable 连接

在本节中,介绍在不同的虚拟机中安装的两个产品(前一个产品作为代理,后一个产品作为服务器)之间创建、部署、建立和检查 StereoCable 连接的步骤。这是一个客户机-服务器连接示例,但是在复杂的集成场景中也可以使用 StereoCable 建立服务器-服务器连接。

定义 StereoCable 连接

StereoCable 连接由两部分(插头和插座)组成,用 XML 格式指定它。清单 2 给出 StereoCable 连接定义:

清单 2. XML 格式的 StereoCable 连接定义
<tns:StereoCablesxmlns:tns="http://ibm.com/stereocables"            
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
  xsi:schemaLocation="http://ibm.com/stereocables StereoCables.xsd ">
    <StereoCable>
      <StereoCableID>AGENT-SERVER</StereoCableID>
      <Description>Agent Server Connection</Description>
      <PlugSection>
        <Description>Agent Plug</Description>
        <PlugID>AGENT</PlugID>
        <ConfigurationActions>
          <ConfigurationAction>
            <Description>Agent configuration</Description>
           <ID>ConfigurationActionID1</ID>
          <Trigger>Deployment</Trigger>
          <Action>
            <ActionType>script</ActionType>
            <ActionDetail>
              <ConfigurationParameters>
                <ConfigurationParameter>
                  <ConfigurationName>hostname</ConfigurationName>
                </ConfigurationParameter>
                <ConfigurationParameter>
                  <ConfigurationName>port</ConfigurationName>
                </ConfigurationParameter>
              </ConfigurationParameters>
              <Operations>
                <Operation>agent_config.sh</Operation>
                <OS>Linux</OS>
              </Operations>
            </ActionDetail>
         </Action>
       </ConfigurationAction>
      </ConfigurationActions>
    </PlugSection>
     <SocketSection>
       <Description>Server Socket</Description>
       <SocketID>SERVER</SocketID>
       <PublishedParameters>
         <ConfigurationParameter>
           <ConfigurationName>hostname</ConfigurationName>
           <ConfigurationType>ActionBased</ConfigurationType>
           <Action>
             <ActionType>script</ActionType>
             <ActionDetail>
               <ConfigurationParameters>
                 <ConfigurationParameter>
                   <ConfigurationName>hostname</ConfigurationName>
                   <ConfigurationValue>hostname</ConfigurationValue>
                   <ConfigurationType>UserDefined</ConfigurationType>
                 </ConfigurationParameter>
               </ConfigurationParameters>
               <Operations>
                 <Operation>getNetworkConf.sh</Operation>
                 <OS>Linux</OS>
               </Operations>
               <Operations>
                 <Operation>getNetworkConf.sh</Operation>
                 <OS>AIX</OS>
                </Operations>
             </ActionDetail>
           </Action>
        </ConfigurationParameter>
        <ConfigurationParameter>
          <ConfigurationName>port</ConfigurationName>
         <ConfigurationValue>2000</ConfigurationValue>
        </ConfigurationParameter>
      </PublishedParameters>
    </SocketSection>
  </StereoCable>
</tns:StereoCables>

在这个示例中,代理是插头,服务器是插座。

PlugSection 指定代理/插头为了连接服务器/插座需要执行的操作。在这个示例中,在部署时将执行脚本 agent_config.sh,以插座发布的主机名和端口作为输入参数。

SocketSection 描述插座发布的信息,也就是代理/插头所需要的主机名和端口。注意,主机名是通过运行脚本 getNetworkConf.sh 动态地获取的,而端口是在 XML 文件中静态地定义的。

包含 StereoCable 定义的 StereoCables.xml 文件将部署在代理和服务器机器上。

部署 StereoCable 引擎

要想部署引擎,必须下载 StereoCable 引擎文件并解压到代理和服务器机器目录中,见图 3。

图 3. 部署引擎
部署引擎

在我们的示例中,引擎配置为使用 Java 目录下的 Java™ 运行时(在这里是用于 AMD64 架构上的 Linux® 的 Java 2 Technology Edition, Version 5.0, 64-bit Runtime Environment)。如果您使用不同的架构,应该在 conf/environment.properties 文件中指定路径。注意,已经使用用于 AMD64 架构上的 Linux 的 Java 2 Technology Edition, Version 5.0, 64-bit Runtime Environment 测试过这个引擎。

部署 StereoCable

接下来,把 StereoCables.xml 文件复制到数据目录(图 4)。

图 4. 部署 StereoCable
部署 StereoCable

定义角色

在 conf/stereocables.properties 文件中指定每个机器的角色。

图 5. 定义角色
定义角色

在服务器机器上,编辑插座键以反映 sockets=SERVER。在代理机器上,编辑插头键以反映 plugs=AGENT

定义环境

在代理和服务器机器上,指定同一环境:environment=TEST

启动引擎

要想启动引擎,应该在运行它们之前注册它们。

注册服务器机器:

$./vEngine.sh -reg
CTJES0003I Loading configuration.
CTJES0004I The configuration has been successfully loaded.
CTJES0001I Executing the operation: Registering the engine.
CTJES0002I Operation successfully executed: Registering the engine.

运行服务器机器:

$./vEngine.sh -run

CTJES0003I Loading configuration.
CTJES0004I The configuration has been successfully loaded.
CTJES0001I Executing the operation: Run the engine.
CTJES0001I Executing the operation: Cable processing.
CTJES0005I Processing socket: SERVER.
CTJES0011I Publishing information.
CTJES0013I Sending event: Socket SERVER published.
CTJES0019I Processing event's type: STEREOCABLES_SOCKET_PUBLISHED.SERVER.
CTJES0020I Event processed.
CTJES0006I Socket SERVER successfully processed.
Socket processed:
  SERVER: Success
Plug processed:

CTJES0002I Operation successfully executed: Cable processing.

注册代理机器:

$./vEngine.sh -reg
CTJES0003I Loading configuration.
CTJES0004I The configuration has been successfully loaded.
CTJES0001I Executing the operation: Registering the engine.
CTJES0002I Operation successfully executed: Registering the engine.

运行代理机器:

$$./vEngine.sh -run
CTJES0003I Loading configuration.
CTJES0004I The configuration has been successfully loaded.
CTJES0001I Executing the operation: Run the engine.
CTJES0001I Executing the operation: Cable processing.
CTJES0005I Processing plug: AGENT.
CTJES0011I Publishing information.
CTJES0013I Sending event: plug AGENT published.
CTJES0019I Processing event's type: STEREOCABLES_PLUG_PUBLISHED.AGENT.
CTJES0020I Event processed.
CTJES0006I Plug AGENT successfully processed.
Socket processed:
  
Plug processed:
   AGENT: Success

CTJES0002I Operation successfully executed: Cable processing.

检查连接

通过运行 $script/Cli.sh -list 命令,列出环境中发布的信息和可用的 StereoCable 连接。

CTJES0003I Loading configuration.
CTJES0004I The configuration has been successfully loaded.
CTJES0001I Executing the operation: Discovery machines.
CTJES0002I Operation successfully executed: Discovery machines.

-------------------------------------------------------------------
srv.ivm.com
-------------------------------------------------------------------
guestInfo.stereocables.env = TEST
guestInfo.stereocables.status = Enabled
guestInfo.stereocables.sockets = SERVER

guestInfo.stereocables.socket.SERVER.status=Active
guestInfo.stereocables.socket.SERVER.hostname=srv.ivm.com
guestInfo.stereocables.socket.SERVER.port=2000

guestInfo.stereocables.plugs =

-------------------------------------------------------------------
-------------------------------------------------------------------
agt.ivm.com
-------------------------------------------------------------------
guestInfo.stereocables.env = TEST
guestInfo.stereocables.status = Enabled
guestInfo.stereocables.sockets =

guestInfo.stereocables.plugs = AGENT
guestInfo.stereocables.plug.AGENT.status=Active
guestInfo.stereocables.plug.AGENT.connected=srv.ivm.com:SERVER

-------------------------------------------------------------------

可以看到在 TEST 环境中机器 agt.ivm.com 被插入 srv.ivm.com。


结束语

下一步

为了进一步自动化 VM 的发现、配置和连接,建议下载 StereoCable zip 文件 并阅读本文中提到的另外 两篇 developerWorks 文章

我们很高兴向您展示了一个新概念 — 自动地发现虚拟化数据中心中的虚拟机并根据预定义的连接策略把它们相互连接起来,还介绍了我们正在开发的一个项目,您可以使用它实现这样的系统。

请记住,虚拟设备有能力改变软件的分发模式,因为它们让应用程序构建者能够针对应用环境优化软件组合,向最终用户提供可立即使用的软件服务。在云应用程序中实现这种服务水平的关键一步是自动化和增强虚拟机连接。


下载

描述名字大小
本文的示例代码stereocable.zip10KB

参考资料

学习

讨论

条评论

developerWorks: 登录

标有星(*)号的字段是必填字段。


需要一个 IBM ID?
忘记 IBM ID?


忘记密码?
更改您的密码

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件

 


在您首次登录 developerWorks 时,会为您创建一份个人概要。您的个人概要中的信息(您的姓名、国家/地区,以及公司名称)是公开显示的,而且会随着您发布的任何内容一起显示,除非您选择隐藏您的公司名称。您可以随时更新您的 IBM 帐户。

所有提交的信息确保安全。

选择您的昵称



当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。

昵称长度在 3 至 31 个字符之间。 您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。

标有星(*)号的字段是必填字段。

(昵称长度在 3 至 31 个字符之间)

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件.

 


所有提交的信息确保安全。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=Cloud computing, Linux, Java technology
ArticleID=605350
ArticleTitle=自动的虚拟机发现和自助连接
publish-date=12292010