1.总括
2.概念描述
2.node
3.icebox
3.部署
[["java:package:com.hp.tel.ice"]]
module book{
struct Message{
string name;
int type;
bool valid;
double price;
string content;
};
interface OnlineBook{
Message bookTick(Message msg);
};
};
2.对外java接口
package com;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.hp.tel.ice.book.Message;
import com.hp.tel.ice.book._OnlineBookDisp;
import Ice.Communicator;
import Ice.Current;
import Ice.ObjectAdapter;
import IceBox.Service;
public class OnlineBookImpl extends _OnlineBookDisp implements Service{
private static final long serialVersionUID = -778473257101653957L;
private Logger logger = LoggerFactory.getLogger(this.getClass());
private ObjectAdapter _adapter;
@Override
public void start(String name, Communicator communicator, String[] args) {
System.out.println("调用start方法");
//创建objectAdapter,这里和service同名
_adapter = communicator.createObjectAdapter(name);
//创建servant并激活
Ice.Object object = this;
_adapter.add(object, communicator.stringToIdentity(name));
_adapter.activate();
logger.info("【******* "+name + " start ********】");
}
@Override
public void stop() {
logger.info("【******* "+this._adapter.getName() + " stop ********】");
_adapter.destroy();
}
@Override
public Message bookTick(Message msg, Current __current) {
logger.info("服务器接收到信息:"+msg);
System.out.println("hello "+ msg.name);
msg.name="服务器转化";
return msg;
}
}
3.register配置
# The IceGrid instance name.
IceGrid.InstanceName=DemoIceGrid
#客户端通过测Endpoints访问注册表
IceGrid.Registry.Client.Endpoints=tcp -h localhost -p 4061
IceGrid.Registry.Server.Endpoints=tcp -h localhost
IceGrid.Registry.Internal.Endpoints=tcp -h localhost
#持久化文件存放目录,需要手工创建目录
IceGrid.Registry.Data=D:\ice\icegrid_demo\registry
#动态部署
IceGrid.Registry.DynamicRegistration=1
IceGrid.Registry.PermissionsVerifier=DemoIceGrid/NullPermissionsVerifier
IceGrid.Registry.AdminPermissionsVerifier=DemoIceGrid/NullPermissionsVerifier
IceGrid.Registry.SSLPermissionsVerifier=DemoIceGrid/NullSSLPermissionsVerifier
IceGrid.Registry.AdminSSLPermissionsVerifier=DemoIceGrid/NullSSLPermissionsVerifier
# Dummy username and password for icegridadmin.
IceGridAdmin.Username=test
IceGridAdmin.Password=test
4.node(可以多个)
# The IceGrid locator proxy.
Ice.Default.Locator=DemoIceGrid/Locator:tcp -h localhost -p 4061
#节点名
IceGrid.Node.Name=node1
#指定节点1用于坚挺客户端连接的端口号
IceGrid.Node.Endpoints=tcp -p 5062
#节点1相关数据的存储目录
IceGrid.Node.Data=D:\ice\icegrid_demo\node1
#IceGrid.Node.CollocateRegistry=1
#IceGrid.Node.Output=db
#IceGrid.Node.RedirectErrToOut=1
#指定错误日志文件,若为指定,则直接在node1目录下生成
#Ice.StdErr=D:\ice\icegrid_demo\node1\stdErr.log
#Ice.StdOut=D:\ice\icegrid_demo\node1\stdOut.log
5.application.xml配置(配置iceBox)
<pre name="code" class="html"><icegrid>
<application name="MyPowerIce2">
<properties id="MultiThreaded">
<property name = "Ice.PrintStackTraces" value="1"/>
<property name = "Ice.Trace.Retry" value="2"/>
<property name = "Ice.Trace.Network" value="2"/>
<property name = "Ice.Trace.ThreadPool" value="2"/>
<property name = "Ice.Trace.Locator" value="2"/>
</properties>
<server-template id="HelloServerTemp">
<parameter name="id"/>
<icebox id = "HellowServer${id}" exe="java" activation="on-demand">
<properties>
<properties refid="MultiThreaded"/>
</properties>
<!-- 不可缺少 -->
<option>IceBox.Server</option>
<!-- class文件的地址以及lib的依赖地址 不能有换行符 -->
<env>CLASSPATH=C:\Program Files (x86)\ZeroC\Ice-3.6.3\lib\*;D:\code\Spring\testIceBox\lib\*;D:\code\Spring\testIceBox\target\classes</env>
<!-- 客户端调用时需要这个名字 entry是接口继承类的全文件名(可以配置多个service)-->
<service name="OnlineBook" entry="com.OnlineBookImpl">
<adapter name="OnlineBook" id="OnlineBook${id}" endpoints="tcp" replica-group="OnlineBookRep"/>
</service>
</icebox>
</server-template>
<replica-group id="OnlineBookRep">
<load-balancing type="adaptive" n-replicas="0"/>
<!-- 需要在ice生成的接口的抽象类中找到id,对应下面的type-->
<object identity="OnlineBook" type="::book::OnlineBook"/>
</replica-group>
<span style="white-space:pre"> </span><node name="node1">
<span style="white-space:pre"> </span><server-instance template="HelloServerTemp" id="1"/>
<span style="white-space:pre"> </span> </node>
</application>
</icegrid>
6.客户端程序
package com;
import com.hp.tel.ice.book.Message;
import com.hp.tel.ice.book.OnlineBookPrx;
import com.hp.tel.ice.book.OnlineBookPrxHelper;
public class Client {
public static void main(String [] args){
System.out.println("【客户端开始测试】"+args[0].toString());
int status = 0;
Ice.Communicator ic = null;
try {
//node1.cfg中的链接地址
ic = Ice.Util.initialize(new String[] {"--Ice.Default.Locator=DemoIceGrid/Locator:tcp -h 127.0.0.1 -p 4061"});
//app.xml文件中的server名称
Ice.ObjectPrx base = ic.stringToProxy("OnlineBook");
//在generated中找到接口对应的Helper
OnlineBookPrx onlinBook = OnlineBookPrxHelper.checkedCast(base);
if(onlinBook == null){
throw new Error("Invalid proxy");
}
//调用服务方法
Message msg = new Message();
msg.name = "djl";
msg.type = 3;
msg.price = 99.99;
msg.valid = true;
msg.content = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
System.out.println(onlinBook.bookTick(msg).content);
} catch (Exception e) {
// TODO Auto-generated catch block
status = 1;
e.printStackTrace();
}finally {
if(ic!=null){
ic.destroy();
}
}
System.exit(status);
}
}
7.启动IceGrid
1.注册register (注册服务,然后会在D:\ice\icegrid_demo\registry生成二进制文件,用来保存服务的注册信息)
icegridregistry --Ice.Config=registry.cfg
2.注册node
icegridnode --Ice.Config=node1.cfg
3.启动icegridadmin工具
icegridadmin -u test -p test --Ice.Default.Locator="DemoIceGrid/Locator:tcp -h localhost -p 4061"
注意用户名、密码(register中配置)、以及双引号中的配置(node1中的连接地址)
部署:
application add app.xml 添加iceBox配置文件
remove 删除
list 查看
启动:
server list 查看
server start 名字(查看出来的名字)
remove 删除
启动成功后,node的命令行界面显示如下:
8.利用客户端测试
客户端显示:
服务器在node上打印:
在日志文件中打印:
9.项目结构、及icegrid部署目录
10.pom.xml文件
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>testIceGrid</groupId>
<artifactId>testIceGrid</artifactId>
<version>0.0.1-SNAPSHOT</version>
<properties>
<log4j.version>1.2.17</log4j.version>
<slf4j.version>1.7.2</slf4j.version>
</properties>
<dependencies>
<!-- https://mvnrepository.com/artifact/com.zeroc/ice -->
<dependency>
<groupId>com.zeroc</groupId>
<artifactId>ice</artifactId>
<version>3.6.3</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.zeroc/icebox -->
<dependency>
<groupId>com.zeroc</groupId>
<artifactId>icebox</artifactId>
<version>3.6.3</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${slf4j.version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>${slf4j.version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>jcl-over-slf4j</artifactId>
<version>${slf4j.version}</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>${log4j.version}</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
</dependency>
</dependencies>
<build>
<sourceDirectory>src</sourceDirectory>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.3</version>
<configuration>
<source>1.7</source>
<target>1.7</target>
</configuration>
</plugin>
</plugins>
</build>
</project>
11.log4j.properties文件
# Settings
dir=.
file=ice.log
target=${dir}/${file}
# Set root logger level to DEBUG and add appenders
log4j.rootLogger=DEBUG, A1, A2
# A1 ConsoleAppender
log4j.appender.A1=org.apache.log4j.ConsoleAppender
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=%d{HH:mm:ss} %-5p %c - %m %n
# A2 FileAppender
log4j.appender.A2=org.apache.log4j.FileAppender
log4j.appender.A2.File=${target}
log4j.appender.A2.layout=org.apache.log4j.PatternLayout
log4j.appender.A2.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %p %t %c - %m%n
# A3 RollingFileAppender
log4j.appender.A3=org.apache.log4j.RollingFileAppender
log4j.appender.A3.File=logs/extProfile.log
log4j.appender.A3.MaxFileSize=20480KB
log4j.appender.A3.MaxBackupIndex=10
log4j.appender.A3.layout=org.apache.log4j.PatternLayout
log4j.appender.A3.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %p %t %c - %m%n
# set threshold
#log4j.appender.A1.Threshold=INFO
#log4j.appender.A2.Threshold=INFO