Ice基础知识

  1. 官方网站

https://doc.zeroc.com/

此页面包含Ice各个版本的入口;各个平台windows、linux、MacOS;各种语言的入口;各个版本的帮助手册;想要的基本都有。

  1. 下载地址:

https://zeroc.com/downloads/ice

可以下载各个版本。

注意,推荐使用chrome浏览器,firefox、IE显示不全

  1. Windows

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

安装后的样子:

  1. Linux
  1. 源码安装:参考github.com部分
  1. 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

  1. IDE辅助工具

https://zeroc.com/downloads/builders

支持Visual Studio、Eclipse、Xcode等

  1. 帮助手册

官方:

下载地址:https://zeroc.com/download/Ice/3.7/Ice-3.7.1.pdf

https://zeroc.com/download/Ice/3.6/Ice-3.6.4.pdf

  1. 概念

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(代理)

  1. 启动配置

注册中心 主从配置

  1. 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
  1. 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
  1. 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

  1. 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 

  1. client
Ice.Default.Locator=DemoIceGrid/Locator:tcp -h 192.168.1.91 -p 12000:tcp -h 192.168.1.85 -p 12001

  1. icegridadmin
Ice.Default.Locator=DemoIceGrid/Locator:tcp -h 192.168.1.91 -p 12000:tcp -h 192.168.1.85 -p 12001

  1. 问题

Slave是否可以支持多个?Master发生故障如何恢复?

Icegridnode启动的时候会启动icebox进程(依赖xml配置文件),此时手动杀掉icegridnode,icebox将不会消失。再次启动icegridnode,icebox不会增加。

  1. xml模板

  1. 引用: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被引用?

  1. template字段引用

依靠id进行引用

声明

                <server-template id=”A”…>…</server-template>
                <service-template id=”B”…>...</service-template>

引用

                <server-instance template="A"…/>
                <service-instance template="B"…/>

  1. 传参数

参考【https://doc.zeroc.com/ice/3.6/ice-services/icegrid/icegrid-templates】

  1. 分组

  1. properties +refid组合

  1. replica-group

  1. env

参考【https://doc.zeroc.com/ice/3.6/ice-services/icegrid/icegrid-xml-reference/setting-environment-variables-in-descriptors】

注意格式

                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>

  1. load-balancing

adapter 调度方式

参考【https://doc.zeroc.com/ice/3.6/ice-services/icegrid/load-balancing】

Random随机、Adaptive自适应(依靠系统负载信息)、Round Robin轮询、Ordered顺序

  1. 导出、导入、更新

  1. 通过icegridadmin命令行工具

参考【https://doc.zeroc.com/ice/3.6/ice-services/icegrid/icegridadmin-command-line-tool

  1. 通过Ice Grid Admin图形界面工具

  1. 导出:

  1. 导入:

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

  1. so部署

A、部署多个so

比较容易实现,一个或者多个so对应一个xml文件进行部署。

B、so部署多套

一个so分散部署到不同的node节点(server),配置信息基本相同。

C、so内部个别接口禁用

不配置Well-known Objects

  1. 日志分布

主要有registry、node、service的日志

  1. IceMx.Metric

  1. 打开配置

                    <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>

  1. 实时监控

需要选择具体内容(单元格)

  1. IceUtil Ice工具集

优势:跟Ice统一,跨平台

唯一标示:generateUUID

字符集的转换函数:stringToWstring、wstringToString

ICE的依赖版本号

时间管理类IceUtil::Time

定时器和定时任务

线程对象Thread

IceUtil::Shared对象

互斥对象:StaticMutex 、RecMutex 、RecRWMutex 、Monitor

捕获系统信号

内存缓存对象IceUtil::Cache

new对象管理

  1. Metrics – 直接访问Ice 运行时库

参考【https://doc.zeroc.com/technical-articles/general-topics/ice-management-extension-and-metrics】只有Python版本

  1. 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");

  1. 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

  1. 基本概念

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. 基本流程

        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中具体记录的失败信息

  1. 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;
        };
         
  1. 智能指针

参考【https://doc.zeroc.com/ice/3.6/language-mappings/c++-mapping/client-side-slice-to-c++-mapping/smart-pointers-for-classes】

【sequence<Metrics> MetricsMap;】

sequence相当于std::vector

::IceMX::MetricsMap遍历出来的是Metrics的智能指针,而不是普通的结构体。这个编译的错误比较难分辨:

IceInternal::Handle<IceMX::Metrics>等价于IceMX::MetricsPtr

  1. 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);

  1. slice2html

转换成ice文件对应的帮助文档

整体转换:slice2html *.ice

  1. Linux下c++版本

【39.107.94.140】 /home/lizw/code/Metrics/src

  1. 限制

Demo给出的是远程获取Metrics信息,参数中涉及到具体的IP+端口。是否能不指定IP+端口?指定固定端口给部署带来比较多的问题。

答:可以不指定IP。但是不能没有指定端口。

::Ice::ObjectPrxprxMXserver = communicator->stringToProxy("IceMXserver/admin-f Metrics:tcp -p 10002");

  1. 网络拓扑

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值