ICE客户和服务器结构

合集下载

百万用户同时在线游戏服务器架构实现

百万用户同时在线游戏服务器架构实现

百万用户在线网络游戏服务器架构实现一、前言事实上100万游戏服务器,在面对大量用户访问、高并发请求方面,基本的解决方案集中在这样几个环节:使用高性能的服务器、高效率的编程语言、高性能的数据库、还有高性能的架构模型。

但是除了这几个方面,还没法根本解决面临的高负载和高并发问题。

当然用户不断地追求更高的机器性能,而升级单一的服务器系统,往往造成过高的投入和维护成本,性价比大大低于预期。

同时全天候的可用性的要求也不能满足要求,如果服务器出现故障则该项服务肯定会终止。

所以单独追求高性能的服务器不能满足要求,目前基本的解决方案是使用集群技术做负载均衡,可以把整体性能不高的服务器做成高可扩展性,高可用性,高性能的,满足目前的要求。

目前解决客户端和服务器进行底层通讯的交互的双向I/O模型的服务器的成熟方案。

1.windows下,比较成熟的技术是采用IOCP,完成端口的服务器模型。

2.Linux下,比较成熟的技术是采用Epoll服务器模型, Linux 2.6内核中提供的System Epoll为我们提供了一套完美的解决方案。

目前如上服务器模型是完全可以达到5K到20K的同时在线量的。

但5K这样的数值离百万这样的数值实在相差太大了,所以,百万人的同时在线是单台服务器肯定无法实现的。

而且目前几个比较成熟的开发框架,比如ICE,ACE等。

这样,当采用一种新的通信技术来实现通信底层时,框架本身就不用做任何修改了(或修改很少),而功能很容易实现,性能达到最优。

目前采用的ace框架个不错的选择方案,可以不受操作系统的影响,移植比较方便。

对于数据库选择可有许多成熟的方案,目前大多数选择的mysql Master/slave模式,以及oracle RAC方案。

基本可以满足目前的要求,但具体的瓶颈不是在数据库本身,应该还是硬件磁盘I/O的影响更大些。

建议使用盘阵。

这有其他成熟的方案,比如采用NAS解决分布数据存储。

其实最为关键的是服务器的架构和实现,数据流量的负载均衡,体系的安全性,关键影响度,共享数据的处理等等多个方面对100万用户的数据处理有影响,所以都要全面的考虑。

ICE建立数据传输的方法步骤

ICE建立数据传输的方法步骤

快速利用ICE建立数据传输的方法步骤一.Slice项目创建1.创建Silce 项目,创建自己的ice文件SaveData.ice,ice文件必须以.ice后缀结尾,ice编译器只识别该后缀的文件。

2.利用Silce2cpp命令对ice文件进行编译生成相应的cpp文件和h文件,将上述两文件添加到自己的应用程序里。

该部主要是生成服务,这里服务暂时定为SaveData(保存数据),那么就会生成SaveData.cpp和SaveData.h两文件,里面定义了一个SaveData类,该类的存储数据操作函数SaveData(MyData)是个纯虚函数,以后应用程序要用必须重载该纯虚函数。

3.自己的应用程序客户端和服务器端都要引用Silce 项目。

二.服务器端创建1.建立SaveData类的派生类MySaveData类,重载保存数据虚函数。

2.创建含有ICE run time主句柄的CommunicatorPtr 类型的实例。

调用语句Ice::CommunicatorPtr ic;3.初始化CommunicatorPtr实例ic。

调用语句ic = Ice::initialize(argc, argv); initialize函数的两个参数可不设置。

4.通过用途名创建适配器adapter,调用语句Ice::ObjectAdapterPtr adapter=ic->createObjectAdapterWithEndpoints("SaveDataAdapter", "default -p 8800"); "SaveDataAdapter " 就是适配器的名字,最好通过用途进行命名;"default -p 8800"是通过默认网络协议(TCP/IP)进行连接,监听的端口号是8800.5.为服务创建接口servant,调用语句Ice::ObjectPtr object = new MySaveData。

ICE

ICE

