发表于: 2020-07-25 20:00:09

1 1547


任务八深度思考

1.什么是rmi?为什么要使用rmi框架?

要了解 Java RMI 首先得引入 rpc(远程过程调用协议)目标是像在本地方法调用一样调用远程机器上的方法,

对于调用方来说用起来就像本地执行一样,因为通信的细节都封装起来了。

客户端调用某个函数方法 -> rpc 框架封装调用信息发送到远程服务端 -> 

服务端 rpc 框架接收到请求并且执行之后封装运行结果返回给客户端 -> 客户端 rpc 框架反序列执行结果给函数调用者

Java RMI 即在 Java 上实现的一个 rpc 框架,这个框架由 JVM 原生支持。

RMI 是 Java 的一部分,在所有支持 Java 的 rpc 框架中开发起来是最方便的。

RMI 可以传递一个完整的对象,而不是拆分成基本数据类型再去给对象初始化。

RMI 由 Java 内置的安全机制保障系统安全。


2.部署两台Service,如何在WEB中随机访问任意一台Service?

使用 nginx,配置客户端连接到 nginx。

nginx 做负载均衡,响应超过 1s 就切换到另一台服务器。

还有一种方案就是在 controller 里面捕捉 service 的错误,捕捉到了就切换到另外一台,实现起太笨了,不想做。


3.RMI的简单介绍

Java RMI,即 远程方法调用(Remote Method Invocation),一种用于实现远程过程调用(RPC)(Remote procedure call)的Java API, 能直接传输序列化后的Java对象和分布式垃圾收集。它的实现依赖于Java虚拟机(JVM),因此它仅支持从一个JVM到另一个JVM的调用。

RMI主要分为三部分

RMI Registry注册中心

RMI Client 客户端

RMI Server服务端

需要注意的地方是自定义对象的序列化。


4.什么是RMI,什么是RPC,两者之间的区别是什么?

RMI 是 Java 是原生支持的 RPC 框架。

RMI 是框架,由具体的实现。RPC 是一种通信理念。


5.Service和Service之间可以互相调用吗?是应该统一Controller调用Service,还是应该Service调用Service?

同一层之间不应该相互调用。

应该由 controller 来调用service。


6.Service对外暴露的接口粒度应该是怎么样的,是只提供基础的CRUD服务,还是应该将业务逻辑包含进去?

service 里面应该包含业务逻辑。


7.Thrift,Protobuffer分别是什么,一般用于什么场景?

Thrift:一个开源的跨语言 rpc 框架,使用一个中间语言来定义与创建跨语言服务。

定义的数据类型与接口可以由编译器编译为不同的语言,生成的代码中有目标语言的接口定义、方法、数据类型,还包含 RPC 协议层和传输层的实现代码。

Protobuffer 是谷歌开的的一种数据描述语言,可以把结构化的数据序列化与反序列化、持久化。

Protobuffer 是二进制格式化,不利于直观阅读。

优点:

体积小,解析速度快,兼容性更好


8.什么是序列化和反序列化,在RMI中是否要实现 Serializable 接口, serialVersionUID的用处是什么?

序列化与反序列化解决的是数据一致性的问题,保证数据输入输出是一样的。

数据的本地持久化比较简单,但是如果涉及到网络传输就要考虑到系统的差异了。

Java 内置了序列化与反序列化,需要实现 serialization 接口,然后加上序列化id(serialVersionUID),

如果是不分模块,不做拆分那么不写序列化 ID 也是没有关系的,JVM 会默认给实现了序列化接口但是没有序列化id 的类生成序列化 id。

反序列化的时候会检查序列化id,如果发现序列化 id 不一致那么序列化不能成功。

关于序列化的一些特殊内容:

标注不需要序列化的字段:给字段添加 static、transient 修饰词。Java 序列化只保存对象的成员变量,static 属于类而不属于对象,同时如果不想使用 static 的话Java 也提供了另一个修饰词 transient。

使用 Externalizable 接口控制序列化的过程:Externalizable 接口与 serializable 不同的地方在于前者的序列化需要使用者去实现。


9.Controller通过RMI调用服务是否有延迟?10条Long型的ID循环调用1000次,和本地调用之间的时间相差多少?

这里偷个懒,我直接循环调用现有的 bannerService 来测试

服务端循环调用 1000 次耗时 2077 ms

客户端循环调用 1000 次耗时 2719 ms

这个是我本地跑出来的结果。


返回列表 返回列表
评论

    分享到