bboyjing's blog

尝试ZeorC ICE之【初识】

本系列博客的目的是为了学习ZeroC Ice的使用,并且和实际项目框架相结合,最后考虑是否能将这一产品引入到当前项目中,或者为新项目的技术选型多一个备选方案。
到底什么是ZeroC Ice?用一句话概括就是支持多语言的RPC框架。暂且不去管它的优缺点,得先学了再说。本系列的知识点来自《ZeroC Ice》权威指南和官网文档。在这里向《ZeroC Ice》权威指南的作者表示敬意,这是目前关于ZeroC Ice唯一的一本书。ZeroC是一家公司,Ice是该公司的产品,全称Internet Communications Engine。Ice遵循GPLv2开源协议,如果使用过程中出现问题,ZeroC公司可以提供收费支持。不扯了,下面正式开始学习。

安装Ice

Ice官网的distributions有详细的安装步骤,选择与自己机器匹配的系统,照着步骤即可。注意安装步骤的上方有下图一句话,表示安装了哪些服务和支持的语言种类(和选择的系统有关)。
zeroc_ice_1
安装完毕后,打开终端输入slice2,然后按下tab键,可以看到支持的语言指令,至于这些指令怎么用,下面就会讲到。
zeroc_ice_2

如何支持多语言

目前我们能从字面上看到Ice的一个优势,就是支持多语言。要怎样才能支持市面上一些主流开发语言呢,总不能让人家去统一吧。所以Ice采用了通过与编程语言无关的中立语言的方式来描述服务的接口,该语言叫Slice。先使用Slice编写接口描述,然后使用Ice提供的工具(就是上面提到的slice2×××)生成目标语言。下面我们就先来学习Slice这门中立语言。

Slice的基本数据结构

下表列举了Slice定义的基本数据类型:

类型 定义及范围 长度
bool false or true ≥ 1bit
byte -128 ~ 127 or 0 ~ 255 ≥ 8 bits
short -215 to 215-1 ≥ 16 bits
int -231 to 231-1 ≥ 32 bits
long -263 to 263-1 ≥ 64 bits
float IEEE single-precision ≥ 32 bits
double IEEE double-precision ≥ 64 bits
string All Unicode characters, excluding the character with all bits zero. Variable-length

从表中可以看出,除了bool和string之外,其他类型与Java的基本类型保持一致,不难理解。
除了基本数据类型,Slice还设计了集中复合数据类型,如下所示:

  • 枚举类型 enum

    1
    2
    例如:enum Fruit {Apple, Pear, Orange};
    或者:enum Fruit {Apple = 5, Pear = 3, Orange = 1};
  • 结构体 struct
    保护多个属性数据,类似于JavaBean

    1
    2
    3
    4
    5
    struct TimeOfDay {
    short hour; // 0 - 23
    short minute; // 0 - 59
    short second; // 0 - 59
    }
  • 集合类型 sequence
    支持基本类型或者符合类型的集合,例如:

    1
    2
    sequence<Fruit> FruitPlatter;
    sequence<FruitPlatter> FruitBanquet;(集合的集合)
  • Map类型 dictionary
    类似Java HashMap,例如:dictionary<long, Employee> EmployeeMap

结构体很好地对应于Java Bean对象,应该是会用的最多的复合数据类型,不过它有一个限制:不能嵌套,作为入门学习资料,还是把代码贴出来,下面是一个错误的示范:

1
2
3
4
5
6
7
8
9
10
11
12
// demo表示文件名
module demo {
struct TwoPoints {
// Illegal!
struct Point {
short x;
short y;
};
Point coord1;
Point coord2;
};
};

我们把上面错误的示范跑一下,看看会怎么样,顺便借此机会建个项目attempt_ice,在根目录下新建demo.ice(slice文件的后缀为ice),然后把上面错误的示范贴到文件中,执行步骤如下:

1
2
3
4
5
cd ~/IdeaProjects/attempt_ice
slice2java demo.ice
//结果如下
/home/zhangjing/IdeaProjects/attempt_ice/demo.ice:4: syntax error
...

下面修改成正确的姿势:

1
2
3
4
5
6
7
8
9
10
module demo {
struct Point {
short x;
short y;
};
struct TwoPoints {
Point coord1;
Point coord2;
};
};

再次执行slice2java demo.ice,会生成demo目录以及一些java文件,如下:
zeroc_ice_3
稍微解释下生成的文件:

  • demo目录:对应module后面的关键字,表示内容都生成在demo目录中
  • Point.java和PointHolder.java文件是根据struct Point生成的
  • TwoPoints.java和TwoPointsHolder文件是根据struct TwoPoints生成的

至此我们已经学会了定义简单的Java Bean。

接口和方法的定义

接下来我们看看在Slice中怎么定义接口。与Java语义相同,Slice用关键字interface来申明一个接口,新建interface.ice文件:

1
2
3
4
5
6
7
8
9
10
11
12
module demo2 {
struct TimeOfDay {
short hour; // 0 - 23
short minute; // 0 - 59
short second; // 0 - 59
};
interface Clock {
TimeOfDay getTime();
void setTime(TimeOfDay time);
};
};

这样我们就成功地定义了一个简单的接口,当然Slice提供的接口功能并不只是这么简单,暂时就不深究了,后面有机会使用的过程中再查文档。Slice也支持异常的定义,通过exception关键字来定义,暂且不演示了。
这一篇就写到这里,主要目的是知道了Ice是什么,以及其Slice语言的简单使用。