8.线程支持: 8.线程支持: Ice run time完全是线程化的,其API是 time完全是线程化的,其API是 线程安全的.作为应用开发都,你无需为 开发线程化的高性能客户和服务器付出额 外努力 ; 9.传输机制无关性: 9.传输机制无关性: ICE目前采用TCP/IP和UDP作为传输 ICE目前采用TCP/IP和UDP作为传输 协议.客户和服务器代码都不需要了解底 层的传输机制 ;
ICE服务 ICE服务
ICE有一些功能特性被实现成ICE服务器,自己开发的应用充当的是这 ICE有一些功能特性被实现成ICE服务器, 些服务器的客户端.ICE服务有:IcePack,IceBox,IceStorm,IcePath,Glacier. 些服务器的客户端.ICE服务有:IcePack,IceBox,IceStorm,IcePath,Glacier. 1. IcePack: IcePack: 我们在第 12页提到过, IcePack 是 Ice的定位服务,用于在使用间接 12页提到过, Ice的定位服务,用于在使用间接 绑定时把符号性的 (symbolic)适配器名解析为协议-地址对. 除了这样 symbolic)适配器名解析为协议-地址对. 的定位服务, IcePack还提供了其他特性: IcePack还提供了其他特性: IcePack 允许你注册服务器,进行自动启动:当客户发出请求时,服 务器无需在运行, IcePack 会在第一个客户请求到达时,随需启动服务器. IcePack 支持部署描述符 (deployment descriptors),能让你轻松地配 descriptors),能让你轻松地配 置含有若干服务器的复杂应用. IcePack 提供了一种简单的对象查找服务,客户可用来获取它们感兴趣 的对象的代理.

ICE整理

ICE整理

互动式连接建立(Interactive Connectivity Establishment ——ICE)草案是由IETF的MMUSIC 工作组开发出来的,它所提供的是一种框架,使各种NA T穿透技术可以实现统一。

该技术可以让基于SIP的V oIP客户端成功地穿透远程用户与网络之间可能存在的各类防火墙。

原文出自【比特网】,转载请保留原文链接:/91/2076091.shtml它通过综合利用现有协议,以一种更有效的方式来组织会话建立过程,使之在不增加任何延迟同时比STUN等单一协议更具有健壮性、灵活性。

2.1 ICE简介交互式连通建立方式ICE(Interactive Connectivity Establishment)并非一种新的协议,它不需要对STUN、TURN或RSIP进行扩展就可适用于各种NAT。

ICE 是通过综合运用上面某几种协议,使之在最适合的情况下工作,以弥补单独使用其中任何一种所带来的固有缺陷。

对于SIP来说,ICE只需要定义一些SDP(Session Description Protocol)附加属性即可,对于别的多媒体信令协议也需要制定一些相应的机制来实现交互式连接建立(Interactive Connectivity Establishment),一种综合性的NAT穿越的技术。

交互式连接建立是由IETF的MMUSIC工作组开发出来的一种framework,可整合各种NAT 穿透技术,如STUN、TURN(Traversal Using Relay NAT,中继NAT实现的穿透)、RSIP (Realm Specific IP,特定域IP)等。

该framework可以让SIP的客户端利用各种NAT 穿透方式打穿远程的防火墙。

4结束语ICE方式的优势是显而易见的,它消除了现有的UNSAF机制的许多脆弱性。

例如传统的STUN有几个脆弱点,其中一个就是发现过程需要客户端自己去判断所在NAT类型,这实际上不是一个可取的做法。

ICE简单实例-hello world

ICE简单实例-hello world

简单的ICE通信应用-Hello World参考《Ice分布式程序设计》马维达译、冯立彬的博客一、简述创建一个非常简单的客户-服务器ice应用。

这个应用提供远地打印功能:客户发送要打印的文本给服务器,再由服务器把文本发给打印机。

打印程序只是把文本打印到终端,而不是真正的打印机。

目的是说明客户怎样与服务器通信。

二、安装ICE下载安装包:/download.html1.安装ice2.配置路径测试slice2java命令配置环境变量:再次测试slice2java命令,显示如下信息,配置完成。

使用myeclipse开发,创建一个项目名为icetest的java工程,创建包demo、demo.servant、demo.client、demo.server。

三、编写Slice 定义编写任何Ice 应用的第一步都是要编写一个Slice 定义,其中含有应用所用的各个接口。

我们为我们的打印应用编写了这样的Slice 定义:module demo {interface Printer {void printString(string s);};};我们把这段文本保存在叫作printer.ice的文件中,存放在src目录下。

我们的Slice 定义含有一个接口,叫作Printer。

目前,我们的接口非常简单,只提供了一个操作,叫作printString。

