官方网站
此页面包含Ice各个版本的入口;各个平台windows、linux、MacOS;各种语言的入口;各个版本的帮助手册;想要的基本都有。
下载地址:
https://zeroc.com/downloads/ice
可以下载各个版本。
注意,推荐使用chrome浏览器,firefox、IE显示不全。

Windows
msi安装包:【https://download.zeroc.com/Ice/3.6/Ice-3.6.4.msi】,包含各种Ice组件(slice2xxx,icegridregistry、icegridnode、Ice Grid Admin、帮助手册、Demos)
安装后的样子:

Linux
源码安装:参考github.com部分
Yum安装:
源:
cd /etc/yum.repos.d
wget https://zeroc.com/download/Ice/3.7/el7/zeroc-ice3.7.repo
另外两个可用的:
https://zeroc.com/download/Ice/3.6/el7/zeroc-ice3.6.repo
https://zeroc.com/download/Ice/3.6/el6/zeroc-ice3.6.repo
runtime+devel:
yum install ice-all-runtime ice-all-devel
freeze:
yum install libfreeze-c++-develfreeze-utils
IDE辅助工具
https://zeroc.com/downloads/builders
支持Visual Studio、Eclipse、Xcode等
帮助手册
官方:
下载地址:https://zeroc.com/download/Ice/3.7/Ice-3.7.1.pdf
https://zeroc.com/download/Ice/3.6/Ice-3.6.4.pdf
概念
icegridadmin:命令行工具
Ice Grid Admin:java开发的图形界面工具
Ice Box:管理多个dll、so、jar
Service:代码体现----IceBox::Service类
二进制体现--dll、so、jar等
Server:包含IceBox、Application等方式
层次关系(IceBox模式):
一个node下面有N个server、server以IceBox方式运行、IceBox的实现方式是service、一个service有一个adapter、一个adapter管理多个object
node
|----server(N个)【exe=IceBox】
|----service(N个)【so、dll、jar】
|----adapter(代理)

启动配置
注册中心 主从配置

icegridregistry Master
IceGrid.InstanceName=DemoIceGrid
IceGrid.Registry.Client.Endpoints=tcp -h 192.168.1.91 -p 12000
IceGrid.Registry.Server.Endpoints=tcp
IceGrid.Registry.Internal.Endpoints=tcp
IceGrid.Registry.AdminPermissionsVerifier=DemoIceGrid/NullPermissionsVerifier
IceGrid.Registry.Data=C:\IceGrid\registry
IceGrid.Registry.ReplicaName=Master
IceGrid.Registry.Admin.Endpoints=default
icegridregistry Slave
Ice.Default.Locator=DemoIceGrid/Locator:tcp -h 192.168.1.91 -p 12000
IceGrid.Registry.Client.Endpoints=tcp -h 192.168.1.85 -p 12001
IceGrid.Registry.Server.Endpoints=tcp
IceGrid.Registry.Internal.Endpoints=tcp
IceGrid.Registry.Data=C:\IceGrid\registry
IceGrid.Registry.ReplicaName=Replica1
icegridnode1
IceGrid.Node.Endpoints=tcp
IceGrid.Node.Name=Node1
IceGrid.Node.Data=C:\IceGrid\node
Ice.Default.Locator=DemoIceGrid/Locator:tcp -h 192.168.1.91 -p 12000:tcp -h 192.168.1.85 -p 12001
icegridnode2
IceGrid.Node.Endpoints=tcp
IceGrid.Node.Name=Node2
IceGrid.Node.Data=C:\IceGrid\node
Ice.Default.Locator=DemoIceGrid/Locator:tcp -h 192.168.1.91 -p 12000:tcp -h 192.168.1.85 -p 12001
client
Ice.Default.Locator=DemoIceGrid/Locator:tcp -h 192.168.1.91 -p 12000:tcp -h 192.168.1.85 -p 12001
icegridadmin
Ice.Default.Locator=DemoIceGrid/Locator:tcp -h 192.168.1.91 -p 12000:tcp -h 192.168.1.85 -p 12001
问题
Slave是否可以支持多个?Master发生故障如何恢复?
Icegridnode启动的时候会启动icebox进程(依赖xml配置文件),此时手动杀掉icegridnode,icebox将不会消失。再次启动icegridnode,icebox不会增加。
xml模板
引用:xml文件可以相互引用
参考【https://doc.zeroc.com/ice/3.6/ice-services/icegrid/icegrid-xml-features】
<!-- File: A.xml -->
<icegrid>
<server-template id="ServerTemplate">
<parameter name="id"/>
...
</server-template>
</icegrid>
<!-- File: B.xml -->
<icegrid>
<application name="MyApp">
<include file="A.xml"/>
<node name="Node">
<server-instance template="ServerTemplate" .../>
</node>
</application>
</icegrid>
疑问:结合默认的templates.xml进行引用?
registry/config目录可以可以放置多个xml被引用?
template字段引用
依靠id进行引用
声明
<server-template id=”A”…>…</server-template>
<service-template id=”B”…>...</service-template>
引用
<server-instance template="A"…/>
<service-instance template="B"…/>
传参数
参考【https://doc.zeroc.com/ice/3.6/ice-services/icegrid/icegrid-templates】

