J2EE与中间件技术

  • 格式:ppt
  • 大小:1.52 MB
  • 文档页数:65

下载文档原格式

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

过程描述( ) 过程描述(2) 描述
4)服务器需要部分地解析消息,找出客户希望 )服务器需要部分地解析消息, 调用的服务器程序 5)服务器构架(Skeleton)对消息进行解析, )服务器构架( )对消息进行解析, 从中获得调用者的参数, 从中获得调用者的参数,然后调用服务器程序 6) 6)服务器程序执行相应的过程 7)服务器程序将结果返回给 )服务器程序将结果返回给Skeleton 8) Skeleton将结果打包,向底层通信机制发 将结果打包, ) 将结果打包 出应答消息 9)服务器端通信机制将消息传送给客户端通信 ) 机制
account_clnt.c
static struct timeval TIMEOUT = { 25, 0 }; int * deposit_1(int *argp, CLIENT *clnt){ static int clnt_res; memset((char *)&clnt_res, 0, sizeof(clnt_res)); if (clnt_call (clnt, deposit, (xdrproc_t) xdr_int, (caddr_t) argp, (xdrproc_t) xdr_int, (caddr_t) &clnt_res, TIMEOUT) != RPC_SUCCESS) { return (NULL); } return (&clnt_res); } int * withdraw_1(int *argp, CLIENT *clnt){ static int clnt_res; memset((char *)&clnt_res, 0, sizeof(clnt_res)); if (clnt_call (clnt, withdraw, (xdrproc_t) xdr_int, (caddr_t) argp, (xdrproc_t) xdr_int, (caddr_t) &clnt_res,TIMEOUT) != RPC_SUCCESS) { return (NULL); } return (&clnt_res); }
基本思想: 基本思想:
保持客户端(调用者)和服务器(被调用的)程序的语 保持客户端(调用者)和服务器(被调用的) 法一样, 法一样,好像它们是在同一台机器上
实现: 实现:
SUN RPC(Solaris上实现) 上实现) ( 上实现 DCE(Distributed Computing Environment) RPC (UNIX,Windows) , )
过程描述( ) 过程描述(1) 描述
1)客户按本地调用的方式 ,直接调用本地的客 ) 直接调用本地的客 户占位程序/指代 代理( 指代/代理 户占位程序 指代 代理(Stub), Stub具有与 ) 具有与 服务器相同的过程接口 2)Stub将客户的调用请求进行加工、打包,向 将客户的调用请求进行加工、 ) 将客户的调用请求进行加工 打包, 底层通信机制(如套接字)发出请求消息; 底层通信机制(如套接字)发出请求消息; Stub不进行任何逻辑处理,只是一个中介 不进行任何逻辑处理, 不进行任何逻辑处理 3)客户端通过底层的通信机制,将消息传送给 )客户端通过底层的通信机制, 服务器端的底层通信机制
发布、维护复杂; 发布、维护复杂;编 写通信的代码复杂; 写通信的代码复杂; 自己开发安全软件
充分利用资源
应用服务器中间件
初始状态: 初始状态:硬件 + 操作系统 + 数据库管理系统 +应用软件 应用软件 程序的共性(稳定)成分: 程序的共性(稳定)成分:网络资源管理 产生了: 产生了:应用服务器中间件 分离出了:业务逻辑(构件) 分离出了:业务逻辑(构件) 中间件之于底层网络编程,如同数据库之于文件系统 中间件之于底层网络编程, 底层网络编程 业务处理服务器 数据服务器 瘦客户 瘦客户 RPC RPC
account.h
extern "C" { #define ACCOUNT 0x20010929 #define ACCOUNT_VER 1 #define deposit 2 extern int * deposit_1(int *, CLIENT *); extern int * deposit_1_svc(int *, struct svc_req *); #define withdraw 1 extern int * withdraw_1(int *, CLIENT *); extern int * withdraw_1_svc(int *, struct svc_req *); extern int account_1_freeresult (SVCXPRT *, xdrproc_t, caddr_t); }
客户端开发过程 IDL
服务器端开发过程
IDL编译器 (rpcgen)
client.c
account_clnt.c
account.h
account _svc.c
server.c
rpclib.o 客户端程序 服务器端程序
1、定义并编译接口 、
银行帐号的例子——接口定义文件 接口定义文件account.x : 银行帐号的例子 接口定义文件
哑终端 客户机/ 客户机/服务器 基于RPC RPC的分布式计算 基于RPC的分布式计算
哑终端(Dumb Terminal) 哑终端
从远程大型主机(mainframe)或强大的 从远程大型主机(mainframe)或强大的 UNIX服务器上运行的整体进程显示结果 UNIX服务器上运行的整体进程显示结果
RPC的体系结构 的体系结构
客户端 stub 服务器
skeleton
Fra Baidu bibliotek
接口定 义语言 (IDL) )
编译环境
基于RPC的开发过程 的开发过程 基于
1、定义并编译接口 、 2、编写实现具体服务功能的代码 、 3、编译、连接,产生可执行的服务器程序 、编译、连接, 4、 4、编写客户端代码 5、编译、连接,产生客户程序 、编译、连接, 6、运行服务器端程序 、 7、运行客户端程序 、
中间层/ 中间层/易于扩展
三层(three-tier)/多层 多层(multi-tier)结构 三层 多层 结构
二、中间件技术集合
远程过程调用( 远程过程调用(RPC) ) 远程数据库访问 分布式事务处理 消息队列
远程过程调用
程序和程序之间通信: 程序和程序之间通信:
客户端应用程序调用位于远端服务器上的过程
需要特别处理:编码、 需要特别处理:编码、字节序 等问题
请求分派
Skeleton的主要工作包括: 的主要工作包括: 的主要工作包括
除了需要进行列集、解列外, 除了需要进行列集、解列外,还需要区分客户所 请求的过程名,然后将客户的请求分派 请求的过程名,然后将客户的请求分派 (dispatch)给正确的过程 )
program ACCOUNT{ version ACCOUNT_VER{ int deposit(int) = 2; int withdraw(int) = 1; }=1; }=0x20010929;
/*过程号 过程号*/ 过程号 /*版本号 版本号*/ 版本号 /*程序号 程序号*/ 程序号
编译后生成三个主要文件:
account_svc.c
int main (int argc, char **argv){ register SVCXPRT *transp; pmap_unset (ACCOUNT, ACCOUNT_VER); transp = svctcp_create(RPC_ANYSOCK, 0, 0); if (transp == NULL) { fprintf (stderr, "%s", "cannot create tcp service."); exit(1); } if (!svc_register(transp, ACCOUNT, ACCOUNT_VER, account_1, IPPROTO_TCP)) { fprintf (stderr, "%s", "unable to register (ACCOUNT, ACCOUNT_VER, tcp)."); exit(1); } svc_run (); fprintf (stderr, "%s", "svc_run returned"); exit (1); }
static void account_1(struct svc_req *rqstp, register SVCXPRT *transp){ union { int deposit_1_arg; int withdraw_1_arg; } argument; char *result; xdrproc_t _xdr_argument, _xdr_result; char *(*local)(char *, struct svc_req *); switch (rqstp->rq_proc) { case NULLPROC: (void) svc_sendreply (transp, (xdrproc_t) xdr_void, (char *)NULL); return; case deposit: _xdr_argument = (xdrproc_t) xdr_int; _xdr_result = (xdrproc_t) xdr_int; local = (char *(*)(char *, struct svc_req *)) deposit_1_svc; break; case withdraw: _xdr_argument = (xdrproc_t) xdr_int; _xdr_result = (xdrproc_t) xdr_int; local = (char *(*)(char *, struct svc_req *)) withdraw_1_svc; break;
软件
操作系统 应用程序
硬件
操作系统
数据库管理系统
初始状态: 初始状态:硬件 + 操作系统 + 应用程序 程序的共性(稳定)成分: 程序的共性(稳定)成分:数据管理 产生了: 产生了:数据库管理系统 分离出了: 分离出了:应用软件
数据库管理系统 应用程序 数据存储文件
操作系统
操作系统
中间件
远程过程调用( 远程过程调用(RPC——Remote Procedure Calling )
哑终端 链接 应用程序, 应用程序,数据库 大型主机
负载大
客户/服务器计算 客户 服务器计算
80年代末,PC的发展⇒两层( tier) 80年代末,PC的发展⇒两层(two tier) 年代末 的发展 客户机/ 客户机/服务器结构
服务器 客户 应用程序 通信软件 TCP/IP 数据库 通信软件
降低主机负载
示例
以对某银行帐户的一个存款过程为例: 以对某银行帐户的一个存款过程为例: 客户端程序
Deposit( 1000) 启动服务器上的存款过程 int Deposit(number){ return total + number; }
服务器端程序
继续运行
调用过程
客户端程序 Local Call
服务器端程序 Remote Procedure Server Skeleton RPC Interface send receive
过程描述( ) 过程描述(3) 描述
10)客户端节点上也可能有多个调出点,通信机 )客户端节点上也可能有多个调出点, 制需要部分地解析返回的消息, 制需要部分地解析返回的消息,找出消息应该返 回给哪个客户程序, 回给哪个客户程序,并将消息发送给对应的 Stub 11) Stub从消息中解析结果,返回给客户程序 从消息中解析结果, ) 从消息中解析结果
Client Stub RPC Interface send receive
Network
列集/ 列集/解列
Stub的主要工作包括: 的主要工作包括: 的主要工作包括
1)建立客户与服务器之间的连接 ) 2)将客户的高层调用语句打包为一条底层的请 ) 求消息,这一过程在RPC中被称为列集 中被称为列集 求消息,这一过程在 中被称为 (marshalling) ) 3)等待服务器返回应答消息 ) 4)将来自服务器底层的应答消息解析为可以返 ) 回的数据,这一过程在RPC中被称为解列 中被称为解列 回的数据,这一过程在 中被称为 (unmarshalling) ) 5)将返回值传送给客户程序 )
J2EE与中间件技术 与中间件技术
——中间件概述 中间件概述
中间件概述
一、发展历史 二、中间件技术集合 三、定义 四、对象中间件
一、发展历史
操作系统
数据库管理系统
中间件
操作系统
初始状态: 初始状态:硬件 + 程序 程序的共性(稳定)成分: 程序的共性(稳定)成分:计算资源管理 产生了: 产生了: 分离出了: 分离出了:
account.h account_clnt.c account_svc.c
1、定义并编译接口 、
使用RPC协议编译工具:rpcgen 协议编译工具: 使用 协议编译工具 account.h:头文件(.h)包括服务器和 : 客户端程序变量、常量、类型等说明; account_clnt.c : Client 端的标准程序 框架; account_svc.c :Server 端的标准程序 框架。