前言

IceGrid是一个提供服务定位和服务激活的组件,但它的功能远不止于此。从它的命名可以看出它的设计理念—网格计算(grid computing)。网格计算被定义为由一系列关联的廉价计算机组成的计算网络。将写好的应用运行于网格计算中的主机上,只是应用整个生命周期中一部分工作。虽然Ice为应用的各个组成部分的之间通信提供了基础设施(RPC通信框架),但是我们还会面临很多挑战:

  • 如何安装升级网格计算中的应用
  • 如何跟踪网格计算中运行的服务
  • 如何分发负载到所有的主机
  • 如何将服务从一个主机迁移到另外一个主机
  • 如何快速添加一个主机到网格中

今天看到这些分布式应用也面临问题时,是不是立马会想到容器,K8S,这个当下比较主流的解决方案。要知道Ice在十几年前就实现了一个成熟解决方案--IceGrid。以下是它的特性:

  • 定位服务(Location service)
  • 按需激活服务器(On-demand server activation)
  • 应用分发(Application distribution)
  • 复制和负载均衡(Replication and load balancing)
  • 会话和资源分配(Sessions and resource allocation)
  • 自动故障恢复(Automatic failover)
  • 动态查询(Dynamic queries)
  • 管理(Adminstration)
  • 部署(Deployment)

IceGrid使得开发人员摆脱了这些低级的任务,加快了应用构建,简化了应用部署管理。

原理框架

IceGrid主要有两个重要的组成:注册中心(registry)和节点(node)。注册中心主要是维护服务路由信息,以及一个客户端请求过来后,去启动指定服务器;

或者根据各个主机的负载情况,返回路由信息。节点可以看做一个服务器集合,管理着这些服务器。如下图,一个简单的IceGrid应用:

从客户端角度,registry就是一个名字服务,将间接代理标识串,如 SimplePrinter@PrinterAdapter转化成服务器连接端点。

以一次客户端调用为例:

1.客户端先向注册中心发起定位请求,通过间接代理标识串获取到对象适配器(PrinterAdapter)的服务地址端口

2.通过服务地址端口与Server(PrinterServer)建立连接

3.调用checkedCast,检验对象(SimplePrinter)是否存在

4.如果服务对象存在,则发起远程调用过程。不存在则抛出异常

环境部署

软件包安装参考官方文档。本文章运行的环境是:ubuntu 16.04,ice 3.7.2

registry和node的启动脚本和配置文件见:https://github.com/GodMonking/ice-demo/tree/main/deploy

启动registry

配置文件registry.cfg:

# Registry properties
IceGrid.InstanceName=MKIceGrid Ice.Default.Locator=MKIceGrid/Locator:tcp -p 4061 IceGrid.Registry.ReplicaName=Master
#IceGrid.Registry.Client.Endpoints=tcp -p 4061
IceGrid.Registry.Client.Endpoints=tcp -p 4061
IceGrid.Registry.Server.Endpoints=tcp
IceGrid.Registry.Internal.Endpoints=tcp IceGrid.Registry.AdminPermissionsVerifier=MKIceGrid/NullPermissionsVerifier
IceGrid.Registry.AdminPermissionsVerifier=MKIceGrid/NullPermissionsVerifier
IceGrid.Registry.SSLPermissionsVerifier=MKIceGrid/NullSSLPermissionsVerifier
IceGrid.Registry.AdminSSLPermissionsVerifier=MKIceGrid/NullSSLPermissionsVerifier
IceGrid.Registry.Discovery.Interface=127.0.0.1 IceGrid.Registry.LMDB.MapSize=10
#注册中心数据保存路径
IceGrid.Registry.LMDB.Path=/data/ice-demo/deploy/registry
IceGrid.Registry.DynamicRegistration=1 IceGrid.Registry.Trace.Node=1
IceGrid.Registry.Trace.Replica=1 #
# Dummy username and password for icegridadmin.
#
IceGridAdmin.Username=foo
IceGridAdmin.Password=bar

执行命令:

/usr/bin/icegridregistry --Ice.Config=./config/registry.cfg --daemon

启动node

启动两个node节点

配置文件node.cfg:

# Node properties
#默认定位器,即注册中心的服务地址端口
Ice.Default.Locator=MKIceGrid/Locator:tcp -p 4061
IceGrid.Node.Endpoints=tcp
IceGrid.Node.Name=node1
#数据存储路径
IceGrid.Node.Data=/data/ice-demo/deploy/node1
#日志输出路径
IceGrid.Node.Output=/tmp/node1
IceGrid.Node.Trace.Replica=2
IceGrid.Node.Trace.Activator=3
IceGrid.Node.Trace.Adapter=3
IceGrid.Node.Trace.Server=3

拷贝node.cfg :cp node.cfg node2.cfg

修改配置node2.cfg结果如下:

# Node properties
Ice.Default.Locator=MKIceGrid/Locator:tcp -p 4061
IceGrid.Node.Endpoints=tcp
IceGrid.Node.Name=node2
IceGrid.Node.Data=/data/ice-demo/deploy/node2
IceGrid.Node.Output=/tmp/node2
IceGrid.Node.Trace.Replica=2
IceGrid.Node.Trace.Activator=3
IceGrid.Node.Trace.Adapter=3
IceGrid.Node.Trace.Server=3

执行命令:

/usr/bin/icegridnode --Ice.Config=./config/node.cfg –daemon
/usr/bin/icegridnode --Ice.Config=./config/node2.cfg –daemon

通过命令行工具查看是否部署成功:

/usr/bin/icegridadmin -H localhost -P 4061

由于注册中心没有开启鉴权,所以这里账号密码任意输入。

也可以通过IceGrid GUI工具查看。Windows下安装IceGrid GUI,打开IceGrid GUI,新建一个连接,登录注册中心

服务部署

部署配置文件,客户端程序和服务端程序代码见:

https://github.com/GodMonking/ice-demo/tree/main/IceGrid/Printer

简单应用开发

服务端部分代码:

int
main(int argc, char* argv[])
{
try
{
if (argc < 2)
{
cerr << "not input config file" << endl;
return 1;
} Ice::CommunicatorHolder ich(argc, argv);
auto communicator = ich.communicator();
auto properties = communicator->getProperties();
cout << "adapter: " << properties->getProperty("SimplePrinterAdapter.AdapterId") << endl;
//注意这里的对象适配器名字要与下文的部署配置中的adaptor的属性name保持一致
auto adapter = ich->createObjectAdapter("SimplePrinterAdapter");
auto servant = make_shared<PrinterI>();
adapter->add(servant, Ice::stringToIdentity("SimplePrinter"));
adapter->activate();
cout << "activate complete..." << endl;
ich->waitForShutdown();
}
catch(const std::exception& e)
{
cerr << e.what() << endl;
return 1;
}return 0;
}

客户端程序代码:

#include <Ice/Ice.h>
#include <Printer.h>
#include <stdexcept> using namespace std;
using namespace Demo; int
main(int argc, char* argv[])
{
try
{
//Ice::CommunicatorHolder ich(argc, argv, "config.client");
Ice::CommunicatorHolder ich(argc, argv);
auto base = ich->stringToProxy("SimplePrinter@SimplePrinterAdapter");
auto printer = Ice::checkedCast<PrinterPrx>(base);
if(!printer)
{
throw std::runtime_error("Invalid proxy");
} printer->printString("Hello World!");
}
catch(const std::exception& e)
{
cerr << e.what() << endl;
return 1;
}
return 0;
}

"SimplePrinter@SimplePrinterAdapter"表示一个间接代理的标识字符串,

SimplePrinterAdapter表示对象适配器ID,对应下文部署配置中adaptor的属性id值。

客户端配置文件config.client:

Ice.Default.Locator=MKIceGrid/Locator:tcp -p 4061

上述配置表示一个定位器,定位器即注册中心提供服务地址端口。

部署配置文件

应用程序部署配置文件主要是向注册中心描述几个重要元素:Nodes,Servers,Object adaptors,Objects。如下图配置文件:

<icegrid>
<application name="Ripper">
<node name="node1">
<server id="PrinterServer" exe="/data/ice-demo/IceGrid/Printer/server" activation="on-demand">
<adapter name="SimplePrinterAdapter" id="SimplePrinterAdapter" endpoints="tcp"/>
<property name="Ice.Trace.Network" value="1"/>
<property name="Ice.PrintStackTraces" value="1"/>
<property name="Ice.Admin.Endpoints" value="tcp" />
</server>
</node>
</application>
</icegrid>

上图中,元素node描述了server归属于node1节点,即表明PrinterServer部署在node1所在主机上。元素server的属性exe则描述可执行文件的路径,

属性activation描述服务器激活方式,“on-demand”表示按需激活,即有请求达到时才被激活。元素adaptor描述了对象适配器(Object adaptor)的信息。

通过IceGrid GUI部署应用

点击如下箭头所指按钮

打开配置文件

加载之后生成表单,如下;点击箭头所指按钮,将配置保存到注册中心

可以看到node1下面已经有服务PrinterServer

验证服务

执行客户端程序

./client --Ice.Config=config.client

可以看到服务被激活

选择服务右击鼠标,查看标准输出信息:

结尾

IceGrid不仅提供了定位服务,负载均衡等功能,同时还简化了服务发布和部署。本文介绍了IceGrid的一个简单应用,后续文章会介绍它的高级部署模式。

