发表于: 2019-12-02 18:07:16

1 1138


今天完成的事情:

把项目重构了一遍

总算是能跑通了,出现了新的问题实体类无法加载

网上找了一下发现是因为RMI中要实现 Serializable 接口

首先,在跑Demo的时候,通过rmi传输对象时,不去实现Serializable接口,会抛异常;

其次,rmi远程方法调用最底层是通过socket通信来实现对象的传输,其数据的传输最后都归结于二进制的数据包。  

在实体类中实现

在server层pom文件加上打jar包插件

不然打出来的jar包没有配置文件

打包后会有两个jar包,比较大的那个就是了

把jar包放到服务器上后台运行

java -jar xxxx.jar &

再使用nginx反向代理和负载配置权重,前面日报都有讲过怎么配置就不说了


明天计划的事情:学习dubbo知识


遇到的问题:以上说到了


收获:

懂得如何使用RMI拆分Service并调用


任务八深度思考

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

用random随机生成对应不同id的service

2.RMI的简单介绍 

RMI:远程方法调用(Remote Method Invocation)。能够让在客户端Java虚拟机上的对象像调用本地对象一样调用服务端Java虚拟机中的对象上的方法。

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

RPC(Remote Procedure Call Protocol)远程过程调用协议,通过网络从远程计算机上请求调用某种服务。

一次RPC调用的过程:

执行客户端调用语句,传送参数
调用本地系统发送网络消息
消息传送到远程主机
服务器得到消息并取得参数
根据调用请求以及参数执行远程过程(服务)
执行过程完毕,将结果返回服务器句柄
服务器句柄返回结果,调用远程主机的系统网络服务发送结果
消息传回本地主机
客户端句柄由本地主机的网络服务接收消息
客户端接收到调用语句返回的结果数据

RMI 远程方法调用

RMI远程调用步骤:

客户调用客户端辅助对象stub上的方法
客户端辅助对象stub打包调用信息(变量,方法名),通过网络发送给服务端辅助对象skeleton
服务端辅助对象skeleton将客户端辅助对象发送来的信息解包,找出真正被调用的方法以及该方法所在对象
调用真正服务对象上的真正方法,并将结果返回给服务端辅助对象skeleton
服务端辅助对象将结果打包,发送给客户端辅助对象stub
客户端辅助对象将返回值解包,返回给调用者
客户获得返回值

RPC与RMI的区别

1:方法调用方式不同:

RMI中是通过在客户端的Stub对象作为远程接口进行远程方法的调用。每个远程方法都具有方法签名。如果一个方法在服务器上执行,但是没有相匹配的签名被添加到这个远程接口(stub)上,那么这个新方法就不能被RMI客户方所调用。
RPC中是通过网络服务协议向远程主机发送请求,请求包含了一个参数集和一个文本值,通常形成“classname.methodname(参数集)”的形式。RPC远程主机就去搜索与之相匹配的类和方法,找到后就执行方法并把结果编码,通过网络协议发回。
2:适用语言范围不同:

RMI只用于Java;
RPC是网络服务协议,与操作系统和语言无关。
3:调用结果的返回形式不同:

Java是面向对象的,所以RMI的调用结果可以是对象类型或者基本数据类型;RMI的结果统一由外部数据表示,这种语言抽象了字节序类和数据类型结构之间的差异。

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

技术上可以但是不符合规范,应该统一由controller调用service

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

可以包含业务逻辑。

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

由 Facebook 开发的远程服务调用框架 Apache Thrift,它采用接口描述语言定义并创建服务,支持可扩展的跨语言服务开发,所包含的代码生成引擎可以在多种语言中,如 C++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, Smalltalk 等创建高效的、无缝的服务,其传输数据采用二进制格式,相对 XML 和 JSON 体积更小,对于高并发、大数据量和多语言的环境更有优势。本文将以官方文档中提到的教程为例,帮助使用者快速构建服务。

ProtoBuffer是由谷歌研发的对象序列化和反序列化的开源工具,在直接传递C/C++语言中子接对其的结构体数据,和springSOAP协议格式比较强大;而且可以保证同一消息报文新旧版本之间的兼容性。

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

序列化:把Java对象转换为字节序列的过程。
反序列化:把字节序列恢复为Java对象的过程。

Java的序列化机制是通过在运行时判断类的serialVersionUID来验证版本一致性的。

在进行反序列化时,JVM会把传来的字节流中的serialVersionUID与本地相应实体(类)的serialVersionUID进行比较,如果相同就认为是一致的,可以进行反序列化,否则就会出现序列化版本不一致的异常。(InvalidClassException)

serialVersionUID有两种显示的生成方式: 一个是默认的1L,比如:private static final long serialVersionUID = 1L; 一个是根据类名、接口名、成员方法及属性等来生成一个64位的哈希字段,

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

Controller通过RMI调用服务有延迟;10条Long型的ID循环调用1000次,查询单条数据100次,相差在0.1s左右(0.07s居多)。

网上查到的,自己还没测过。




返回列表 返回列表
评论

    分享到