`
dannyhz
  • 浏览: 399365 次
  • 性别: 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高级】...

    Spring技术内幕:深入解析Spring架构与设计原理

    作者通过源代码的阅读,剖析了Spring框架的设计原理和内部架构,带领读者深入理解Spring各个组件是如何协同工作,以及其设计决策背后的原因。这样的分析对于Java开发者深入掌握Spring框架有着极大的帮助,尤其是在...

    EJB原理剖析电子书

    通过对RMI原理的理解,我们可以更深入地认识到EJB的工作机制。EJB作为Java EE的核心组成部分之一,其设计目的是为了简化企业级应用的开发过程。EJB利用了RMI的技术,通过容器管理的方式,为开发者提供了高度抽象的...

    深入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,如数学运算、字符串...

    Java高级架构必备知识点

    - **Kafka实现原理剖析**:深入理解Kafka的设计原理。 **7.7 分布式缓存分析对比** - **Memcache的原理分析及使用**:比较Memcache和Redis的不同之处。 **7.9 高并发专题-数据库层面优化** - **分库分表的原理及...

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

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

    dubbo源码分析系列1

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

    dubbo源码分析系列

    在Dubbo源码分析系列中,知秋整理了Dubbo架构设计和源码风格的详细解读,并对核心模块的职责和关系进行了深入的剖析。这对于想要了解和掌握Dubbo源码的开发者来说,是一份宝贵的资料。通过源码分析,开发者不仅能够...

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

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

    dubbo2.5.5源码

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

    大数据课程体系.docx

    - **Java反射技术**:探讨Java反射机制的基本原理及其应用场景,了解Class类、Field类、Method类和Constructor类的使用。 - **实战设计模式**:详细介绍常见的设计模式,如单例模式、工厂模式、观察者模式等,并通过...

    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框架,由阿里巴巴公司开发并贡献给社区。它致力于提供一套完整的服务治理解决方案,包括服务注册、服务发现、负载均衡、容错机制等。在本文中...

Global site tag (gtag.js) - Google Analytics