RPC RMI 区别以及在java中的应用
文章目录
- 1. 简介
- 1.1 什么是RPC
- 1.2 什么是RMI
- 2. RPC与RMI的区别
- 2.1 RPC和RMI的优缺点对比
- RPC的优点
- RPC的缺点
- RMI的优点
- RMI的缺点
- 2.2 选择RPC还是RMI?应用场景和考虑因素
- 选择RPC的场景
- 选择RMI的场景
- 3. RPC在Java框架中的应用
- 3.1 Java中常用的RPC框架
- 3.2 RPC在Java中的常见应用
- 如何在分布式系统中使用RPC
- 3.2 实例:使用Java中的RPC框架实现简单的远程调用
- 4. RMI在Java中的应用
- 4.1 RMI的基本原理和工作方式
- 4.2 实例:使用Java RMI实现远程对象的调用和通信
- 5. RPC和RMI中的安全隐患
- RPC中的安全隐患
- RMI中的安全隐患
- 5.1 如何保障RPC和RMI的安全性
- 保障RPC安全性的方法
- 保障RMI安全性的方法
1. 简介
目前新型的主流Java技术基本都是基于RPC
,RMI是JAVA从1.1版本就集成的一项老协议,,基本不会在新项目中发现有相关的使用
1.1 什么是RPC
RPC(Remote Procedure Call,远程过程调用)是一种跨进程通信协议,允许程序在不同的计算机上运行的程序之间调用函数或方法。RPC的主要目的是使分布式系统中的应用程序开发更加简单,使得程序员在编写分布式应用程序时,可以像调用本地函数一样调用远程函数。
1.2 什么是RMI
RMI(Remote Method Invocation,远程方法调用)是Java的一种分布式对象技术,允许在一个Java虚拟机上运行的对象调用另一个Java虚拟机上运行的对象的方法。RMI基于Java对象序列化和反序列化实现,因此,它是一种特定于Java的RPC实现。RMI的目标是使开发者能够在分布式系统中轻松地创建和使用远程对象,而无需关心底层通信细节。
2. RPC与RMI的区别
RPC的实现方式可以是多种多样的,比如XML-RPC使用XML进行数据交换,JSON-RPC使用JSON进行数据交换,gRPC使用Protocol Buffers进行数据交换、Apache Dubbo等。此外,RPC还可以使用不同的传输协议,比如HTTP、TCP等。
而RMI则是基于Java对象序列化和反序列化实现的,它使用Java的内置机制来传输数据和对象。RMI使用JRMP(Java Remote Method Protocol)作为默认的传输协议,但也可以通过自定义socket factory来使用其他协议。
2.1 RPC和RMI的优缺点对比
RPC的优点
- 灵活性:RPC框架通常支持多种语言,使得不同语言的应用程序能够进行通信。
- 跨平台:RPC可以在不同操作系统和硬件平台上运行。
- 生态丰富:有许多成熟的RPC框架可供选择,如gRPC、Apache Dubbo等。
RPC的缺点
- 复杂性:RPC框架通常需要额外的配置和学习成本。
- 性能开销:由于序列化和网络通信的开销,RPC可能会引入一定的性能开销。
RMI的优点
- 简单易用:RMI是Java提供的原生远程调用机制,使用起来相对简单。
- 集成性:RMI与Java的集成性很好,适合Java应用间的远程调用。
RMI的缺点
- 语言限制:RMI只能用于Java语言,不支持多语言调用。
- 平台限制:RMI在跨平台方面的表现不如RPC。
2.2 选择RPC还是RMI?应用场景和考虑因素
选择RPC的场景
- 多语言支持:如果需要在不同语言的系统之间进行通信,RPC可能是更好的选择。
- 生态成熟:在有大量现成的RPC框架可供选择的情况下,可以考虑使用RPC。
选择RMI的场景
- Java生态:如果系统完全基于Java开发,RMI可能是更方便的选择。
- 简单应用:对于简单的远程调用需求,RMI提供了一种轻量级的解决方案。
3. RPC在Java框架中的应用
3.1 Java中常用的RPC框架
在Java中,有多个常用的RPC框架,每个框架都有其特点和适用场景。一些常见的Java RPC框架包括:
- Dubbo:阿里巴巴开源的高性能RPC框架,支持多种协议和多种注册中心。
- gRPC:由Google开发的高性能、开源的RPC框架,基于HTTP/2协议,支持多种语言。
- Thrift:由Facebook开发的跨语言的高性能RPC框架,支持多种语言。
- Spring Cloud:基于Spring Boot的微服务框架,提供了RPC调用的支持。
3.2 RPC在Java中的常见应用
RPC在Java中的应用非常广泛,特别是在微服务架构中。以下是一些常见的例子:
-
分布式系统:RPC使得在分布式系统中的服务之间进行通信变得更加简单。例如,一个服务可以通过RPC调用另一个服务的方法,而无需关心这个方法是在哪个服务器上运行的。
-
微服务架构:在微服务架构中,每个服务都是一个独立的进程,它们之间通过网络进行通信。RPC是这种通信的一种常见方式。
-
负载均衡和故障转移:使用RPC,客户端可以透明地调用在多个服务器上运行的同一个方法,而无需关心具体的服务器。如果一个服务器出现故障,RPC可以自动将请求转发到另一个服务器。
如何在分布式系统中使用RPC
在分布式系统中使用RPC,通常需要以下步骤:
-
定义接口:首先需要定义远程服务的接口,包括接口的方法和参数。
-
实现服务:实现远程服务接口的具体功能,这些实现将在远程服务器上运行。
-
选择RPC框架:选择合适的RPC框架,比如gRPC、Apache Dubbo等,并在服务提供者和消费者端引入相应的依赖。
-
注册中心:在分布式系统中,通常会有注册中心来管理服务的注册与发现,需要将服务注册到注册中心,并从注册中心获取服务信息。
-
远程调用:通过RPC框架提供的客户端代码,远程调用服务提供者的方法。
-
处理失败和容错:在分布式系统中,需要考虑网络不稳定、服务不可用等问题,因此需要实现容错机制,比如重试、熔断等。
3.2 实例:使用Java中的RPC框架实现简单的远程调用
下面是一个简单的示例,演示了如何使用Dubbo框架实现一个简单的远程调用:
import org.apache.dubbo.config.ReferenceConfig;
import com.example.HelloService;// 服务提供者接口
public interface HelloService {String sayHello(String name);
}// 服务提供者实现
public class HelloServiceImpl implements HelloService {public String sayHello(String name) {return "Hello, " + name;}
}// 服务消费者
public class HelloClient {public static void main(String[] args) {// 通过Dubbo的服务引用来调用远程服务ReferenceConfig<HelloService> reference = new ReferenceConfig<>();reference.setInterface(HelloService.class);reference.setUrl("dubbo://127.0.0.1:20880/com.example.HelloService");HelloService helloService = reference.get();String result = helloService.sayHello("World");System.out.println(result);}
}
在这个示例中,我们定义了一个简单的HelloService接口和其实现类HelloServiceImpl,在服务消费者HelloClient中,我们使用Dubbo的ReferenceConfig来引用远程服务,并实现了远程调用的过程。
4. RMI在Java中的应用
4.1 RMI的基本原理和工作方式
RMI的基本原理是通过Java远程对象(Remote Objects)实现远程调用。远程对象是指能够在远程JVM上创建和调用的对象。RMI的工作方式包括以下几个步骤:
-
定义远程接口:首先需要定义一个远程接口,该接口中声明了可以在远程对象上调用的方法。
-
实现远程对象:实现远程接口的具体类,该类将作为远程对象在服务器端运行。
-
注册远程对象:将远程对象注册到RMI注册表(Registry)中,客户端可以通过注册表查找并获取远程对象的引用。
-
客户端调用:客户端通过查找注册表获取远程对象的引用,然后调用远程对象的方法,就像调用本地对象一样。
4.2 实例:使用Java RMI实现远程对象的调用和通信
下面是一个简单的示例,演示了如何使用Java RMI框架实现远程对象的调用和通信:
import java.rmi.Remote;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
import java.rmi.Naming;// 远程接口
public interface Hello extends Remote {String sayHello() throws RemoteException;
}// 远程对象的实现
public class HelloImpl extends UnicastRemoteObject implements Hello {public HelloImpl() throws RemoteException {super();}public String sayHello() {return "Hello, world!";}
}// 服务器端
public class Server {public static void main(String[] args) {try {HelloImpl obj = new HelloImpl();Naming.rebind("//localhost/Hello", obj);System.out.println("Hello Server is ready.");} catch (Exception e) {System.out.println("Hello Server failed: " + e);}}
}// 客户端
public class Client {public static void main(String[] args) {try {Hello obj = (Hello) Naming.lookup("//localhost/Hello");System.out.println(obj.sayHello());} catch (Exception e) {System.out.println("Hello Client exception: " + e);}}
}
在这个示例中,我们定义了一个远程接口Hello,以及其实现类HelloImpl。在服务器端,我们将HelloImpl对象注册到RMI注册表中,而客户端则通过查找注册表获取远程对象的引用并调用其方法。
5. RPC和RMI中的安全隐患
RPC中的安全隐患
- 数据传输安全:由于RPC通常涉及跨网络的数据传输,存在数据被窃听或篡改的风险。
- 身份验证:在RPC中,需要确保通信双方的身份是合法的,防止恶意主体的访问。
- 授权问题:需要确保对RPC调用的授权和访问控制,防止未经授权的操作。
RMI中的安全隐患
- 未经授权的访问:RMI服务可能会受到未经授权的访问,导致数据泄露或服务被滥用。
- 数据完整性:RMI调用的数据可能会受到篡改,导致数据完整性受到损害。
5.1 如何保障RPC和RMI的安全性
保障RPC安全性的方法
- 数据加密:使用SSL/TLS等加密协议来加密RPC通信中的数据,确保数据传输的机密性和完整性。
- 身份验证:使用身份验证机制,比如基于令牌的认证、数字证书等,确保通信双方的身份合法。
- 访问控制:实施严格的访问控制机制,确保只有授权的用户或系统可以进行RPC调用。
保障RMI安全性的方法
- 使用安全通信协议:RMI可以通过SSL/TLS等安全通信协议来保障通信的安全性。
- 访问控制:在RMI中可以使用Java的安全管理器(Security Manager)来实施访问控制,限制对敏感资源的访问。
- 数据完整性校验:可以通过数字签名等方式来验证RMI调用的数据完整性,防止数据篡改。
相关文章:
RPC RMI 区别以及在java中的应用
文章目录 1. 简介1.1 什么是RPC1.2 什么是RMI 2. RPC与RMI的区别2.1 RPC和RMI的优缺点对比RPC的优点RPC的缺点RMI的优点RMI的缺点 2.2 选择RPC还是RMI?应用场景和考虑因素选择RPC的场景选择RMI的场景 3. RPC在Java框架中的应用3.1 Java中常用的RPC框架3.2 RPC在Java…...
TCP和udp能使用同一个端口通讯吗
TCP和UDP是可以使用同一个端口进行通讯的。这是因为TCP和UDP是两个完全不同的协议,它们工作在传输层,各自维护不同的连接和会话。每个协议都有自己的端口号空间,因此TCP和UDP可以互不干扰地使用相同的端口号。 但是,需要注意的是…...
红黑树的介绍与实现
前言 前面我们介绍了AVL树,AVL树是一棵非常自律的树,有着严格的高度可控制!但是正它的自律给他带来了另一个问题,即虽然他的查找效率很高,但是插入和删除由于旋转而导致效率没有那么高。我们上一期的结尾说过经常修改…...
easyexcel将csv转为excel处理数字问题
使用easyexcel可以将csv格式的文件转为.xlsx文件,但是csv中有很多数字,比如:"123","12.34","-111",默认情况下会将其作为字符串写入.xlsx文件,就如同下面一样,字符类型的数字…...
DDMA信号处理以及数据处理的流程---随机目标生成
Hello,大家好,我是Xiaojie,好久不见,欢迎大家能够和Xiaojie一起学习毫米波雷达知识,Xiaojie准备连载一个系列的文章—DDMA信号处理以及数据处理的流程,本系列文章将从目标生成、信号仿真、测距、测速、cfar…...
爬虫实现思路
现在的人工智能太强大了,只要有问题,输入后就能给出大致的实现思路;我看了下确实没问题,只需要更改一些细节基本就能拿来就用;下面是我实验经历: 问题: c# 书写爬虫爬取按动物名称,…...
神经网络 torch.nn---Non-Linear Activations (ReLU)
ReLU — PyTorch 2.3 documentation torch.nn - PyTorch中文文档 (pytorch-cn.readthedocs.io) 非线性变换的目的 非线性变换的目的是为神经网络引入一些非线性特征,使其训练出一些符合各种曲线或各种特征的模型。 换句话来说,如果模型都是直线特征的…...
【微服务】使用kubekey部署k8s多节点及kubesphere
kubesphere官方部署文档 https://github.com/kubesphere/kubesphere/blob/master/README_zh.md kubuctl命令文档 https://kubernetes.io/zh-cn/docs/reference/kubectl/ k8s资源类型 https://kubernetes.io/zh-cn/docs/reference/kubectl/#%E8%B5%84%E6%BA%90%E7%B1%BB%E5%9E…...
目标检测数据集 - 垃圾桶满溢检测数据集下载「包含VOC、COCO、YOLO三种格式」
数据集介绍:垃圾桶满溢检测数据集,真实场景高质量图片数据,涉及场景丰富,比如城市道边垃圾桶满溢、小区垃圾桶满溢、社区垃圾桶满溢、农村道边垃圾桶满溢、垃圾集中处理点垃圾桶满溢、公园垃圾桶满溢数据等。数据集标注标签划分为…...
6.9总结(省赛排位赛1)
省赛排位赛1省赛排名赛1 - Virtual Judge (vjudge.net) 思路: 其实就是一个斐波拉契数列,当前项前两项之和,先将范围内的数全部存起来放进一个数组,再进行累加查询 代码: #define _CRT_SECURE_NO_WARNINGS 1 #incl…...
58.CountdownLatch
用来进行线程同步协作,等待所有线程完成倒计时。 构造参数用来初始化等待计数值,await方法用来等待计数归零,countDown方法用来让计数减一。 CountdownLatch普通使用 @Slf4j public class CountdownLatchDemo {public static void main(String[] args) {CountDownLatch c…...
Java数据结构准备工作---常用类
文章目录 前言1.包装类1.1.包装类基本知识1.2.包装类的用途1.3.装箱和拆箱1.3.1.装箱:1.3.2.拆箱 1.4 包装类的缓存问题 2.时间处理类2.1.Date 时间类(java.util.Date)2.2.DateFormat 类和 SimpleDateFormat 类2.3.Calendar 日历类 3.其他常用类3.1.Math类3.2.Rando…...
SD 使用教程
SD 换脸步骤 使用Stable Diffusion (SD) 进行换脸的基本步骤可以从以下几个方面概述,这里以一种常见的方式为例,结合了插件的使用来简化流程: 准备工作 安装必要的软件和插件:首先,确保你已经安装了Stable Diffusion…...
Sylar---协程调度模块
协程调度模块: 首先是协程任务类FiberAndThread,包括协程,函数,指定的线程;提供了五个构造函数,只传协程的智能指针,只传函数对象,传协程智能指针的指针,函数对象指针,还…...
iOS Hook 崩溃
0x00 崩溃重现 被 Hook 的类,是这样的: interface ViewController : UIViewController endimplementation ViewController - (void)loadView {[super loadView];NSLog("%s", __func__); }- (void)test {NSLog("%s", __func__); }-…...
区间预测 | Matlab实现LSTM-ABKDE长短期记忆神经网络自适应带宽核密度估计多变量回归区间预测
区间预测 | Matlab实现LSTM-ABKDE长短期记忆神经网络自适应带宽核密度估计多变量回归区间预测 目录 区间预测 | Matlab实现LSTM-ABKDE长短期记忆神经网络自适应带宽核密度估计多变量回归区间预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实现LSTM-ABKDE长…...
linux内核下rapidio(TSI721)相关笔记汇总
1 驱动的安装 和 主要功能(doorbell, DMA, rionet)的简单测试 linux5.4 下使用rapidio(tsi721)的笔记记录_kernel-rapidio-CSDN博客 2 机理分析 linux内核下,rapidio网络系统建立的过程(枚举 和 发现)_linux rapidio-CSDN博客 linux内核下,(rapidio)T…...
从GPT-4到GPT-4o:人工智能的进化与革命
从GPT-4到GPT-4o:人工智能的进化与革命 近期,OpenAI推出了最新版本的人工智能模型——GPT-4o,引发了广泛的关注和讨论。在这篇文章中,我们将对GPT-4o进行全面评价,包括与前一版本GPT-4的对比分析,GPT-4o的…...
【Java】/*抽象类和接口*/
目录 一、抽象类和抽象方法 1.1 概念 1.2 特性 1.3 作用 二、接口 2.1 概念及定义 2.2 特性 2.3 实例:笔记本电脑 2.4 一个类可以实现多个接口 2.5 一个接口可以继承多个接口 2.6 Comparable接口 2.7 Comparator接口 2.8 Cloneable接口 2.9 浅拷贝和深…...
TCP/IP协议介绍——三次握手四次挥手
TCP/IP(Transmission Control Protocol/Internet Protocol,传输控制协议/网际协议)是指能够在多个不同网络间实现信息传输的协议簇。TCP/IP协议不仅仅指的是TCP 和IP两个协议,而是指一个由FTP、SMTP、TCP、UDP、IP等协议构成的协议…...
[C++]基于C++opencv结合vibe和sort tracker实现高空抛物实时检测
【vibe算法介绍】 ViBe算法是一种高效的像素级视频背景建模和前景检测算法。以下是对该算法的详细介绍: 一、算法原理 ViBe算法的核心思想是通过为每个像素点存储一个样本集,利用该样本集与当前像素值进行比较,从而判断该像素是否属于背景…...
Apache Doris 基础 -- 数据表设计(模式更改)
用户可以通过schema Change操作修改现有表的模式。表的模式主要包括对列的修改和对索引的修改。这里我们主要介绍与列相关的Scheme更改。对于与索引相关的更改,可以查看数据表设计/表索引,查看每个索引的更改方法。 1、术语 基本表(Base Ta…...
【机器学习】【遗传算法】【项目实战】药品分拣的优化策略【附Python源码】
仅供学习、参考使用 一、遗传算法简介 遗传算法(Genetic Algorithm, GA)是机器学习领域中常见的一类算法,其基本思想可以用下述流程图简要表示: (图参考论文:Optimization of Worker Scheduling at Logi…...
电子电气架构 ---车载安全防火墙
我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。非必要不费力证明自己,无利益不试图说服别人,是精神上的节…...
解决selenium加载网页过慢影响程序运行时间的问题
在用selenium爬取动态加载网页时,发现网页内容都全部加载完了,但是页面还在转圈,并且获取页面内容的代码也没有执行,后面了解到selenium元素操作等方法是需要等待页面所有元素完全加载完成后才开始执行的,所以在页面未…...
何为云防护?有何作用
云防护又称云防御。随着Internet互联网络带宽的增加和多种DDOS 黑客工具的不断发布,云计算越演越热,DDOS拒绝服务攻击的实施越来越容易,DDOS攻击事件正在成上升趋势。出于商业竞争、打击报复和网络敲诈等多种因素,导致很多IDC 托管…...
2024050402-重学 Java 设计模式《实战责任链模式》
重学 Java 设计模式:实战责任链模式「模拟618电商大促期间,项目上线流程多级负责人审批场景」 一、前言 场地和场景的重要性 射击🏹需要去靶场学习、滑雪🏂需要去雪场体验、开车🚗需要能上路实践,而编程…...
centos7安装字体
1.安装命令 yum install fontconfig #字体库命令 yum install mkfontscale #更新字体命令2.安装字体(注意权限问题) 进入目录 /usr/share/fonts ,该目录是 centos7 字体库的默认安装目录。在该目录下创建一个文件夹 ekp (名字…...
Llama模型家族之使用 ReFT技术对 Llama-3 进行微调(三)为 ReFT 微调准备模型及数据集
LlaMA 3 系列博客 基于 LlaMA 3 LangGraph 在windows本地部署大模型 (一) 基于 LlaMA 3 LangGraph 在windows本地部署大模型 (二) 基于 LlaMA 3 LangGraph 在windows本地部署大模型 (三) 基于 LlaMA…...
学习Canvas过程中2D的方法、注释及感悟一(通俗易懂)
1.了解Canvas: Canvas是前端一个很重要的知识点,<canvas>标签用于创建画布绘制图形,通过JavaScript进行操作。它为开发者提供一个动态绘制图形的区域,用于创建图标、游戏动画、图像处理等。 对于能够熟练使用Canvas的开发者…...
关于购物网站建设的论文/浏览器里面信息是真是假
线程是允许进行并行计算的一个抽象概念:在另一个线程完成计算任务的同时,一个线程可以对图像进行更新,二个线程可以同时处理同一个进程发出的二个网络请求。我们在这篇文章中将重点讨论Java和C#在线程方面的不同之处,并将一些Java…...
浙江省建设网站/网站提交收录
Java技术栈www.javastack.cn优秀的Java技术公众号以下是Java技术栈微信公众号发布的所有关于 Java 的技术干货,会从以下几个方面汇总,本文会长期更新。Java 基础篇Java 多线程篇Java JVM篇Java 进阶篇Java 新特性篇Java 工具类篇Java 综合篇Java基础篇歪…...
dedecms网站后台管理系统/国家免费技能培训平台
Apache http安装 下载地址Apache Haus Downloads 选择自己系统的Apache版本下载安装。 1. 设置根目录或端口 1.1 进入zip解压后的目录,打开conf目录下的httpd.conf文件; 1.2 修改目录: Define SRVROOT "/Apache24"; 修改主配置文件&…...
怎么把网站排名排上去/网络营销代运营外包公司
【BZOJ1662】[Usaco2006 Nov]Round Numbers 圆环数 Description 正如你所知,奶牛们没有手指以至于不能玩“石头剪刀布”来任意地决定例如谁先挤奶的顺序。她们甚至也不能通过仍硬币的方式。 所以她们通过"round number"竞赛的方式。第一头牛选取一个整数&…...
自己家开了一家装修公司怎么做装修网站/青岛seo推广专员
基于专家系统的入侵检测系统的实现电子发烧友 电子技术论坛基于专家系统的入侵检测系统的实现林 庆 1 王 飞 1 吴旻 2 廖定安 1 王 敏 11(江苏大学计算机科学与通信工程学院,江苏镇江 212013 ;2 江苏大学人事处,江苏镇江 212013 )Implementation of Intrusion Detec…...
微商网站开发/短网址在线生成
本节目录:接收者:通道侦听器The IChannelListener InterfaceIChannelListener接口IChannelListener<TChannel>接口ChannelListenerBase类型ChannelListenerBase<TChannel>类型创建自定义通道侦听器接收者:通道侦听器 和它们的名…...