说明
上一章我们介绍了RPC远程调用及常用框架之Thrift,ice也和他一样是跨语言的,所以也有一个安装程序来生成目标语言,接下来我们一起探索
安装ice
下载
这里直接去官网下载
ice官网
注意:
进入下载页面,点击相应版本,发现没有反应(原本该跳转到页面下方,指定的锚点处)
不急做程序的,我们f12后搜索msi直接访问链接就可以下载了
注意:
这里我下载的3.7后使用有问题,所以最终下载了3.6而且很慢建议空闲时下载好
安装
这里就双击运行下载的文件,然后在path环境变量中配置好就可以了
在末尾加上,D:\Ice-3.6.5\bin,就可以了
生成目标代码
编写ice文件-
如下:hello.ice
[["java:package:com.gs.ice"]]
module service{ //包名 具体生成的包为: 父包结构 + 包名
interface HelloService{ //接口名 不能用Ice作为接口名的开头
string sayHello(string s); //类型都是小写开头,常用的有string,int,long
};
};
生成相关代码目录
运行命令
查看目录结构
构建项目
新建一个springboot项目
建好后将生成的包复制到项目里
我们这里需要加入ice的依赖
3.6.5ice依赖找到相关maven依赖
粘贴到项目pom中
到此项目搭建完成,大家可以用子模块方式因为客户端和服务端都需要父模块的依赖
实现服务
/**
* @auther 高松
* @DATE 2019/9/3 20:37
* ice-test
*/
public class HelloServiceI extends _HelloServiceDisp {
@Override
public String sayHello(String s, Current __current) {
System.out.println(s+"调用成功!");
return null;
}
}
服务端将服务提供出去
@SpringBootApplication
public class ServerTestApplication {
public static void main(String[] args) {
SpringApplication.run(ServerTestApplication.class, args);
int status = 0;
Ice.Communicator ic = null;
try {
//初始化连接,args可以传一些初始化参数,如连接超时,初始化客户端连接池的数量等
ic = Ice.Util.initialize(args);
//创建名为SimpleHelloAdapter的适配器,并要求适配器使用缺省的协议(TCP/IP 端口为10000的请求)
Ice.ObjectAdapter adapter = ic.createObjectAdapterWithEndpoints("SimpleHelloAdapter", "default -p 10000");
//实例化一个Printer对象,为Printer接口创建一个服务对象
Ice.Object object = new HelloServiceI();
//将服务单元增加到适配器中,并给服务对象指定名称为SimpleHello,该名称用于唯一确定一个服务单元
adapter.add(object, Ice.Util.stringToIdentity("SimpleHello"));
//激活适配器
adapter.activate();
//让服务在退出之前,一直持续对请求的监听
ic.waitForShutdown();
} catch (Exception e) {
e.printStackTrace();
status = 1;
}finally{
if(ic!=null){
ic.destroy();
}
}
System.exit(status);
}
}
客户端调用
@SpringBootApplication
public class ClientTestApplication {
public static void main(String[] args) {
SpringApplication.run(ClientTestApplication.class, args);
Ice.Communicator ic = null;
try {
//初始化通信器
ic = Ice.Util.initialize(args);
//传入远程服务单元的名称、网络协议、IP以及端口,获取helloService的远程代理,这里使用stringToProxy方式
Ice.ObjectPrx base = ic.stringToProxy("SimpleHello:default -p 10000");
//通过checkedCast向下转型,获取helloService接口的远程,并同时检测根据传入的名称获取服务单元是否helloService的代理接口,如果不是则返回null对象
HelloServicePrx hello = HelloServicePrxHelper.checkedCast(base);
if(hello == null){
throw new Error("Invalid proxy");
}
//把寂寞传给服务端,让服务端打印出来,因为这个方法最终会在服务端上执行
hello.sayHello("寂寞");
} catch (Exception e) {
e.printStackTrace();
}finally{
if(ic != null){
ic.destroy();
}
}
}
}