发表于: 2017-12-06 23:49:20

1 640


今天完成的事情:

1.显示学习java  RMI,做了两个demo

(1)单纯的接口,然后访问

接口就是那样的接口,实现类也是一样的实现接口的实现类。

区别在于需要继承remote来使其可以处理异常。内部是没有任何东西的,就是处理异常的作用。

然后就是最主要的一个Stub

启动服务器:

有三步:

1)绑定端口

2)实例化接口类

3)将实例绑定到服务器上

就可以运行主方法进行启动了。

如下图,打印出111-------111就表示启动了,当然也可以查看“3165”端口的进程。

最后开启客户端调用服务端的接口方法,实现输出:

这里直接采用的是测试类进行调用。

实体类中方法的返回值是“hello+name”,入参只有name。

客户端显示要实例化对象,通过绑定实例化的名字,当然一切前提都是目前都在本地。

然后利用实例化的对象调用接口方法,就可以输出我们想要的内容。

(2)调用实体类的构造方法,进行测试

上述测试,知识对RMI简单了解,如果要在项目中使用,就需要调用别的地方的对象或参数。

这里先测试java bean的。

可新建实体类,也可利用项目中的。

我新建了一个Rmi实体类,然后有id和name属性。加上构造函数。

然后一样的四样,接口,实现,服务端,客户端。

然后运行客户端出现报错:

关于序列化的错。

就是说,我在客户端调用对象以后,显示将其进行序列化操作,因为RMI是需要将数据进行传输的,所以转化为字节符的形式最安全,传到服务器以后调用对象,接口方法。最后将返回值按照原路径返回过来,给客户端。

所以是需要实体类实现序列化的。

然后在设个serialVersionUID的值,从而反序列化是不会导致有偏差。

最后打印出正确的值:

实现类里面返回的是一个实体类对象,我们根据name属性获取到对象,然后将其id获取到后打印出来,就是我们看到的1.

2.学习Spring RMI

说起spirng,就是整合,将一些参数整合到配置文件中,然后调用配置文件就行了。

Spring RMI呢,就是不需要再抛出异常了,该整合的都整合了。

还是分为两部分,服务端和客户端。核心配置文件。

(1)服务端 

配置文件:

很熟悉,就是接口,实现,端口,服务端名。

将服务端的主方法的参数放过来,然后接口,实现写完后,在主方法中直接实例化这个配置文件,就可以启动服务器了。

这就是根据配置文件中提供的端口号,查看是否已经启动成功的进程。

可以看的出来,是java。OK了。

(2)客户端

配置文件:

只有两个熟悉配置,一个接口对象,还有一个就是调用服务端的URL。

然后在客户端进行调用方法:

返回的是一个加法的算式结果。

因为客户端的写的是测试方法,所以就直接写在下面了,可以很形象的看出来。

调用配置文件,服务端启动,然后客户端这边实例化服务端的对象,并调用其方法,就可以输出值了。

明天计划的事情:

讲完小课堂,也不知道可不可以结束任务八,尽力吧!

遇到的问题:

现在要对项目的service和web进行分离,那拿出去的service接口中方法怎么个写法,因为dao层有三个接口类,那方法service怎么写?

收获:

1.学习分布式的这种概念。

RMI:远程调用方法

表现为:service层和web层的分离。

最终需要RMI的作用是在于优化业务逻辑层的代码。可以是程序在调用接口方法是的响应速度提高。

那这和以前遇到的负载均衡是有相同目的的。我可以利用nginx配置多个web服务器,然后每个服务器下都将分离出去的service层放进去,这样可以达到高并发的效果。

就是说给同一个业务配置多个服务器,这样本来1s中只能访问10次的,配置2个服务器,就可以访问20次了。这就是集群。

那我一个业务里面包含增删改查,按代码运行的顺序来说,肯定很影响访问DB的时间,所以可不可以将这些子业务分开来,然后进行配置呢。

这就是分布式的概念:

将业务的子业务分配在不同的服务器上,这样可以达到一个时间里面同时做很多业务的事。

2.Stub(存根)和Skeleton(骨架)

   Stub和Skeleton是经过rmic命令生成的,我们的程序要通过远程调用,底层一定是套接字的字节传输,要一个对象序列化成为一个字节数组,传输到服务器或者客户端的对端之后,再把该对象反序列化成为对应的对象,这些网络传输的过程要求安全,稳定等等非常麻烦的操作,Stub驻留客户端,承担着代理远程对象的实现者的角色,Skeleton类帮助远程对象与Stub再RMI连接上进行通信。RMI的客户与Stub进行交换,Stub与Skeleton通信,Skeketon负责与服务器进行交互,因此有了Stub和Skeleton之后我们就不需要实现底层通信的细节,我们进行的远程调用,只需要通过接口对方法进行操作即可,使分布式调用实现了位置上的透明,即:远程调用就像本地调用一样。
    通俗的说,RMI的代理模式迫使方法调用必须通过充当替身的代理对象,即Stub和Skeleton,由这些代理对象将方法传递给实际的对象。
    在远程虚拟机中,每个远程对象都有一个Skeleton对应,Skeleton负责将调用分配给实际的远程对象来实现,他的工作是在服务器端的。在JDK1.2版本以上的环境中不需要Skeleton,因为Jdk1.2推出了附加的Skeleton,并且对底层的协议也进行了修改,性能上有很大提升,默认的rmic命令是不会产生Skeleton类的,如果要想生成Skeleton类可以使用rmic -v1.1 即可。
    Stub的操作任务:
     a、初始化与包含远程对象远程虚拟机的连接
     b、与远程虚拟机参数进行编组,也就是调度,包括参数的写入以及传输
     c、等待方法的调用结果
     d、解编返回值和返回的异常。也就是读取服务器上的返回值,也称为反调度
     e、将结果返回给调用程序。
    Skeleton对应的任务:
     a、读取远程方法的参数,也就是解编
     b、调用实际远程对象上的方法
     c、将结果或者异常组编(写入并传输)给调用程序。
    Stub与Skeleton的关系以及操作是对应的关系。只要我们有编译好的远程对象的类,就可以调用jdk的rmic命令来生成stub和skeleton了,关键是我们需要理解Stub是客户端应用程序的代理,Skeleton是服务器端应用程序的代理,他们之间协作完成客户端与服务器之间的方法调用时的通信。
    了解者两个概念之后,我们接下来需要了解JNDI以及RMI注册表两个概念,等剩下的两个概念了解了,我们基本上对RMI就可以入门了。


返回列表 返回列表
评论

    分享到