分布式基础

目录

一、Java中的RPC分布式范例:RMI

1.如何实现网络通讯和并发控制的透明化?

1)RPC(Remote Procedure Call Protocol):远程过程调用

2)RMI:远程方法调用(Remote Method Invocation)

3)实现类RMI的RPC分布式的基本原理

总结



一、Java中的RPC分布式范例:RMI

  •      分布式的定义及解决问题的方式非常简单,即业务服务器接收到用户的计算请求后根据特定的算法,将计算的不同部分交由后台的不同主机处理,待结果汇总后,由业务服务器反馈给客户端。
  •      在这个过程中,开发人员最为关注的就是计算的分发调度方式,因为这涉及到对网络通讯和并发的控制。
  •       如果有一种方式能够将网络通讯和并发控制对程序开发人员透明化,那么将极度简化此类应用的开发成本,RMI就是这样一个范例

1.如何实现网络通讯和并发控制的透明化?

1)RPC(Remote Procedure Call Protocol):远程过程调用:

  • 两台服务器A、B,分别部署不同的应用a,b。当A服务器想要调用B服务器上应用b提供的函数或方法的时候,由于不在一个内存空间,不能直接调用,需要通过网络来表达调用的语义传达调用的数据。
  • 即在远程端的机器上写了一个程序,客户端这边是无法直接调用的,这个时候就出现了一个远程服务调用的概念。
  • RPC是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据。在OSI网络通信模型中,RPC跨越了传输层和应用层。RPC使得开发包括网络分布式多程序在内的应用程序更加容易。RPC采用客户端/服务器模式。请求程序就是一个客户机,而服务提供程序就是一个服务器。
  1. 首先,客户机调用进程发送一个有进程参数的调用信息到服务进程,然后等待应答信息。在服务器端,进程保持睡眠状态直到调用信息到达为止。
  2. 当一个调用信息到达,服务器获得进程参数,计算结果,发送答复信息,然后等待下一个调用信息。
  3. 最后,客户端调用进程接收答复信息,获得进程结果,然后调用执行继续进行。

RPC需要解决的问题 :

  • 通讯问题 : 主要是通过在客户端和服务器之间建立TCP连接,远程过程调用的所有交换的数据都在这个连接里传输。连接可以是按需连接,调用结束后就断掉,也可以是长连接,多个远程过程调用共享同一个连接。
  • 寻址问题 : A服务器上的应用怎么告诉底层的RPC框架,如何连接到B服务器(如主机或IP地址)以及特定的端口,方法的名称名称是什么,这样才能完成调用。比如基于Web服务协议栈的RPC,就要提供一个endpoint URI,或者是从UDDI服务上查找。如果是RMI调用的话,还需要一个RMI Registry来注册服务的地址。
  • 序列化与反序列化 : 当A服务器上的应用发起远程过程调用时,方法的参数需要通过底层的网络协议如TCP传递到B服务器,由于网络协议是基于二进制的,内存中的参数的值要序列化成二进制的形式,也就是序列化或编组,通过寻址和传输将序列化的二进制发送给B服务器。同理,B服务器接收参数要将参数反序列化。B服务器应用调用自己的方法处理后返回的结果也要序列化给A服务器,A服务器接收也要经过反序列化的过程。

2)RMI:远程方法调用(Remote Method Invocation)

能够让在某个Java虚拟机上的对象像调用本地对象一样调用另一个Java 虚拟机中的对象上的方法.

  1. RMI是Java的一组拥护开发分布式应用程序的API。RMI使用Java语言接口定义了远程对象,它集合了Java序列化和Java远程方法协议(Java Remote Method Protocol)。简单地说,这样使原先的程序在同一操作系统的方法调用,变成了不同操作系统之间程序的方法调用,由于J2EE是分布式程序平台,它以RMI机制实现程序组件在不同操作系统之间的通信。
  2. RMI大大增强了Java开发分布式应用的能力,是开发百分之百纯Java的网络分布式应用系统的核心解决方案之一。其实它可以被看作是RPC的Java版本。但是传统RPC并不能很好地应用于分布式对象系统。而Java RMI 则支持存储于不同地址空间的程序级对象之间彼此进行通信,实现远程对象之间的无缝远程调用,用RMI开发的应用系统可以部署在任何支持JRE的平台上。

RMI使用的一般流程: 

  1. 客户对象调用客户端辅助对象上的方法;
  2. 客户端辅助对象打包调用信息(变量,方法名),通过网络发送给服务端辅助对象;
  3. 服务端辅助对象将客户端辅助对象发送来的信息解包,找出真正被调用的方法以及该方法所在对象;
  4. 调用真正服务对象上的真正方法,并将结果返回给服务端辅助对象;
  5. 服务端辅助对象将结果打包,发送给客户端辅助对象;
  6. 客户端辅助对象将返回值解包,返回给客户对象;
  7. 客户对象获得返回值。

对于客户对象来说,步骤2-6是完全透明的,也就意味着,开发人员无需关注任何的网络数据传输处理。

