`
dannyhz
  • 浏览: 379419 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

深入剖析 Java RMI 技术实现原理

    博客分类:
  • rmi
RMI 
阅读更多
RMI(Remote Method Invocation)远程方法调用是 java 的核心技术之一。是 Enterprise JavaBeans 的基础技术,是 java 建立分布式应用程序的强大支柱。

RMI 允许一个应用程序访问另外一个服务器或虚拟机上的对象,方法和服务,它使远程方法调用就像在本地调用一样简单。它为用户屏蔽了底层的网络传输细节,使用的时候只需适当处理异常即可。所以 RMI 是非常容易使用的,但同时是非常强大的。

RMI 协议的数据序列化目前支持以下两种模式:
1.基于 JDK 本身的对象序列化
2.基于 HTTP 协议的数据序列化

协议数据序列化原文说明如下:


The RMI protocol makes use of two other protocols for its on-the-wire format: Java Object Serialization and HTTP. The Object Serialization protocol is used to marshal call and return data. The HTTP protocol is used to "POST" a remote method invocation and obtain return data when circumstances warrant. Each protocol is documented as a separate grammar. Nonterminal symbols in production rules may refer to rules governed by another protocol (either Object Serialization or HTTP). When a protocol boundary is crossed, subsequent productions use that embedded protocol.

引用

数据传输数据包一共分两种,一种是数据输出流,另一种是数据输入流。

输出流与输入流都是成对出现和使用。

输出流数据包格式


输出流数据包的内容说明如下:
◦Header 头
◦Messages 消息体
◦HttpMessage(可选)

Header:头数据包说明
0x4a 0x52 0x4d 0x49 Version Protocol

Header 包含四个固定字节的标识加版本号,协议信息构成

Version 数据包说明(两个字节)
0x00 0x01

Protocol 协议(一个字节),一共分三种 StreamProtocol、SingleOpProtocol 和 MultiplexProtocol。

分别对应的值如下:
◦StreamProtocol:0x4b
◦SingleOpProtocol:0x4c
◦MultiplexProtocol:0x4d

Messages:数据包说明

针对 Message 的消息体,由与上面的 Protocal 协议类型指定相关。

如果是 SingleOpProtocol 则消息体只包含一条消息。一般用于 HTTP 方式请求。

The Messages are wrapped within a particular protocol as specified by Protocol. For the SingleOpProtocol, there may only be one Message after the Header, and there is no additional data that the Message is wrapped in. The SingleOpProtocol is used for invocation embedded in HTTP requests, where interaction beyond a single request and response is not possible.


SingleOpProtocol 和 MultiplexProtocol 消息则需要服务器返回 0x4e 字节作为响应。

Message 的类型包含以下三种:
1.Call 表示 RMI 的调用操作
2.Ping 是检测服务是否运行正常
3.DgcAck 当客户端收到服务端的对象消息后告诉服务器可以把返回值对象进行 gc 操作。

Call 消息数据内容:
0x50 CallData

Ping 消息数据内容:
0x52

DgcAck 消息数据内容:
0x54 UniqueIdentifier

CallData:RMI 方法请求数据包
ObjectIdentifier Operation Hash Arguments(可选)

◦ObjectIdentifier (the target of the call)


◦Operation (a number representing the method to be invoked)


◦Hash (a number that verifies that client stub and remote object skeleton use the same stub protocol)


◦Arguments(a list of zero or more Arguments for the call)


UniqueIdentifier 数据包内容(一个字节)
Number Time Count

Arguments:Values 对象
Object

HttpMessage:数据包说明
HttpPostHeader Header Message

HttpPosteHeader 是 HTTP 标准的请求 Header

Header 头和 Message 数据包与上相同。

输入流数据包格式


输入流数据包的内容有以下三个方式:

ReturnData is the result of a "normal" RMI call

An HttpReturn is a return result from an invocation embedded in the HTTP protocol

A PingAck is the acknowledgment for a Ping message

ReturnData 数据包:
0x4e Returns

Returns 数据包,包含 ReturnData 和 PingAck。

ReturnData 数据包:
0x51 ReturnValue

PingAck 数据包:
0x53

ProtocolNotSupported 数据包:
0x4f

ReturnValue:返值数据包结构
0x01 UniqueIdentifier 返回值对象(可选)
0x02 UniqueIdentifierException 对象

Note - ObjectIdentifier, UniqueIdentifier, and EndpointIdentifier are not written out using default serialization, but each uses its own special write method (this is not the writeObject method used by object serialization); the write method for each type of identifier adds its component data consecutively to the output stream.

在使用 RMI 发布服务时,会使用到两个端口。

一个是 RegisterPort,这个是 RMI 的服务注册端口,通过以下 API 来指定。而且服务注册端口必须要指定,默认使用 1099 端口。
Registry reg = LocateRegistry.getRegistry(registryPort);

注册端口是客户端服务连接的端口。

一个是 ServicePort,这个是 RMI 的服务的数据传输端口。该端口是真正在 RMI 客户端与服务端进行数据通信交互的端口。是由注册端口发现有客户端连接后,进行后续分配的端口。默认值为 0 表示使用匿名随机端口。

API 的指定方式如下:
UnicastRemoteObject.exportObject(this.exportedObject, this.servicePort);

分享到:
评论

相关推荐

    基于JAVA CS远程监控系统软件的实现(源代码+论文)【毕业论文】.zip

    本文将深入剖析该系统的架构设计、关键技术及其实际应用,旨在为相关领域的研究者提供参考资料。 一、系统架构 Java CS架构是一种经典的网络应用模式,由客户端和服务器两部分组成。在远程监控系统中,客户端通常...

    Java思维导图xmind文件+导出图片

    Java客户端实现Kafka生产者与消费者实例 kafka的副本机制及选举原理剖析 基于kafka实现应用日志实时上报统计分析 RabbitMQ 初步认识RabbitMQ及高可用集群部署 详解RabbitMQ消息分发机制及主题消息分发 ...

    Java视频.zip

    4. **【Java】一线互联网网站架构技术难点详解.mp4**:这个视频可能详细剖析了互联网公司如何使用Java来构建复杂、高流量的网站。内容可能涵盖缓存策略、数据库优化、异步处理、容错机制等方面。 5. **【Java高级】...

    深入Java虚拟机第二版清晰版(带书签)

    《深入Java虚拟机第二版》是一本深受Java开发者喜爱的经典著作,它详尽地剖析了Java虚拟机(JVM)的工作原理,为程序员提供了深入了解Java平台核心机制的宝贵资料。这本书以其清晰的版面和精心设计的书签,极大地...

    Java安全漫谈-知识星球代码审计

    RMI是Java中实现分布式计算的重要技术,但同时也可能成为攻击者的目标。《04.RMI篇(1).pdf》、《05.RMI篇(2).pdf》和《06.RMI篇(3).pdf》揭示了RMI的安全隐患,如远程代码执行、服务拒绝攻击等,并提供了相应的防范...

    jdk10的源码src文件

    本篇文章将聚焦于JDK10的源码,通过对源代码的深入剖析,揭示其背后的运行机制与设计理念。 首先,我们关注到的是`java.base`模块,它是Java平台标准版(Java SE)的核心部分,包含了基础的API,如数学运算、字符串...

    第五课:Dubbo协议模块源码剖析1

    【Dubbo协议模块源码剖析1】这节课主要讲解了RPC协议的基本组成和Dubbo框架中支持的多种RPC协议的实现细节。RPC(Remote Procedure Call)协议是分布式系统中实现远程方法调用的关键技术,它涉及到服务发现、负载...

    dubbo源码分析系列1

    《深入剖析Dubbo源码系列》 Dubbo作为国内最广泛使用的分布式服务框架,其设计思想和实现机制对于理解和构建自己的分布式服务框架至关重要。本文将基于当当网维护的dubbox版本,逐步解析Dubbo的核心模块,以帮助...

    Dubbo面试专题_面试_dubbo_中间件_

    《Dubbo面试专题》这本书是Java工程师们在面试过程中不可多得的参考资料,它深入剖析了Dubbo这一著名中间件的各项核心技术和应用实践。Dubbo作为阿里巴巴开源的高性能、轻量级的服务框架,广泛应用于微服务架构中,...

    dubbo2.5.5源码

    《深入剖析Dubbo 2.5.5源码》 Dubbo是一款由阿里巴巴开源的高性能、轻量级的Java服务框架,它致力于提供一个简单、高效且可扩展的服务调用解决方案。本文将围绕Dubbo 2.5.5版本的源码进行详细解读,帮助开发者深入...

    dubbo-master.zip

    《深入剖析Dubbo源码:探索分布式服务框架的奥秘》 Dubbo,这款由阿里巴巴开源的高性能Java RPC框架,自2008年诞生以来,已经在业界得到了广泛应用。其核心设计目标是轻量级、高性能、透明化的远程调用方案,以及...

    dubbo-2.5.6源码zip

    《深入剖析Dubbo 2.5.6源码》 Dubbo是一款由阿里巴巴开源的高性能、轻量级的服务治理框架,它主要应用于分布式系统中的服务调用与治理。本资料聚焦于Dubbo 2.5.6版本的源码解析,帮助开发者深入了解其内部工作机制...

    dubbo-2.5.6源码tar.gz

    《深入剖析Dubbo 2.5.6源码》 Dubbo是一款高性能、轻量级的开源Java RPC框架,由阿里巴巴公司开发并贡献给社区。它致力于提供一套完整的服务治理解决方案,包括服务注册、服务发现、负载均衡、容错机制等。在本文中...

    dubbo2.5.x源码

    《深入剖析Dubbo 2.5.x源码》 Dubbo是阿里巴巴开源的一款高性能、轻量级的服务治理框架,主要用于实现分布式服务之间的调用。在2.5.x版本中,Dubbo提供了丰富的功能,包括服务注册与发现、负载均衡、容错机制、监控...

    与dubbo 相关的源码

    通过深入学习Dubbo的源码,我们可以更透彻地理解其设计理念,掌握其核心功能的实现原理,从而更好地应用和优化这一工具。下面,我们将逐步剖析Dubbo的主要模块和关键功能,以期揭示其内在的运行机制。 一、服务注册...

    dubbo官方demo

    本篇文章将深入剖析基于Dubbo的官方Demo,帮助读者理解其核心机制和工作流程。 首先,我们要了解的是"Dubbo官方Demo"。这是一个用于教学和实践的示例项目,包含了Dubbo的基本使用方法,涵盖了服务提供者、消费者、...

    dubbo源码包

    Dubbo作为阿里巴巴开源的一款高性能、轻量级的服务治理框架,其源码的深入理解和分析对于Java开发者来说,具有极高的学习价值。本文将针对提供的dubbo-2.4.3-sources.jar等一系列源码包,逐一剖析其中的核心组件和...

    dubbo精品课程-基础篇

    10. **源码剖析**:对于有志于深入研究的开发者,课程还将部分涉及Dubbo的源码解析,帮助理解其内部工作流程,提高问题排查和优化能力。 通过这门《Dubbo精品课程-基础篇》,你将能够全面掌握Dubbo的基本使用和核心...

    二十三种设计模式【PDF版】

    设计模式之 Template(模板方法) 实际上向你介绍了为什么要使用 Java 抽象类,该模式原理简单,使用很普遍. 设计模式之 Strategy(策略) 不同算法各自封装,用户端可随意挑选需要的算法. 设计模式之 Chain of ...

Global site tag (gtag.js) - Google Analytics