大家好,我是IT修真院深圳分院第十期学员,一枚正直纯洁善良的JAVA程序员。
今天给大家分享一下,修真院官网JAVA任务八——部署两台Service,如何在WEB中随机访问任意一台Service
1.背景介绍
RMI简介
RMI(Remote Method Invocation)是JAVA早期版本(JDK 1.1)提供的分布式应用解决方案,它作为重要的API被广泛的应用在EJB中。
随着互联网应用的发展,分布式处理任务也随之复杂起 来,WebService也得到普遍的推广和应用。
2.知识剖析
RMI 指的是远程方法调用 (Remote Method Invocation)。它是一种机制,能够让在某个 Java虚拟机上的对象调用另一个 Java 虚拟机中的对象上的方法。
可以用此方法调用的任何对象必须实现该远程接口。
调用这样一个对象时,其参数为 "marshalled" 并将其从本地虚拟机发送到远程虚拟机(该远程虚拟机的参数为 "unmarshalled")上。
该方法终止时,将编组来自远程机的结果并将结果发送到调用方的虚拟机。
如果方法调用导致抛出异常,则该异常将指示给调用方。
3.常见问题
为什么要使用RMI,有什么优点
4.解决方案
优点:
1、面向对象:
RMI可将完整的对象作为参数和返回值进行传递,而不仅仅是预定义的数据类型。
也就是说,可以将类似Java哈西表这样的复杂类型作为一个参数进行传递。
2、可移动属性:
RMI可将属性从客户机移动到服务器,或者从服务器移动到客户机。
3、设计方式:
对象传递功能使您可以在分布式计算中充分利用面向对象技术的强大功能,如二层和三层结构系统。
如果用户能够传递属性,那么就可以在自己的解决方案中使用面向对象的设计方式。
所有面向对象的设计方式无不依靠不同的属性来发挥功能,如果不能传递完整的对象——包括实现和类型
——就会失去设计方式上所提供的优点。
4、安全性:
RMI使用Java内置的安全机制保证下载执行程序时用户系统的安全。
RMI使用专门为保护系统免遭恶意小程序侵害而设计的安全管理程序。
5、便于编写和使用
RMI使得Java远程服务程序和访问这些服务程序的Java客户程序的编写工作变得轻松、简单。
远程接口实际上就是Java接口。
5.编码实战
如何实现(serer之间的切换)
import com.jnshu.czm.service.UserService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Lazy;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import java.util.Random;
public class SwitchService {
private static Logger logger = LoggerFactory.getLogger(SwitchService.class);
private static ApplicationContext applicationContext =
new ClassPathXmlApplicationContext("rmiClient.xml");
public static UserService getUserService() {
UserService userService = null;
Random random = new Random();
int i = random.nextInt(2);
if (i == 1) {
try {
logger.error("get data from server1");
userService = (UserService) applicationContext.getBean("RmiService1");
} catch (Exception e) {
logger.error("get a error,turn to server2");
userService = (UserService) applicationContext.getBean("RmiService2");
}
} else {
try {
logger.error("get data from server2");
userService = (UserService) applicationContext.getBean("RmiService2");
} catch (Exception e) {
logger.error("get a error,turn to server1");
userService = (UserService) applicationContext.getBean("RmiService1");
}
}
return userService;
}
}
6.扩展思考
7.参考文献
百度、维基、CSDN
8.更多讨论
Q1:
registryPort和servicePort?
A1:
注册端口:registryPort 注册端口是RMI注册远程服务的端口。
服务端口:servicePort RMI的通讯需要的传送数据的端口。如果没有设置servicePort,则使用随机端口。
Q2:
RMI 服务器重启,总是会出现客户端连接拒绝的问题。
A2:
服务器重启会影响到客户端,说明客户端有保存着重启之前的服务器连接相关记录。有可能是客户端有缓存,所以只要刷新缓存即可解决问题。
Q3:
Spring RMI会占用两个端口?
A3:
Spring RMI 有两个端口,一个是注册端口(默认为1099),还有一个是数据传输端口,如果不指定,数据传输端口是随机分配的。
-------------------------------------------------------------------------------------------------------------------------
今天的分享就到这里啦,欢迎大家点赞、转发、留言、拍砖~
技能树.IT修真院
“我们相信人人都可以成为一个工程师,现在开始,找个师兄,带你入门,掌控自己学习的节奏,学习的路上不再迷茫”。
这里是技能树.IT修真院,成千上万的师兄在这里找到了自己的学习路线,学习透明化,成长可见化,师兄1对1免费指导。
快来与我一起学习吧~http://www.jnshu.com/home