Ice 是一个开源的 RPC 框架, 支持 C++, C#, Java, JavaScript, Python, 以及更多的语言, 并且支持多种平台, 通过语言无关的 “Slice 语言” 来描述服务接口, 实现对象接口和实现分离的目的.
使用 ZeroC Ice 的基本步骤是:
1. 使用 slice 语言定义所需要的接口, 存为 .ice 文件
2. 通过 slice 编译器将 .ice 编译为对应语言的接口文件
3. 服务端实现生成的接口, 并且加入到 Ice 的 Adapter里
4. 客户端通过 3 生成接口文件来进行远程调用
官方文档里给出了多种语言的 Hello World 的例子.
由于最近在学习 kotlin, 所以也试着用 kotlin 来用了下.
一, 使用 slice 语言来定义 .ice 文件
module Demo
{
interface IAdd
{
int add(int a, int b);
}
}
此处定义了一个 Demo
模块, 以及一个 IAdd
接口, 一个方法 add(int, int)
二, 编译为 java 文件
slice2java --output-dir . Add.ice
将会生成 _IaddPrxI.java IAdd.java IAddPrx.java
三个文件, 服务端需要实现 IAdd
, 而客户端需要的则是 IAddPrx.java
来获取代理
三, 实现服务端
服务端只需要继承 IAdd
接口, 并且重写 add
方法即可, 例如
import Demo.IAdd
import com.zeroc.Ice.Current
class Add : IAdd {
override fun add(a: Int, b: Int, current: Current?): Int {
return a + b;
}
}
这只是 IAdd 的实现, 除此以外还要让服务端跑起来, 这部分很简单
import com.zeroc.Ice.Util.*
fun main(args: Array) {
initialize(args).use {
val adapter = it.createObjectAdapterWithEndpoints("SimpleAdapter", "default -p 10000")
val addObj = Add()
adapter.add(addObj, stringToIdentity("DemoAdd"))
adapter.activate()
it.waitForShutdown()
}
}
首先调用 com.zeroc.Ice.Util.initialize
方法获取一个 Communicator
实例, 然后调用 它的 createObjectAdapterWithEndpoints
方法创建一个适配器, 第一个参数是适配器的名字, 第二个参数则表示用默认协议, 监听 10000 端口.
然后只需要实例化一个 Add
对象, 添加到适配器即可, adapter.add
的第二个参数需要传入一个 Identity
, 只需要调用 stringToIdentity
方法即可.
最后激活适配器, 并让服务端一直启动, 等待结束
四, 客户端的实现
客户端就非常简单了
import com.zeroc.Ice.Util.*
fun main(args: Array) {
initialize(args).use {
val base = it.stringToProxy("DemoAdd:default -p 10000")
val add = Demo.IAddPrx.checkedCast(base)
println(add?.add(1, 2))
}
}
同样需要先调用 com.zeroc.Ice.Util.initialize
方法获取一个 Communicator
实例, 再使用 stringToProxy
方法来获取一个对 DemoAdd
的代理, 也就是对服务端实现的 IAdd
的一个代理.
接着用 Demo.IAddPrx.checkedCast 对获取到的代理进行安全的转型, 转型成功后返回的就是可调用的 IAddPrx了, 如果失败了则返回了 null.
最后对获得的 add 代理调用 add 方法就可以进行远程调用了.
调用结果