printString 操作接受一个串作为它唯一的输入参数;这个串的文本将会出现在(可能在远地的)打印机上。

四、编写使用Java 的Ice 应用1. 编译printer.ice在cmd命令行中进入到printer.ice文件所在的目录输入命令:slice2java printer.iceslice2java编译器根据这个printer.ic e文件定义生成一些Java源文件。

我们目前无需关注这些文件的确切内容——它们包含的是编译器生成的代码,与我们在P rinter.ice 中定义的Printer接口相对应。

gridservice:ICE通信之IceGrid服务(二)gridservice

gridservice:ICE通信之IceGrid服务(二)gridservice

gridservice:ICE通信之IceGrid服务(二)gridservice话题:gridservice 使用方法节点一、简介Ice版本:3.1.1使用iceGrid服务实现一个简单的打印系统,主要说明iceGrid的使用方法,系统部署在4台主机上,注册器和打印服务器安装在同一台主机上,如下图所示:下图显示了一个客户端通过间接代理的初始调用,来激活目标服务器。

在这个架构当中不需要花时间手动启动服务。

客户端的寻址请求提示注册器去查询节点的服务器状态并且根据需要启动它。

一旦这个服务启动成功,这个寻址请求完成,并且随后客户端直接和服务端通信。

二、配置注册器、节点1注册器需要一个子目录,在这个目录中创建它的数据库,由注册器和节点1的配置信息在同一个配置文件中,在节点1的服务器上存储该配置文件,如存放在c盘根目录下c:\config,文件名为config。

有几个属性定义了Endpoints,但只有icegrid.registry.client.endpoints的值需要一个固定的端口。

此属性指定IceGrid定位服务的端口; IceGrid的客户端必须在他们的Ice.Default.Locator中包括这个端口。

三、配置节点2在节点2的服务器上存储该配置文件,如存放在c盘根目录下c:\config,文件名为config。

四、Slice 脚本打印服务器实现简单的打印功能,服务端接收客户端的打印信息,并负责将信息打印到终端,打印完成之后,返回给客户端一个打印完成的提示信息。

五、Servant代码六、服务端代码七、客户端代码八、配置客户端九、部署配置文件十、部署标签说明replica-group:定义一个适配器复制组,每一个应用中的适配器通过使用adapter标签中的replica-group属性,将适配器加入到这个复制组中,如:<adaptername=“PrinterAdapter”replica-group=“PrinterAdapters” endpoints=“tcp” />name= PrinterAdapter表明该适配器是复制组的成员。

ICE介绍

ICE介绍

ICE资料整理概念ICE: (The Internet Communications Engine)互联网通信引擎。

是由前CORBA专家开发的新一代面向对象中间件,ICE之轻量级分布式通讯中间件。

介绍:ICE是一种面向对象的中间件平台。

从根本上说,这意味着Ice 为构建面向对象的客户-服务器应用提供了工具、API 和库支持。

Ice 应用适合于异构平台环境中使用:客户和服务器可以采用不同的编程语言,可以运行在不同的操作系统和机器架构上,并且可以使用多种网络技术进行通信。

无论部署环境如何,这些应用的源码都是可移植的。

其采用C/S 模式结构,支持同步调用方式和异步调用方式,异步派发调用方式。

支持跨语言的对象调用。

多种语言之间采用共同的Slice(Specification Language for Ice)进行沟通。

支持ice到C,JAVA,C#,VB,Python,Ruby,PHP等多种语言的映射。

Ice源代码发布包包含一系列的第三方产品(Berkeley DB,bzip2/libbzip2,The OpenSSL Toolkit,SSLeay,Expat,STLport,mcpp)。

特点:1.平台无关性。