分组
properties +refid组合
replica-group
env
注意格式
Linux:
<env>SGConfig=config/SGConfig</env>
<env>LD_LIBRARY_PATH=.:lib:/data/lease/Ice-3.6.3/lib64:$LD_LIBRARY_PATH</env>
Windows:
<env>PATH=C:\Ice\lib;%PATH%</env>
load-balancing
adapter 调度方式
参考【https://doc.zeroc.com/ice/3.6/ice-services/icegrid/load-balancing】
Random随机、Adaptive自适应(依靠系统负载信息)、Round Robin轮询、Ordered顺序
导出、导入、更新
通过icegridadmin命令行工具
参考【https://doc.zeroc.com/ice/3.6/ice-services/icegrid/icegridadmin-command-line-tool】
通过Ice Grid Admin图形界面工具
导出:

导入:

撤销、保存到文件、保存到registry(no server restart)、保存到registry(servers may restart)

so部署
A、部署多个so
比较容易实现,一个或者多个so对应一个xml文件进行部署。
B、so部署多套
一个so分散部署到不同的node节点(server),配置信息基本相同。
C、so内部个别接口禁用
不配置Well-known Objects
日志分布
主要有registry、node、service的日志
IceMx.Metric
打开配置
<server…>
<propertyname="IceMX.Metrics.Debug.GroupBy"value="id"/>
<propertyname="IceMX.Metrics.Debug.Disabled"value="1"/>
<propertyname="IceMX.Metrics.ByParent.GroupBy"value="parent"/>
<propertyname="IceMX.Metrics.ByParent.Disabled"value="1"/>
</server>

实时监控
需要选择具体内容(单元格)


IceUtil Ice工具集
优势:跟Ice统一,跨平台
唯一标示:generateUUID
字符集的转换函数:stringToWstring、wstringToString
ICE的依赖版本号
时间管理类IceUtil::Time
定时器和定时任务
线程对象Thread
IceUtil::Shared对象
互斥对象:StaticMutex 、RecMutex 、RecRWMutex 、Monitor
捕获系统信号
内存缓存对象IceUtil::Cache
new对象管理
Metrics – 直接访问Ice 运行时库
参考【https://doc.zeroc.com/technical-articles/general-topics/ice-management-extension-and-metrics】只有Python版本
xml配置
通过C++,结合Metrics.ice接口,访问Node节点的【度量】信息。
前提:xml配置文件中server节点需要增加配置项:


向注册中心Registry注册了服务:IceMXserver,Endpoints:tcp -p 10002 -h localhost
客户端通过间接代理方式,向注册中心Registry查询到IceMXserver代理,进行相关接口操作。
客户端配置文件
Ice.Default.Locator=DemoIceGrid/Locator:tcp-h 39.107.94.140 -p 4062
客户端代码
Ice::InitializationDatainitData;
initData.properties= Ice::createProperties();
initData.properties->load("config.client");
Ice::CommunicatorPtrcommunicator = Ice::initialize(argc, argv, initData);
::Ice::ObjectPrx prxMXserver = communicator->stringToProxy("IceMXserver/admin -f Metrics:tcp -p 10002 -h0.0.0.0");
Metrics.ice
接口主要是Metrics.ice文件中定义:
interface MetricsAdmin
{
1、Ice::StringSeqgetMetricsViewNames(out Ice::StringSeq disabledViews);
2-1、voidenableMetricsView(string name)
throws UnknownMetricsView;
2-2、voiddisableMetricsView(string name)
throws UnknownMetricsView;
1-1、MetricsViewgetMetricsView(string view, out long timestamp)
throws UnknownMetricsView;
1-2、MetricsFailuresSeqgetMapMetricsFailures(string view, string map)
throws UnknownMetricsView;
1-1-1、MetricsFailuresgetMetricsFailures(string view, string map, string id)
throws UnknownMetricsView;
};
Metrics.ice文件原理类似自定义的ice文件,但是不能使用slice2cpp等进行转换,需要使用ice安装目录下的include文件夹下的Metrics.h,比如:D:\ProgramFiles\Ice-3.6.3-win\include\Ice\Metrics.h
基本概念
Views: 分为ByParent、Debug、PerHost、ConnectionPerProtocol四个view
disabled: 具体的view可以禁用
enable: 具体的view可以启用
Map: view里面包含多个map,如:Thread、Invocation、EndpointLookup、111111111Dispatch、ConnectionEstablishment、Connection
Failures: 失败的信息。可以是具体某一个map的汇总;也可以是某一条记录的的11111111失败信息。
id: 每个map里面的具体记录,都有一个id,比较长。

基本流程
1、Ice::StringSeqgetMetricsViewNames(out Ice::StringSeq disabledV
先获取可用和禁用的view(s)。
2-1、voidenableMetricsView(string name)
throws UnknownMetricsView;
2-2、voiddisableMetricsView(string name)
throws UnknownMetricsView;
然后可以改变可用和禁用的view(s)的状态
1-1、MetricsViewgetMetricsView(string view, out long timestamp)
throws UnknownMetricsView;
获取view中的map(s)
1-2、MetricsFailuresSeqgetMapMetricsFailures(string view, string map)
throws UnknownMetricsView;
获取map中的失败汇总信息
1-1-1、MetricsFailuresgetMetricsFailures(string view, string map, string id)
throws UnknownMetricsView;
获取map中具体记录的失败信息
Map关系
各个具体的Metrics(存储map的具体内容的结构),都是派生于Metrics
class Metrics
{
string id;
long total = 0;
int current = 0;
long totalLifetime = 0;
int failures = 0;
};
classThreadMetrics extends Metrics
{
int inUseForIO = 0;
int inUseForUser = 0;
int inUseForOther = 0;
};
classDispatchMetrics extends Metrics
{
int userException = 0;
long size = 0;
long replySize = 0;
};
class ChildInvocationMetrics extends Metrics
{
long size = 0;
long replySize = 0;
};
classCollocatedMetrics extends ChildInvocationMetrics
{
};
classRemoteMetrics extends ChildInvocationMetrics
{
};
classInvocationMetrics extends Metrics
{
int retry = 0;
int userException = 0;
MetricsMap remotes;
MetricsMap collocated;
};
classConnectionMetrics extends Metrics
{
long receivedBytes = 0;
long sentBytes = 0;
};
dictionary<string,int> StringIntDict;
structMetricsFailures
{
string id;
StringIntDict failures;
};
智能指针
【sequence<Metrics> MetricsMap;】
sequence相当于std::vector
::IceMX::MetricsMap遍历出来的是Metrics的智能指针,而不是普通的结构体。这个编译的错误比较难分辨:

IceInternal::Handle<IceMX::Metrics>等价于IceMX::MetricsPtr
dynamicCast
ice文件定义的结构,关键字extend,要使用dynamicCast进行转换
比如:
class ThreadMetrics extends Metrics
{
int inUseForIO = 0;
int inUseForUser = 0;
int inUseForOther = 0;
}
C++代码:
::IceMX::MetricsPtr metrics = …
::IceMX::ThreadMetricsPtr ppp = ::IceMX::ThreadMetricsPtr::dynamicCast(metrics);
slice2html
转换成ice文件对应的帮助文档
整体转换:slice2html *.ice
Linux下c++版本
【39.107.94.140】 /home/lizw/code/Metrics/src
限制
Demo给出的是远程获取Metrics信息,参数中涉及到具体的IP+端口。是否能不指定IP+端口?指定固定端口给部署带来比较多的问题。
答:可以不指定IP。但是不能没有指定端口。
::Ice::ObjectPrxprxMXserver = communicator->stringToProxy("IceMXserver/admin-f Metrics:tcp -p 10002");
网络拓扑

