vSphere API 编程模型(一)
vSphere API 是作为一种语言无关的 Web 服务实现的,它基于一个远程过程调用机制,客户端应用程序使用它来访问 ESXi和 vCenter 服务器系统上的服务和组件。
本章节主要包括以下内容:
■ vSphere Client-Server 架构
■ vSphere API 作为一个 Web 服务
■ 访问托管对象(Managed Object)
■ 访问 vSphere 服务器数据
1. vSphere Client-Server 架构
VMware vSphere 客户端应用程序加入了使用异步通信模型的分布式架构。
该架构是基于服务器端托管对象、客户端托管对象引用和数据对象的。
■ 托管对象(Managed objects),存在于 vSphere 服务器(ESX/ESXi 或 vCenter 服务器系统)上,表示 vSphere 服务和组件:
服务包括 PropertyCollector、SearchIndex、PerformanceManager 和 ViewManager;
组件包括清单对象如VirtualMachine、Datastore、Folder。
■ 托管对象引用(Managed object references),是客户端应用到服务器端托管对象的引用。
当你的客户端应用调用一个服务器上的操作(方法)时,客户端就会使用 ManagedObjectReference 对象。
在一个对象的生命周期中,一个 ManagedObjectReference 保证是唯一的和持久的。当对象随着清单被移除、跨会话和跨服务器重启时,引用仍然存在。
如果你移除一个对象,如清单中的虚拟机,然后把它迁移回去,此时引用就改变了。
■ 数据对象(Data objects ),包含托管对象的相关信息。你的客户端应用发送数据对象到 vSphere 服务器,并从服务器接收数据对象。
示例是不同的规范和功能对象,例如 virtualmachine econfigspec 和 HostCapability。
下图的 vSphere Server and Client 关系图中展示了一个 vSphere 服务器和客户端应用, 客户端有一个托管对象引用到服务器上的虚拟机,以及一个用于虚拟机的 GuestInfo 数据对象的副本。
vSphere Server and Client
客户机必须维护数据对象的副本,因为根据客户机请求的类型,vSphere 服务器可能会将数据对象的属性数据作为一组与托管理对象引用关联的名称-值对进行发送。
请参阅 vSphere API Reference 中的 ObjectContent 数据对象的描述。
在大多数情况下,VMware vSphere 应用程序模型使用一个异步的客户机-服务器通信模型。方法是非阻塞的,并返回一个对任务管理对象的引用。可参阅 任务和调度任务。
2. vSphere API 作为一个 Web 服务
vSphere API 符合 Web服务互操作性组织(WS-I)基本概要1.0。
WS-I 基本概要文件 1.0 支持:
■ XML Schema 1.0
■ SOAP 1.1
■ WSDL 1.1
Web 服务支持操作,此操作与其他编程语言中的方法是一样的。vSphere API Web service 提供了对监控和管理 vSphere 组件所需的 所有操作的访问,如 compute resources、 virtual machines、networks、storage 等等。
2.1 WSDL 文件和客户端代理接口
vSphere Web Services SDK 提供了一系列 WSDL (Web Services Description Language, Web 服务描述语言)文件来定义vSphere Web Services API。Web-services 开发工具如 JAX-WS wsimport,或者 Microsoft .NET wsdl.exe 使用这些 WSDL 文件 生成客户端代理代码 (存根)。
客户端代理提供特定于语言的vSphere API,如 Java 或 C#。代理方便了远程方法调用、对象数据的组织以及分布式、面向对象、应用程序编程等其他方面。而你的客户端应用只需调用代理接口方法,客户端代理使用 SOAP (Simple Object Access Protocol,简单对象访问协议)与一个 vSphere 服务器交换 WSDL 消息。
下图是一个客户端应用程序使用客户端代理接口来调用方法的示意图,客户端代理接口使基于 WSDL 定义的。
Client-Server 通过客户端代理接口通信图
要使用 VMware 客户端代理接口,必须使用以下 Java 和 C# 语句将 vSphere API 客户端库导入到客户机应用程序中。
C# using VimApi;
Java import com.vmware.vim25.*;
重要: vSphere Web Services SDK 包含了使用 JAX-WS 工具生成的 Java 客户端代理代码,如果你的开发平台上的 Java 和 JAX-WS 版本与用于 SDK 中生成代理接口的版本相同,那么你就不必从 WSDL 生成客户端代理代码。有关为 vSphere Web Services SDK配置开发环境的信息,请参见开发人员的设置指南。
2.2 网络访问 vSphere Web Service
客户端应用程序可以使用 vSphere API 和 vSphere 服务器在 443 端口上通过 HTTPS 协议进行通信, HTTPS 是默认协议,当然也可以通过配置服务器支持 HTTP 协议。
使用 HTTP 访问只用于测试或开发环境中,而不用于生产环境。有关详细信息,请参阅开发人员设置指南。
2.3 特定语言的类文件和方法
SOAP 工具生成与 WSDL 定义相匹配的特定于语言的类和方法,这些工具还可以生成不在 WSDL 文件中的对象和方法。
■ 生成的对象, 附加的对象提供对 vSphere Web 服务的访问,以建立客户机-服务器连接( VimServiceLocator、AppUtil ),并声明为vSphere API (VimPortType、VimService) 定义的方法。
■ 生成的方法,附加的方法是属性的获取(getter)和设置(setter)方法。对于 Java 来说,方法名称是对属性名加上 get 和 set 前缀来构建的,其中属性名的首字母改为大写。
下表的客户端代理定义明确了为 vSphere Web Services SDK WSDL 客户端代理定义。
客户端代理定义
下面的代码片段显示了 AfterStartupTaskScheduler 中 minute 属性的 getter 和 setter方法声明。
Java
public int getMinute() {
return minute;
}
public void setMinute(int minute) {
this.minute = minute;
}
C#
public int minute {
set;
get;
}
你可以通过 vSphere API 引用来推断客户端代理接口中可用的getter和setter方法。
例如:ScsiLun 数据对象有一个 displayName 属性,对于 Java API,可以使用 setDisplayName( ) 方法为属性赋值,使用 getDisplayName( ) 获取属性值,vSphere Web Services SDK 包含 Java 和 C# 的示例代码说明了代理接口的使用方法。可查阅 客户端应用程序。
2.4 映射 XML 数据类型到 Java 和 C# 数据类型
在这本指南中,UML 类图和对象图使用了诸如字符串和整数之类的原始数据类型名称,而没有 XML 模式定义名称空间前缀(xsd:)。
vSphere API 引用包含了完整的数据类型名称,如 xsd:string。数据类型映射到客户机应用程序使用的编程语言对应的原始数据类型。
下表列出了一些常用的 XML 原始数据类型映射。
标准 XML 模式原始数据类型到 Java 和 .NET 数据类型的映射