RMI的一些限制:

  •  RMI的一个优势也是其缺陷的体现:为了满足计算任务调度的开发规范性和统一的异常处理,RMI对开发的流程规范比较严格,因此需要在业务代码中侵入较多的RMI特定API,而某些API在无异常情况下对业务几乎无实际作用,如业务接口必须继承自Remote,每个方法都需要抛出RemoteException,业务实现还需要继承自特定的类等等,这对于很多习惯了快速开发,不愿意被太多的系统框架结果限制的开发团队来说需要极大的成本去适应这个开发过程,而且容易由于习惯性的忽略导致最终系统运行的异常。
  • RMI使用了通用统一的网络通讯方式,客户端参数传递即服务器端计算完成后的返回值传递使用了通用的序列化方式,这对于一些需要在完成分布式调度时对数据进行自定义的安全加密流程的项目来说,无疑是一个不好的消息,另一方面,RMI采用了标准的Socket通讯,这对于系统建立在其他网络通讯协议上的业务系统来说也是一个很大的障碍。
  • 由于JRMP的数据序列化部分是专为Java对象制定的,因此,RMI对于用非Java语言开发的应用系统的支持不足。不能与用非Java语言书写的对象进行通信。
  • (如果在项目中因为上述原因不愿意选择原生RMI完成网络计算任务调度,那么可以根据RMI的基本实现原理自行实现一套无需太多开发规范限制并能够自由扩展加密方式、底层网络协议实现方式的PR实现类RMI的RPC分布式的基本原理C调度模块。)

3)实现类RMI的RPC分布式的基本原理

  • RMI应用程序通常包括两个独立的程序:服务器程序和客户端程序。典型的服务器应用程序将创建多个远程对象,使这些远程对象能够被引用,然后等待客户机调用这些远程对象的方法。而典型的客户端程序则从服务器中得到一个或多个远程对象的引用,然后调用远程对象的方法。RMI为服务器和客户端进行通信和信息传递提供了一种机制。
  • 在与远程对象的通信过程中,RMI使用标准机制:stub和skeleton。远程对象的stub担当远程对象的客户本地代表或代理人角色。调用程序将调用本地stub的方法,而本地stub将负责执行对远程对象的方法调用。在RMI中,远程对象的stub与该远程对象所实现的远程接口集相同。调用stub的方法时将执行下列操作:

(1) 初始化与包含远程对象的远程虚拟机的连接;

(2) 对远程虚拟机的参数进行编组(写入并传输);

(3) 等待方法调用结果;

(4) 解编(读取)返回值或返回的异常;

(5) 将值返回给调用程序。为了向调用程序展示比较简单的调用机制,stub将参数的序列化和网络级通信等细节隐藏了起来。在远程虚拟机中,每个远程对象都可以有相应的skeleton(在JDK1.2以后的环境中便无需开发人员编写具体Stub和skeleton,而是自动生成)。

  • Skeleton负责将调用分配给实际的远程对象实现。

它在接收方法调用时执行下列操作:

(1) 解编(读取)远程方法的参数;

(2) 调用实际远程对象实现上的方法;

(3) 将结果(返回值或异常)编组(写入并传输)给调用程序。

  • stub和skeleton由rmic编译器生成。

利用RMI编写分布式对象应用程序需要完成以下工作:

(1) 定位远程对象。应用程序可使用两种机制中的一种得到对远程对象的引用。它既可用RMI的简单命名工具rmiregistry来注册它的远程对象,也可以将远程对象引用作为常规操作的一部分来进行传递和返回。

(2)与远程对象通信。远程对象间通信的细节由RMI处理,对于程序员来说,远程通信看起来就像标准的Java方法调用。

(3)给作为参数或返回值传递的对象加载类字节码。因为RMI允许调用程序将纯Java对象传给远程对象,所以,RMI将提供必要的机制,既可以加载对象的代码又可以传输对象的数据。在RMI分布式应用程序运行时,服务器调用注册服务程序以使名字与远程对象相关联。客户机在服务器上的注册服务程序中用远程对象的名字查找该远程对象,然后调用它的方法。 


根据对RMI任务调度的过程和基本实现原理的分析,可以看出,如果借鉴原生RMI的思想自行实现一套自定义的PRC组件主要需要借助Java的以下几个特征或功能:

1.Java网络开发 2.Java反射机制 3.重要的常用设计模式:Java动态代理 

反射

JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。

Java反射机制主要提供了以下功能:

  1. 在运行时判断任意一个对象所属的类;
  2. 在运行时构造任意一个类的对象;
  3. 在运行时判断任意一个类所具有的成员变量和方法;
  4. 在运行时调用任意一个对象的方法;生成动态代理。 

代理模式

代理模式是一种常用的设计模式,其目的就是为其他对象提供一个代理以控制对某个真实对象的访问。代理类负责为委托类预处理消息,过滤消息并转发消息,以及进行消息被委托类执行后的后续处理。

通过使用代理,通常有两个优点:

1.可以隐藏委托类的实现;

2.可以实现客户与委托类间的解耦,在不修改委托类代码的情况下能够做一些额外的处理。

动态代理

代理模式是为了提供额外或不同的操作,而插入的用来替代”实际”对象的对象,这些操作涉及到与”实际”对象的通信,因此代理通常充当中间人角色。Java的动态代理比代理的思想更前进了一步,它可以动态地创建并代理并动态地处理对所代理方法的调用。在动态代理上所做的所有调用都会被重定向到单一的调用处理器上,它的工作是揭示调用的类型并确定相应的策略。


总结

Java中通常使用动态代理模式在代理处理器中完成分布式RPC调用的网络连接、数据传输和并发控制处理,由于Java的反射机制和部分动态特性,使用动态代理后,这些操作可以完全对用户(开发人员)透明,用户可以方便的以本地方法调用的方式调用远程端声明实现的业务方法(计算过程在远程端实现)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值