发表于: 2020-08-18 23:24:37
1 1433
今天完成的事情:完成任务八BUG修复。深度思考
明天计划的事情:规划任务九
遇到的问题:
收获:
部署两台web,Nginx Upsteam
upstream jnshu.test{
##调度算法
server 120.25.222.150:8089 weight=2;
server 120.25.222.150:8081 weight=3;
}
server {
listen 8080;
server_name 120.25.222.150;
location / {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_pass http://jnshu;
}
深度思考
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是java1.1开始的API功能,java原生的java.rmi包中的提供的,使用必须有一连串的繁杂的手续,像是服务介面定义时必须继承java.rmi.Remote,服务Server运作时必须继承java.rmi.UnicastRemoteObject类,必须使用rmic指令产生stub与skeleton等,设定上手续繁杂。
至于为什么用RMI框架,那就要说说它的优点了。
a、面向对象:RMI可将完整的对象作为参数和返回值进行传递,而不仅仅是预定义的数据类型。像Java哈希表这样的复杂类型也作为一个参数进行传递。
b、可移动属性:RMI可将属性从客户机移动到服务器,或者从服务器移动到客户机。
c、分布式垃圾收集: RMI 采用其分布式垃圾收集功能收集不再被网络中任何客户程序所引用的远程服务对象。并行计算:RMI 采用多线程处理方法,可使您的服务器利用这些 Java 线程更好地并行处理客户端的请求。
d、安全性:RMI使用Java内置的安全机制保证下载执行程序时用户系统的安全。RMI使用专门为保护系统免遭恶意小程序侵害而设计的安全管理程序。
e、便于编写和使用:远程接口实际上就是Java接口。
为了实现RMI的功能必须创建远程对象实现远程接口。但远程接口本身并不包含任何方法。因而需要创建一个新的接口来扩展远程接口。新接口将包含所有可以远程调用的方法。远程对象必须实现这个新接口,由于新的接口扩展了远程接口,实现了新接口,就满足了远程对象对实现远程接口的要求,所实现的每个对象都为远程对象引用。
2.部署两台Service,如何在WEB中随机访问任意一台Service?
通过随机数,封装一个类专门选择访问哪个Service.在日报中前面两篇日报中有提到。
public Object chooseService(Object m1, Object m2){
int choose = new Random().nextInt(2);
if(0 == choose){
try{
logger.info("Choose Server1");
return m1;
}catch (Exception e1){
try{
logger.info("Server1 Error,Choose Server2");
return m2;
}catch (Exception e2){
logger.info("Server1 and Server2 Error");
throw new RuntimeException("Rmi Link Error");
}
}
}
if(1 == choose){
try{
logger.info("Choose Server1");
return m2;
}catch (Exception e1){
try{
logger.info("Server1 Error,Choose Server2");
return m1;
}catch (Exception e2){
logger.info("Server1 and Server2 Error");
throw new RuntimeException("Rmi Link Error");
}
}
}
throw new RuntimeException("unknown error");
}
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:RMI(Remote Method Invocation,远程方法调用),能够让在客户端Java虚拟机上的对象像调用本地对象一样调用服务端Java虚拟机中的对象上的方法,是Java在JDK1.1中实现的,大大增强了Java开发分布式应用的能力,使用的代表是EJB。
RPC:RPC(Remote Procedure Call)远程过程调用,简单的理解是一个节点请求另一个节点提供的服务。RPC不是面向对象也不能处理对象,而是调用具体的子程序。
两者区别
4.1RMI中是通过在客户端的Stub对象作为远程接口进行远程方法的调用。每个远程方法都具有方法签名。如果一个方法在服务器上执行,但是没有相匹配的签名被添加到这个远程接口(stub)上,那么这个新方法就不能被RMI客户方所调用。
- RPC中是通过网络服务协议向远程主机发送请求,请求包含了一个参数集和一个文本值,通常形成“classname.methodname(参数集)”的形式。RPC远程主机就去搜索与之相匹配的类和方法,找到后就执行方法并把结果编码,通过网络协议发回。
- 4.2RMI只用于Java;RPC是网络服务协议,与操作系统和语言无关
- 4.3Java是面向对象的,所以RMI的调用结果可以是对象类型或者基本数据类型;RMI的结果统一由外部数据表示,这种语言抽象了字节序类和数据类型结构之间的差异。
- 5.Service和Service之间可以互相调用吗?是应该统一Controller调用Service,还是应该Service调用Service?
- 可以互相调用,在一个模块中是由Controller调用Service,像采用RMI拆分服务的话,就是Service调用Service.
- 6.Service对外暴露的接口粒度应该是怎么样的,是只提供基础的CRUD服务,还是应该将业务逻辑包含进去?
- 应该是还包含业务逻辑在内,才能满足不同模块需求。
- 7.Thrift,Protobuffer分别是什么,一般用于什么场景?
1)Thrift: 支持的语言更广泛一些c++, java, python,ruby, csharp, haskell, ocmal, erlang, cocoa, php
protobuf 目前还是只支持c++, java, python
2)Thrift提供的功能更丰富一些: Thrift提供了简单的RPC构架(其实不简单了, block, nonblock的都有了…..)
protobuf好像一心一意做好自己的事情,只提供了序列化和反序列化的功能。
3)Thrift支持多种协议格式. Thrift的代码实现,有专门的TProtocol和TTransport抽象,相互配合,可以实现多种协议,方便集成各种传输方式。至少目前Thrift就能使用json作为序列化协议。
protobuf只安心一种协议,并下决心把这个格式做好。输入输出也是标准的stream.
4)thrift目前不支持Windows平台
protobuf没有这个问题,提供了visual studio的项目文件,可以很顺利的在windows平台下编译。
5)thrift侧重点是构建夸语言的可伸缩的服务,特点就是支持的语言多,同时提供了完整的rpc service framework,可以很方便的直接构建服务,不需要做太多其他的工作。
- 8.什么是序列化和反序列化,在RMI中是否要实现 Serializable 接口, serialVersionUID的用处是什么?
- 序列化:把Java对象转换为字节序列的过程反序列化:把字节序列恢复为Java对象的过程
需要,首先,在跑Demo的时候,通过rmi传输对象时,不去实现Serializable接口,会抛异常;其次,rmi远程方法调用最底层是通过socket通信来实现对象的传输,其数据的传输最后都归结于二进制的数据包。
serialVersionUID:serialVersionUID适用于Java的序列化机制。简单来说,Java的序列化机制是通过判断类的serialVersionUID来验证版本一致性的。在进行反序列化时,JVM会把传来的字节流中的serialVersionUID与本地相应实体类的serialVersionUID进行比较,如果相同就认为是一致的,可以进行反序列化,否则就会出现序列化版本不一致的异常,即是InvalidCastException。
- 9.Controller通过RMI调用服务是否有延迟?10条Long型的ID循环调用1000次,和本地调用之间的时间相差多少?
这个我会去具体实现一下。
评论