快速入门
安装ice软件
创建maven项目
pom.xml依赖
<!-- https://mvnrepository.com/artifact/com.zeroc/ice -->
<dependency>
<groupId>com.zeroc</groupId>
<artifactId>ice</artifactId>
<version>3.7.4</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.zeroc/icebox -->
<dependency>
<groupId>com.zeroc</groupId>
<artifactId>icebox</artifactId>
<version>3.7.4</version>
</dependency>
编写ice文件
创建 hello.ice 文件
[["java:package:com.demo.ice"]]
module greet{
interface Hello{
string sayhello(string s);
};
};
运行
slice2java ./hello.ice --output-dir {项目路径}\src\main\java
运行完发现生成了4个文件
Hello.java
HelloPrx.java
_HelloPrxI.java
_Marker.java
编写服务端代码
Hello的实现类HelloImpl
public class HelloImpl implements Hello {
@Override
public String sayhello(String s, Current current) {
return String.format("hello %s, welcome", s);
}
}
服务端 GreetServer:
public static void main(String[] args) {
// 初始化通信器
try (Communicator communicator = Util.initialize(args)) {
// 对象适配器
ObjectAdapter adapter = communicator.createObjectAdapterWithEndpoints("HelloServiceAdapter", "default -p 19999");
// 将服务的具体实现类servant交给这个适配器
com.zeroc.Ice.Object object = new HelloImpl();
// HelloService为唯一标识, 客户端通过id找到该类
adapter.add(object, communicator.stringToIdentity("HelloService"));
// 激活
adapter.activate();
System.out.println("Server start success.");
communicator.waitForShutdown();
}
}
客户端
public static void main(String[] args) {
try (Communicator communicator = Util.initialize(args)) {
// hello 对应服务端的ice对象的唯一标识
ObjectPrx base = communicator.stringToProxy("HelloService:default -p 19999");
HelloPrx helloPrx = HelloPrx.checkedCast(base);
if (helloPrx == null) {
throw new Error("Invalid proxy");
}
Scanner scanner = new Scanner(System.in);
while (true) {
String hello_world = helloPrx.sayhello(scanner.nextLine());
System.out.println(hello_world);
}
}
}
运行
先启动服务端, 再启动客户端, 在客户端输入, 回车发现输出了服务端返回的内容。
iceBox案例
服务端
GreetIceBoxServer 实现 com.zeroc.IceBox.Service 接口
public class GreetIceBoxServer implements Service {
private ObjectAdapter adapter;
@Override
public void start(String s, Communicator communicator, String[] strings) {
// 这边的s会接收到配置文件中的服务名
adapter = communicator.createObjectAdapter(s);
adapter.add(new HelloImpl(), communicator.stringToIdentity(s));
adapter.activate();
System.out.println("start...");
}
@Override
public void stop() {
adapter.destroy();
}
}
IceBoxApp 服务启动类:
public static void main(String[] args) {
args =new String[]{"--Ice.Config=icebox.properties"};
new Server().main(args);
}
配置文件
icebox.properties
IceBox.InstanceName=MyAppIceBox 1
# =1表示所有的服务使用Icebox中的配置
IceBox.InheritProperties=1
# =1会在icebox启动完毕后打印MyAppIceBox 1 ready
IceBox.PrintServicesReady=MyAppIceBox 1
# IceBox.Service.{服务名}
IceBox.Service.HelloService=com.demo.icebox.greet.server.GreetIceBoxServer
HelloService.Endpoints=tcp -p 19999 -h 127.0.0.1
# 启动顺序,如果有多个服务的话
IceBox.LoadOrder=HelloService
运行
客户端可以直接使用之前的代码。
先启动服务端, 再启动客户端, 在客户端输入参数, 回车发现输出了服务端返回的内容。
icebox把配置文件添加到了配置文件中。
registry注册服务
客户端
客户端
在args中添加了注册中心的信息
获取helloService是不在是使用之前的 HelloService:default -p 19999, 而是直接使用 服务名@服务对象适配器名, 其他不变
public static void main(String[] args) {
args = new String[]{"--Ice.Default.Locator=IceGrid/Locator:tcp -h 127.0.0.1 -p 4061"};
try (Communicator communicator = Util.initialize(args)) {
// hello 对应服务端的ice对象的唯一标识
ObjectPrx base = communicator.stringToProxy("HelloService@HelloServiceAdapter");
HelloPrx helloPrx = HelloPrx.checkedCast(base);
if (helloPrx == null) {
throw new Error("Invalid proxy");
}
Scanner scanner = new Scanner(System.in);
while (true) {
String hello_world = helloPrx.sayhello(scanner.nextLine());
System.out.println(hello_world);
}
}
}
配置文件
registry-hello.properties
在之前的icebox.properties配置文件的基础上 添加
#Ice Registry的协议 地址 端口
Ice.Default.Locator=IceGrid/Locator:tcp -h 127.0.0.1 -p 4061
##配置HelloService的适配器Id
HelloService.AdapterId=HelloServiceAdapter
服务端
只需要在之前的icebox服务端的配置文件改为registry-hello.properties
public static void main(String[] args) {
// args =new String[]{"--Ice.Config=icebox.properties"};
args = new String[]{"--Ice.Config=registry-hello.properties"};
new Server().main(args);
}
registry注册中心
- 配置文件registry.cfg
# icegridregistry --Ice.Config=C:/Users/admin/Desktop/wsp/ice_demo/src/main/resources/registry.cfg
# 注册中心的协议, 端口号
IceGrid.Registry.Client.Endpoints=tcp -p 4061 -h 127.0.0.1
IceGrid.Registry.Server.Endpoints=tcp
IceGrid.Registry.Internal.Endpoints=tcp
IceGrid.Registry.LMDB.Path=C:\Windows\ServiceProfiles\LocalService\AppData\Local\ZeroC\icegrid\registry
IceGrid.Registry.PermissionsVerifier=IceGrid/NullPermissionsVerifier
IceGrid.Registry.AdminPermissionsVerifier=IceGrid/NullPermissionsVerifier
Ice.LogFile=C:\Windows\ServiceProfiles\LocalService\AppData\Local\ZeroC\icegrid\registry\ice-registry.log
IceGrid.Registry.DynamicRegistration=1
IceGrid.Registry.Trace.Locator=2
- 启动
# icegridregistry ----Ice.Config={配置文件路径}
icegridregistry --Ice.Config=C:/Users/admin/Desktop/wsp/ice_demo/src/main/resources/registry.cfg
启动
先启动注册中心服务, 再启动服务端, 最后启动客户端
icegrid node
icegridnode就是一个ice程序的容器
配置文件
icegrid-node1.cfg
# icegridnode --Ice.Config=C:\Users\admin\Desktop\wsp\ice_demo\src\main\resources\icegrid-node1.cfg
# 节点1的名字
IceGrid.Node.Name=node1
#Ice Registry的协议 地址 端口
Ice.Default.Locator=IceGrid/Locator:tcp -h 127.0.0.1 -p 4061
# 节点1的数据存储目录
IceGrid.Node.Data=C:\Windows\ServiceProfiles\LocalService\AppData\Local\ZeroC\icegrid\gride-node1
# 节点1监听客户端链接端口号
IceGrid.Node.Endpoints=tcp -p 5062
# 输出日志
Ice.StdErr=C:\Windows\ServiceProfiles\LocalService\AppData\Local\ZeroC\icegrid\gride-node1\error.log
Ice.StdOut=C:\Windows\ServiceProfiles\LocalService\AppData\Local\ZeroC\icegrid\gride-node1\out.log
启动
icegridnode --Ice.Config=C:\Users\admin\Desktop\wsp\ice_demo\src\main\resources\icegrid-node1.cfg
icegrid
icegridadmin
管理部署icegrid, 查看节点状态, 启停icegridnode
icegridadmin -u test -p test --Ice.Default.Locator="IceGrid/Locator:tcp -h 127.0.0.1 -p 4061"
使用icegridadmin启动管理服务
icegridadmin会根据配置文件来启动服务
<icegrid>
<application name="HelloService">
<server-template id="HelloServiceTemp">
<parameter name="id"/>
<icebox id="HelloService${id}" exe="java" activation="on-demand">
<option>com.zeroc.IceBox.Server</option>
<env>CLASSPATH=D:\app\ice\bin;C:\Users\admin\Desktop\wsp\ice_demo\target\*</env>
<service name="HelloService" entry="com.demo.icebox.greet.server.GreetIceBoxServer">
<adapter name="HelloServiceAdapter" id="HelloServiceAdapter${id}" replica-group="HelloServiceGroup"/>
</service>
</icebox>
</server-template>
<replica-group id="HelloServiceGroup">
<load-balancing type="round-robin" n-replicas="0"/>
<object identity="HelloService" type="::hello::HelloService"/>
</replica-group>
<node name="node1">
<server-instance template="HelloServiceTemp" id="1"/>
</node>
</application>
</icegrid>
在icegridadmin中启动:
- 先启动iceregistry
- 在启动icegridnode
在icegridadmin中:
application add "C:\Users\admin\Desktop\wsp\ice_demo\src\main\resources\hello-service.xml"
// 查看加载进来的程序
application list
// 启动服务
server list
server start XXXX
小结
本文应该没有后续文章了, 只是在重构旧项目的时候使用到ice, 旧项目已经使用springcloud进行重构。