需要看的面试知识点,不断更新

时间:2019-06-13
本文章向大家介绍需要看的面试知识点,不断更新,主要包括需要看的面试知识点,不断更新使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

目前在做AGV小车项目,准备改openTCS源码进行二次开发,期间用到不少以前没有接触过的技术,在此记录,希望能有所收获。TRUST THE PROCESS.

Gradle :类似于Maven

guice:依赖注入,类似于spring的DI

https://www.imooc.com/video/15918

RMI:远程方法调用(Remote Method Invocation)

一、工作原理

RMI能让一个Java程序去调用网络中另一台计算机的Java对象的方法,那么调用的效果就像是在本机上调用一样。通俗的讲:A机器上面有一个class,通过远程调用,B机器调用这个class 中的方法。RMI的基础是接口,RMI构架基于一个重要的原理:定义接口和定义接口的具体实现是分开的。下面我们通过具体的例子,建立一个简单的远程计算服务和使用它的客户程序。

二、RMI包含部分:

  1. 远程服务的接口定义
  2. 远程服务接口的具体实现
  3. 桩(Stub)和框架(Skeleton)文件
  4. 一个运行远程服务的服务器
  5. 一个RMI命名服务,它允许客户端去发现这个远程服务
  6. 类文件的提供者(一个HTTP或者FTP服务器)
  7. 一个需要这个远程服务的客户端程序

三、RMI的用途?

   RMI的用途是为分布式Java应用程序之间的远程通信提供服务,提供分布式服务。

     目前主要应用时封装在各个J2EE项目框架中,例如Spring,EJB(Spring和EJB均封装了RMI技术)

     在Spring中实现RMI:

     ①在服务器端定义服务的接口,定义特定的类实现这些接口;

     ②在服务器端使用org.springframework.remoting.rmi.RmiServiceExporter类来注册服务;

     ③在客户端使用org.springframework.remoting.rmi.RmiProxyFactoryBean来实现远程服务的代理功能;

     ④在客户端定义访问与服务器端服务接口相同的类

四、RMI的局限?                                                                    

  RMI目前使用Java远程消息交换协议JRMP(Java Remote Messaging Protocol)进行通信。JRMP是专为Java的远程对象制定的协议,由于JRMP是专为Java对象制定的,因此,RMI对于用非Java语言开发的应用系统的支持不足。不能与用非Java语言书写的对象进行通信(意思是只支持客户端和服务器端都是Java程序的代码的远程调用)。 

  由于客户机和服务器都是使用Java编写的,二者平台兼容性的要求仅仅是双方都运行在版本兼容的Java虚拟机上。

五、RMI调用远程方法的参数和返回值

      当调用远程对象上的方法时,客户机除了可以将原始类型的数据作为参数以外,还可以将对象作为参数来传递,与之相对应的是返回值,可以返回原始类型或对象,这些都是通过Java的对象序列化(serialization 序列化 (Serialization)是将对象的状态信息转换为可以存储或传输的形式的过程。在序列化期间,对象将其当前状态写入到临时或持久性存储区。以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象。)技术来实现的。(换而言之:参数或者返回值如果是对象的话必须实现Serializable接口)

、 RMI应用程序的基本模型

八、RMI体系结构

 

    桩/框架(Stub/Skeleton)层:客户端的桩和服务器端的框架;

      远程引用(remote reference)层:处理远程引用行为

      传送层(transport):连接的建立和管理,以及远程对象的跟踪

九、 RMI类和接口(完成一个简单RMI需要用到的类)。

 

 

 

(一) Remote接口:是一个不定义方法的标记接口

      Public interface Remote{}

      在RMI中,远程接口声明了可以从远程Java虚拟机中调用的方法集。远程接口满足下列要求:

      1、远程接口必须直接或间接扩展Java.rmi.Remote接口,且必须声明为public,除非客户端于远程接口在同一包中

      2、在远程接口中的方法在声明时,除了要抛出与应用程序有关的一场之外,还必须包括RemoteException(或它的超类,IOExcepion或Exception)异常

      3、在远程方法声明中,作为参数或返回值声明的远程对象必须声明为远程接口,而非该接口的实现类。

(二) RemoteObject抽象类实现了Remote接口和序列化Serializable接口,它和它的子类提供RMI服务器函数。

(三) LocateRegistry final()用于获得特定主机的引导远程对象注册服务器程序的引用(即创建stub),或者创建能在特定端口接收调用的远程对象注册服务程序。

服务器端:向其他客户机提供远程对象服务

      SomeService servcie=……;//远程对象服务

  1. Registry registry=LocateRegisty.getRegistry();//Registry是个接口,他继承了Remote,此方法返回本地主机在默认注册表端口 1099 上对远程对象 Registry 的引用。
  2. getRegistry(int port) 返回本地主机在指定 port 上对远程对象 Registry 的引用;
  3. getRegistry(String host)  返回指定 host 在默认注册表端口 1099 上对远程对象 Registry的引用;
  4. getRegistry(String host, int port) 返回指定的 host 和 port 上对远程对象 Registry 的引用
  5. registry.bind(“I serve”,service);// bind(String name,Remote obj) 绑定对此注册表中指定 name 的远程引用。name : 与该远程引用相关的名称 obj : 对远程对象(通常是一个 stub)的引用
  6. unbind(String name)移除注册表中指定name的绑定。
  7. rebind(String name,Remote obj)重新绑定,如果name已存在,但是Remote不一样则替换,如果Remote一样则丢弃现有的绑定
  8. lookup(String name) 返回注册表中绑定到指定 name 的远程引用,返回Remote
  9. String[] list()   返回在此注册表中绑定的名称的数组。该数组将包含一个此注册表中调用此方法时绑定的名称快照。

客户机端:向服务器提供相应的服务请求。

Registry registry=LocateRegisty.getRegistry();
SomeService servcie=(SomeService)registry.lookup(“I serve”);
Servcie.requestService();

(四) Naming和Registry类类似。

客户端:

      Naming.lookup(String url)

      url 格式如下"rmi://localhost/"+远程对象引用
服务器端:
     Registry registry=LocateRegistry.createRegistry(int port);
     Naming.rebind(“service”,service);

(五) RMISecurityManager

     在RMI引用程序中,如果没有设置安全管理器,则只能从本地类路径加载stub和类,这可以确保应用程序不受由远程方法调用所下载的代码侵害

     在从远程主机下载代码之前必须执行以下代码来安装RMISecurityManager:

     System.setSecurityManager(new RMISecurityManager());

好多东西看不懂,记下来仔细看看

Demo开发见原文吧

https://www.cnblogs.com/songanwei/p/9417254.html 

https://www.bilibili.com/video/av30424999?from=search&seid=7346952494151516402  b站的一个搭建RMI服务器的视频

 

dubbo:Dubbo是一款高性能、轻量级的开源Java RPC框架,它提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现。

原文地址:https://www.cnblogs.com/jianghengsh/p/11015088.html