发表于: 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
这个是我本地跑出来的结果。
评论