本系列博客的目的是为了学习ZeroC Ice的使用,并且和实际项目框架相结合,最后考虑是否能将这一产品引入到当前项目中,或者为新项目的技术选型多一个备选方案。
到底什么是ZeroC Ice?用一句话概括就是支持多语言的RPC框架。暂且不去管它的优缺点,得先学了再说。本系列的知识点来自《ZeroC Ice》权威指南和官网文档。在这里向《ZeroC Ice》权威指南的作者表示敬意,这是目前关于ZeroC Ice唯一的一本书。ZeroC是一家公司,Ice是该公司的产品,全称Internet Communications Engine。Ice遵循GPLv2开源协议,如果使用过程中出现问题,ZeroC公司可以提供收费支持。不扯了,下面正式开始学习。
安装Ice
Ice官网的distributions有详细的安装步骤,选择与自己机器匹配的系统,照着步骤即可。注意安装步骤的上方有下图一句话,表示安装了哪些服务和支持的语言种类(和选择的系统有关)。
安装完毕后,打开终端输入slice2,然后按下tab键,可以看到支持的语言指令,至于这些指令怎么用,下面就会讲到。
如何支持多语言
目前我们能从字面上看到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
12例如:enum Fruit {Apple, Pear, Orange};或者:enum Fruit {Apple = 5, Pear = 3, Orange = 1};结构体 struct
保护多个属性数据,类似于JavaBean12345struct TimeOfDay {short hour; // 0 - 23short minute; // 0 - 59short second; // 0 - 59}集合类型 sequence
支持基本类型或者符合类型的集合,例如:12sequence<Fruit> FruitPlatter;sequence<FruitPlatter> FruitBanquet;(集合的集合)Map类型 dictionary
类似Java HashMap,例如:dictionary<long, Employee> EmployeeMap
结构体很好地对应于Java Bean对象,应该是会用的最多的复合数据类型,不过它有一个限制:不能嵌套,作为入门学习资料,还是把代码贴出来,下面是一个错误的示范:
我们把上面错误的示范跑一下,看看会怎么样,顺便借此机会建个项目attempt_ice,在根目录下新建demo.ice(slice文件的后缀为ice),然后把上面错误的示范贴到文件中,执行步骤如下:
下面修改成正确的姿势:
再次执行slice2java demo.ice
,会生成demo目录以及一些java文件,如下:
稍微解释下生成的文件:
- demo目录:对应module后面的关键字,表示内容都生成在demo目录中
- Point.java和PointHolder.java文件是根据struct Point生成的
- TwoPoints.java和TwoPointsHolder文件是根据struct TwoPoints生成的
至此我们已经学会了定义简单的Java Bean。
接口和方法的定义
接下来我们看看在Slice中怎么定义接口。与Java语义相同,Slice用关键字interface来申明一个接口,新建interface.ice文件:
这样我们就成功地定义了一个简单的接口,当然Slice提供的接口功能并不只是这么简单,暂时就不深究了,后面有机会使用的过程中再查文档。Slice也支持异常的定义,通过exception关键字来定义,暂且不演示了。
这一篇就写到这里,主要目的是知道了Ice是什么,以及其Slice语言的简单使用。