发表于: 2020-09-14 23:39:41
1 1389
今天完成的事:
任务八深度思考
1.什么是rmi?为什么要使用rmi框架?
RMI指的是远程方法调用 (Remote Method Invocation),远程方法调用是一种计算机之间对象互相调用对方函数,启动对方进程的一种机制,使用这种机制,某一台计算机上的对象在调用另外一台计算机上的方法时,使用的程序语法规则和在本地机上对象间的方法调用的语法规则一样。也是纯java实现的分布式网络应用方案。
RMI 目前使用 Java 远程消息交换协议 JRMP(Java Remote Messaging Protocol)进行通信。由于 JRMP 是专为 Java 对象制定的,Java RMI 具有 Java 的 "Write Once,Run Anywhere" 的优点,是分布式应用系统的百分之百纯 Java 解决方案。用 Java RMI 开发的应用系统可以部署在任何支持 JRE 的平台上。但由于 JRMP 是专为 Java 对象制定的,因此,RMI 对于用非 Java 语言开发的应用系统的支持不足。不能与用非 Java 语言书写的对象进行通信。
rmi框架有如下优点:
a、面向对象:RMI可将完整的对象作为参数和返回值进行传递,而不仅仅是预定义的数据类型。像Java哈希表这样的复杂类型也作为一个参数进行传递。
b、可移动属性:RMI可将属性从客户机移动到服务器,或者从服务器移动到客户机。
c、分布式垃圾收集: RMI 采用其分布式垃圾收集功能收集不再被网络中任何客户程序所引用的远程服务对象。并行计算:RMI 采用多线程处理方法,可使您的服务器利用这些 Java 线程更好地并行处理客户端的请求。
d、安全性:RMI使用Java内置的安全机制保证下载执行程序时用户系统的安全。RMI使用专门为保护系统免遭恶意小程序侵害而设计的安全管理程序。
e、便于编写和使用:远程接口实际上就是Java接口。
2.部署两台Service,如何在WEB中随机访问任意一台Service?
public StudentService getService(){
int count=new Random().nextInt(2);
if(count==1){
try{
logger.info("尝试获取serverA的服务");
studentService=getServiceA();
logger.info("已经获取serverA的服务");
}catch (Exception e){
logger.info("serverA的服务获取失败,获取serviceB的服务");
try {
logger.info("尝试获取serverB的服务");
studentService=getServiceB();
logger.info("已经获取serverB的服务");
}catch (Exception e1){
logger.info("服务全部挂掉了");
}
}
}else if(count==0){
try{
logger.info("尝试获取serverB的服务");
studentService=getServiceB();
logger.info("已经获取serverB的服务");
}catch (Exception e){
logger.info("serverB的服务获取失败,获取serviceA的服务");
try {
logger.info("尝试获取serverA的服务");
studentService=getServiceA();
logger.info("已经获取serverA的服务");
}catch (Exception e1){
logger.info("服务全部挂掉了");
}
}
}
return studentService;
}
3.RMI的简单介绍
RMI指的是远程方法调用 (Remote Method Invocation),远程方法调用是一种计算机之间对象互相调用对方函数,启动对方进程的一种机制,使用这种机制,某一台计算机上的对象在调用另外一台计算机上的方法时,使用的程序语法规则和在本地机上对象间的方法调用的语法规则一样。也是纯java实现的分布式网络应用方案,运用JRMP协议,RMI是java1.1开始的API功能,java原生的java.rmi包中的提供的,使用必须有一连串的繁杂的手续,像是服务介面定义时必须继承java.rmi.Remote,服务Server运作时必须继承java.rmi.UnicastRemoteObject类,必须使用rmic指令产生stub与skeleton等。
4.什么是RMI,什么是RPC,两者之间的区别是什么?
RMI:远程方法调用(Remote Method Invocation)。能够让在客户端Java虚拟机上的对象像调用本地对象一样调用服务端java 虚拟机中的对象上的方法。
RPC(Remote Procedure Call Protocol)远程过程调用协议,通过网络从远程计算机上请求调用某种服务。
区别:
1):方法调用方式不同:
RMI中是通过在客户端的Stub对象作为远程接口进行远程方法的调用。每个远程方法都具有方法签名。如果一个方法在服务器上执行,但是没有相匹配的签名被添加到这个远程接口(stub)上,那么这个新方法就不能被RMI客户方所调用。
RPC中是通过网络服务协议向远程主机发送请求,请求包含了一个参数集和一个文本值,通常形成“classname.methodname(参数集)”的形式。RPC远程主机就去搜索与之相匹配的类和方法,找到后就执行方法并把结果编码,通过网络协议发回。
2):适用语言范围不同:
RMI只用于Java;
RPC是网络服务协议,与操作系统和语言无关。
3):调用结果的返回形式不同:
Java是面向对象的,所以RMI的调用结果可以是对象类型或者基本数据类型;
RMI的结果统一由外部数据表示 (External Data Representation, XDR) 语言表示,这种语言抽象了字节序类和数据类型结构之间的差异。
5.Service和Service之间可以互相调用吗?是应该统一Controller调用Service,还是应该Service调用Service?
可以相互调用,应该由Controller统一调用Service.
6.Service对外暴露的接口粒度应该是怎么样的,是只提供基础的CRUD服务,还是应该将业务逻辑包含进去?
service应该包含业务逻辑。
7.Thrift,Protobuffer分别是什么,一般用于什么场景?
Thrift是一种接口描述语言和二进制通讯协议,它被用来定义和创建跨语言的服务。它被当作一个远程过程调用(RPC)框架来使用,是由Facebook为“大规模跨语言服务开发”而开发的。
Protocol Buffers 是Google开源的,一种灵活、高效、用于序列化结构化数据的自动化过程。你只需要定义如何组织你的结构化数据一次,然后就可以使用protoc轻松的根据这个定义生成语言相关的源代码(支持多种语言),以便于读写结构化数据。
应用场景:跨平台的RPC数据传输。
8.什么是序列化和反序列化,在RMI中是否要实现 Serializable 接口, serialVersionUID的用处是什么?
序列化:把Java对象转换为字节序列的过程。
反序列化:把字节序列恢复为Java对象的过程。
需要实现 Serializable接口。
serialVersionUID适用于Java的序列化机制。简单来说,Java的序列化机制是通过判断类的serialVersionUID来验证版本一致性的。在进行反序列化时,JVM会把传来的字节流中的serialVersionUID与本地相应实体类的serialVersionUID进行比较,如果相同就认为是一致的,可以进行反序列化,否则就会出现序列化版本不一致的异常,即是InvalidCastException。
明天的计划:springcloud.
遇到的问题:
收获:
评论