RPC远程调用及常用框架之ICE

RPC远程调用及常用框架之ICE

    • 说明
    • 安装ice
      • 下载
      • 安装
    • 生成目标代码
      • 编写ice文件-
      • 生成相关代码目录
    • 构建项目
      • 新建一个springboot项目
      • 实现服务
      • 服务端将服务提供出去
      • 客户端调用
      • 效果

说明

上一章我们介绍了RPC远程调用及常用框架之Thrift,ice也和他一样是跨语言的,所以也有一个安装程序来生成目标语言,接下来我们一起探索

安装ice

下载

这里直接去官网下载
ice官网
注意:

进入下载页面,点击相应版本,发现没有反应(原本该跳转到页面下方,指定的锚点处)
RPC远程调用及常用框架之ICE_第1张图片
不急做程序的,我们f12后搜索msi直接访问链接就可以下载了
RPC远程调用及常用框架之ICE_第2张图片

注意:
这里我下载的3.7后使用有问题,所以最终下载了3.6而且很慢建议空闲时下载好

安装

这里就双击运行下载的文件,然后在path环境变量中配置好就可以了
在末尾加上,D:\Ice-3.6.5\bin,就可以了
在这里插入图片描述
RPC远程调用及常用框架之ICE_第3张图片

生成目标代码

编写ice文件-

如下:hello.ice

[["java:package:com.gs.ice"]]
module service{     //包名        具体生成的包为: 父包结构 + 包名      

    interface HelloService{ //接口名  不能用Ice作为接口名的开头

        string sayHello(string s);  //类型都是小写开头,常用的有string,int,long

    };

};

生成相关代码目录

运行命令
RPC远程调用及常用框架之ICE_第4张图片
查看目录结构
RPC远程调用及常用框架之ICE_第5张图片

构建项目

新建一个springboot项目

建好后将生成的包复制到项目里

RPC远程调用及常用框架之ICE_第6张图片
我们这里需要加入ice的依赖
3.6.5ice依赖找到相关maven依赖

RPC远程调用及常用框架之ICE_第7张图片
粘贴到项目pom中
RPC远程调用及常用框架之ICE_第8张图片
到此项目搭建完成,大家可以用子模块方式因为客户端和服务端都需要父模块的依赖

实现服务

/**
 * @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();
			}
		}

	}

}

效果

RPC远程调用及常用框架之ICE_第9张图片

你可能感兴趣的:(RPC远程调用及常用框架之ICE)