Slice(Specification language for ice)是分离对象和对象的实现的基础的抽象机制。Slice在客户端和服务器端之间建立契约,描述应用程序使用的类型对象的接口。这样的描述是独立于实现功能的语言的,所以服务器和客户端的实现所使用的语言没有任何关系。
编译器将语言无关的定义翻译为特定语言的类型定义和API。这些翻译后的类型定义和API将被使用在应用程序的功能中,以及用来与Ice交互。这种从一种语言无关的定义到各种语言的翻译成为语言影射。目前,ice支持下面几种语言的影射:
- C++
- Java
- C#
- Visual Basic.Net
- Python
- PHP
由于Slice只定义了接口和类型,所以Slice是单纯的声明语言。因此Slice中时不能编写可执行的代码的。
Slice将定义的焦点放在对象接口,以及接口支持的操作和可能产生的异常上。除此之外,Slice还支持对象持久化的操作。
Slice产生的源代码文件必须和应用程序代码一起生成客户端和服务器端执行程序。
开发的结果就是开发可执行的客户端和服务器端程序。这些可执行的程序可以被发布在任何位置,无论他们的环境是否相同,它们的实现语言是否相同。这个唯一的约束就是宿主必须提供必要的运行时环境,例如需要的动态链接库以及客户端和服务器端能够相互连接。
下图展示了客户端和服务器端用C#开发时的情况。这个开发的例子可以从ICE:C#和Java共同的服务器 看到具体的开发过程。
- Slice编译从一个 Slice定义文件 Printer.ice产生了一个cs文件Printer.cs。
- Printer.cs文件包括了被影射为CS的类型和接口的Slice定义。这个文件将被客户端和服务器端程序使用,以确保客户端和服务器端似乎用一致的类型和接口。
- Printer I.cs文件提供了服务器端实现打印的功能。
- Server.cs和Client.cs分别提供了服务器端和客户端的执行代码。
上面的图只是一个示例。实际中,你没有必要像途中一样只有一个客户端和服务器端。例如,你能创建多个服务器,每一个实现了相同的接口,但是却有着不同的功能实现(例如不同的服务性能)。多个这样的服务器可以共存在一个系统中。这样的方案提供了一个基础性的可伸缩的机制:假如你发现一个服务器的进程开始随着对象的增加而运行缓慢,你可以在另一台机器上运行实现相同接口的服务。这样的联合服务提供了一个分布在不同机器上的多个服务进程的单一的逻辑服务。联合服务中的每一个服务器实现了相同的接口,但是充当不同的对象实例的宿主。
Ice还支持可重复服务器。可重复服务器允许多个服务器各自实现同一组对象实例。这项功能提高了性能、可伸缩性以及冗余性。因为客户负载可以被多个服务器分担,而每一个对象可以在一个以上服务器中被实现。
如果客户端和服务器端使用不同的语言开发,那么该怎么做呢?
下图展示了客户端使用Java,服务器端使用C#的开发情况。这个开发的例子可以从ICE:C#和Java共同的服务器 看到具体的开发过程。
很显然,Slicse是架起两者之间的桥梁。