无论客户端或者服务端均可用现在流行的开发语言(C++ /JAVA/C#/php)进行开发,并且屏蔽语言差异性。

现在比较流行的方式是客户端用C#开发,与用C++开发的服务端直接通讯。

2.通讯协议多样性。

现在可选择TCP、UDP、HTTP进行通讯,如果对安全要求较高,可选择SSL对传输的数据进行加密。

3.Ice具有丰富的特性。

其性能远是基于jms 所不能比的。

4.ICE注重的是通讯,异构平台,多语言之间,支持远程对象的通讯中间件。

ICE学习总结

ICE学习总结

ICE概念交互式连接建立(Interactive Connectivity Establishment ——ICE)草案是由IETF的MMUSIC工作组开发出来的,它所提供的是一种框架,使各种NAT穿透技术可以实现统一。

ICE定义的是一种标准化的方法,能够确定客户端之间存在的是哪一种类型的NAT 防火墙,并且确定一连串可以用于实现连接的IP地址。

通过使用多种协议及网络连接机制,如STUN(Simple Traversal of UDP Through NATs——STUN),TURN(Traversal Using Relay NAT——TURN),ICE可以了解到客户端所在网络结构以及这些设备可以实现通信的各类网络地址。

ICE的基本流程其实很清晰,分两个步骤,第一步就是收集各种类型的地址,第二步就是将本地和远端的地址进行配对,排序,然后执行连通性检查。

1.NAT穿越技术分析如果通信的双方有一方或者两方在NAT后,就需要进行NAT穿越。

2.1 NAT类型NAT有4种不同的类型1) Full Cone2) Address Restricted Cone3) Port Restricted Cone以上三种NAT通称Cone NAT(圆锥形NAT).我们只能用这种NAT进行UDP打洞.4) Symmetric(对称形)对于这种NAT。

连接不同的外部Server,NAT打开的端口会变化。

也就是内部机器A连接外网机器B时,NAT会打开一个端口,连接外网机器C时又会打开另外一个端口。

2.2常用穿越技术的比较比较常用的NAT穿越技术有STUN,TURN,但是STUN不支持TCP连接的穿越,也不支持对称NAT。

TURN虽然支持TCP连接的应用也可以穿越对称NAT,但是TURN的局限性在于所有报文都必须经过TURNServer转发,增大了包的延迟和丢包的可能性,而且服务器的负担比较大。

ICE将STUN与TURN相结合,如果可以用STUN穿越,就建立P2P连接,否则就通过TURN服务器进行中转,建立relay连接。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

参考《Ice分布式程序设计》马维达译
一、客户与服务器的结构
Ice 客户与服务器内部的逻辑结构如下图所示:
客户与服务器都由这样一些代码混合而成:应用代码、库代码、根据Slice 定义生成的代码:
●Ice 核心为远地通信提供了客户端和服务器端运行时支持。

其中的大量代码
所涉及的是网络通信、线程、字节序,以及其他许多与网络有关的问题,我们的应用代码应该与这些问题隔离开来。

●代理代码是根据你的Slice 定义生成的。

如果你调用代理的某个函数,就会
有一个RPC 消息被发给服务器,调用服务端目标对象上的某个对应的函数。

在上文中提到,如下客户代码中,PrinterPrx代理类是由slice2java命令编译printer.ice文件生成的,
Ice.ObjectPrx base = ic
.stringToProxy("SimplePrinter:default -p 10000"); PrinterPrx printer = PrinterPrxHelper.checkedCast(base);
printer.printString("Hello World!");
当调用printer代理中的printString方法,客户会发送RPC消息,调用服务器上PrinterI类对象中的printString方法。

要想与某个Ice 对象联系,客户必须持有这个对象的代理。

对客户而言,代理就是Ice 对象的代表(该对象可能在远地)。

一个代理充当的是一个Ice 对象的本地大使,客户端中PrinterPrx代理对象就是PrinterI类在客户端的本地的大使。

当客户调用代理上的操作时,Ice run time 会:
1.定位Ice 对象
2.如果Ice 对象的服务器没有运行,就激活它
3.在服务器中激活Ice 对象
4.把所有in 参数传送给Ice 对象
5.等待操作完成
6.把所有out 参数及返回值返回给客户(或在发生错误的情况下抛出异常)
代理封装了完成这一系列步骤所必需的全部信息。

特别地,代理包含有:
●寻址信息:用于让客户端run time 联系正确的服务器
●对象标识:用于确定服务器中的哪一个对象是请求的目标
●可选的facet 标识符:用于确定代理所引用的是对象的哪一个facet
●骨架代码也是根据你的Slice 定义生成的,因此,与你用Slice 定义的对象
和数据的类型是对应的。

骨架代码是客户端代理代码的服务器端等价物:它提供了向上调用接口,允许Ice runtime 把控制线程转交给你编写的应用代码。

●对象适配器是专用于服务器端的Ice API 的一部分:只有服务器才使用对象
适配器。

对象适配器有若干功能:
1、对象适配器把来自客户的请求映射到servant对象上的特定方法。

换句话说,对象适配器会跟踪在内存中,都有哪些servant,其对象标识又是什么。