Ice系列--强大如我IceGrid的更多相关文章

  1. ICE系列之3对象接口定义语言——slice

         Slice 定义由编译器编译到特定的实现语言 .编译器把与语言无关的定 义翻译成针对特定语言的类型定义和 API.开发者使用这些类型和 API 来 提供应用功能,并与 Ice 交互.用于各种 ...

  2. ICE系列之2——ICE的服务与好处

    ice服务: IcePack         我们在第 12 页提到过, IcePack 是 Ice 的定位服务,用于在使用间接绑定时把符号性的 (symbolic)适配器名解析为协议-地址对. 除了 ...

  3. ZeroC Ice IceGrid Node和IceGrid

    IceGrid Node介绍 绝大多数分布式系统都有一个共同特点,即分布在各个主机上的节点进程并不是完全独立的,而是彼此之间有相互联系和通信的.集群对集群中的节点有一些控制指令,如部署.启停或者调整某 ...

  4. ice介绍 z

    什么是ICE(Internet Communications Engine)呢,它是由Zeroc公司开 发的一套开源中间件系统,与DCOM,CORBA,WEB SERVICEDcom类似,支持RPC( ...

  5. IceGrid负载均衡部署 z

    [IceGrid负载均衡部署步骤]1.环境主机1:IP=192.168.0.239,上面部署注册表服务器registry和节点node1,registry和node1运行在同一进程中:主机2:IP=1 ...

  6. 使用spring boot和thrift、zookeeper建立微服务

    Spring cloud适应于云端服务,也适用于企业信息化SOA建设.spring boot也是restful微服务开发的利器.但对于内网服务,即服务与服务之间的调用,spring并没有去刻意封装,也 ...

  7. nmap -- write a nmap script

    漏洞扫描 --编写Nmap脚本 2006年12月份,Nmap4.21 ALPHA1版增加脚本引擎,并将其作为主线代码的一部分.NSE脚本库现在已经有400多个脚本.覆盖了各种不同的网络机制(从SMB漏 ...

  8. 读书笔记 effective c++ Item 55 让你自己熟悉Boost

    你正在寻找一个高质量的,开源的,与平台和编译器无关的程序库的集合?看一下Boost吧.想加入一个由雄心勃勃的,充满天赋的正致力于最高水平的程序库设计和实现工作的C++程序员们组成的团体么?看一下Boo ...

  9. spring boot和thrift、zookeeper建立微服务

    原文地址:http://www.cnblogs.com/skyblog/p/5535418.html Spring cloud适应于云端服务,也适用于企业信息化SOA建设.spring boot也是r ...

  10. STM32F429的LTDC和DMA2D ***

    在阅读了STM32F429的手册之后,对LTDC与DMA2D有了一点认识. STM32F429与之前的系列强大之处就在于增加了LTDC个功能,从手册上看STM32F429的LTDC可以用于驱动1024 ...

随机推荐

  1. 演示 pull解析的基本步骤(代码演示)

       pull解析器:            * 反序列化:将xml中的数据取出                1.导入jar包                2.创建解析器工厂           ...

  2. 图片放大方法、、菜单栏的位置随滚轮移动固定方法、、&lt;a&gt;&lt;/a&gt;去外层虚线方法:a:focus { outline:none; -moz-outline:none;};

    图片放大方法一: <style type="text/css">.xt{ width:230px; height:230px;}.tp{ width:230px; he ...

  3. 【概率】Uva 10900 - So you want to be a 2n-aire?

    写完这题赶紧开新题... 话说这题让我重新翻了概率论课本,果然突击完了接着还给老师了,毫无卵用. 很多人拿这位大神的题解作引,在这我也分享给大家~ 对于其中的公式在这里做一点简要的说明.因为自己也是理 ...

  4. 解决 子进程已安装的 post-removal脚本返回了错误号 100 的方法

    打开终端: $gksudo nautilus 进入目录: /var/lib/dpkg 删除: info info.bak (文件夹) 重建文件夹: info 之后重新安装 或删除就可以了.

  5. J2EE 项目 org.apache.jasper.JasperException: 解决方法

    项目从一个电脑转移到另一台电脑总是有各种意外qaq~ 刚放假把从实验室的项目拷回自己的电脑回家继续coding,结果出了这个错误.... 各个地方都调试原来是Tomcat版本问题!!!我电脑上的是6. ...

  6. [Swift]LeetCode746. 使用最小花费爬楼梯 | Min Cost Climbing Stairs

    On a staircase, the i-th step has some non-negative cost cost[i] assigned (0 indexed). Once you pay ...

  7. kubernetes之ingress及ingress controller

    什么是ingress Ingress是授权入站连接到达集群服务的规则集合. 从外部流量调度到nodeprot上的service 从service调度到ingress-controller ingres ...

  8. Chrome 扩展

    http://www.cnblogs.com/coco1s/p/8004510.html

  9. jsp 嵌入页面

    <section id="main-content"> <section class="wrapper"> <jsp:includ ...

  10. shell命令xargs解析

    1.多行变成单行 -bash-3.2# cat test.txt a b c d e f g o p q -bash-3.2# cat test.txt |xargs a b c d e f g o  ...