ZerocIce使用demo

快速入门

安装ice软件

ice-java编译器

创建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中启动:

  1. 先启动iceregistry
  2. 在启动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进行重构。

项目demo下载