对象适配器与一个或多个传输端点关联在一起。

servant就是服务器开发者编写的类,客户端发送的请求,最终调用的是servant实例上的方法。

如上文中的服务端代码片段,
Ice.ObjectAdapter adapter =
ic.createObjectAdapterWithEndpoints(
"SimplePrinterAdapter", "default -p 10000");
端点“default -p 10000”与adapter适配器绑定,
串“SimplePrinterAdapter”代表适配器的名称。

如果与某个适配器关联的传输端点不止一个,你可以通过多种传输机制到达在该适配器中的servant。

例如,为了提供不同的服务质量和性能,你可以把一个TCP/IP 端点和一个UDP 端点与一个适配器关联在一起。

2、对象适配器要负责创建可以传给客户的代理。

对象适配器知道它的每个对象的类型、标识,以及传输机制的详细情况,并且会在服务器端应用代码要求创建代理时在其中嵌入正确的信息。

每个对象适配器都维护有一个叫作活动servant 映射表(active servant map)的数据结构。

活动servant 映射表(简称为ASM)是一个查找表,用于把对象标识映射到servant。

当客户把操作调用发给服务器时,请求的目标是特定的传输端点。

传输端点隐含地标识了请求所针对的对象适配器(因为同一个端点只能绑定到一个对象适配器)。

客户藉以发送请求的代理含有对应的对象的标识,客户端run time 会在线路上随调用一起发送这个对象标识。

对象适配器继而使用这个对象标识、在它的ASM 中查找正确的servant,把调用分派给它。

如上文中的服务端代码片段:
Ice.Object object = new PrinterI();
adapter.add(object,
Ice.Util.stringToIdentity("SimplePrinter"));
Add方法将object对象注册到adapter适配器中,并使用串“SimplePrinter”创建一个对象标识,这样在适配器的ASM表中就有了一个
以串“SimplePrinter”标识的servant对象object。

在客户端代码中,使用串"SimplePrinter:default -p 10000"创建PrinterI在客户端的代理对象,串“default -p 10000”即代表适配器,串“SimplePrinter”即为ASM表中的对象标识,当客户端使用代理对象调用PrinterI上的printString方法时,就可以在ASM中定位到对应的对象。

二、Slice(Ice 规范语言)简介
每个Ice 对象都有一个接口,该接口具有一些操作。

接口、操作,还有在客户及服务器间交换的数据的类型,都是用Slice 语言定义的。

如上文中的printer.ice文件:
module demo {
interface Printer {
void printString(string s);
};
};
Slice 允许你以一种独立于特定编程语言(比如C++ 或Java)的方式定义客户-服务器的合约。

Slice 定义由一个编译器编译成特定编程语言的API,也就是说,与你所定义的接口和类型对应的那一部分API,会由生成的代码组成。

1. 客户和服务器使用相同的开发环境
编写任何Ice 应用的第一步都是要编写一个Slice 定义,其中含有应用所用的各个接口。

下图说明客户和服务器都用C++ 开发的情况。

Slice 编译器根据源文件Printer.ice 中的Slice 定义生成了两个文件:一个头文件(Printer.h)和一个源文件(Printer.cpp)。

下图说明客户和服务器都用java 开发的情况。

Slice 编译器根据源文件Printer.ice 中的Slice 定义生成了若干个文件,这些主要分成两部分,一部分是客户端程序依赖的类文件,一部分是服务端程序依赖的类文件。

Slice
开发者Printer.ice Slice-to-Java
编译器
_PrinterDel.java _PrinterDisp.java
_PrinterDelD.java PrinterPrx.java PrinterPrxHolder.java _PrinterOperationsN C.java
Printer.java
PrinterHolder.java
_PrinterOperations.
java
_PrinterDelM.java PrinterPrxHelper.java 客户端
开发者服务端
开发者
java
Ice Run-
Time 库
客户端
可执行程序
服务端可执行程序Client.java Server.java RPC
2. 客户和服务器使用不同的开发环境
如果客户和服务器是用不同的语言开发的,它们不能共享任何源文件或二进制组件。

例如,用Java编写的客户不能包括C++头文件。

下图说明客户用Java编写,而对应的服务器用C++编写的情况。

在这种情况下,客户和服务器开发者是完全独立的,分别使用自己的开发环境和语言映射。

客户和服务器开发者之间的唯一链接是它们各自使用的Slice 定义。

相关文档
最新文档