Java RMI:Java远程方法调用,即Java RMI(Java Remote Method Invocation)是Java编程语言里,一种用于实现远程过程调用的应用程序编程接口。它使客户机上运行的程序能够调用远程服务器上的对象。远程方法调用特性使Java编程人员可以在网络环境中分布操做。RMI所有的宗旨就是尽量简化远程接口对象的使用。html
RMI能让一个Java程序去调用网络中另外一台计算机的Java对象的方法,那么调用的效果就像是在本机上调用同样。通俗的讲:A机器上面有一个class,经过远程调用,B机器调用这个class 中的方法。
RMI,远程方法调用(Remote Method Invocation)是Enterprise JavaBeans的支柱,是创建分布式Java应用程序的方便途径。RMI是很是容易使用的,可是它很是的强大。
RMI的基础是接口,RMI构架基于一个重要的原理:定义接口和定义接口的具体实现是分开的。java
RMI目前使用Java远程消息交换协议JRMP(Java Remote Messaging Protocol)进行通讯。JRMP是专为Java的远程对象制定的协议,因为JRMP是专为Java对象制定的,所以,RMI对于用非Java语言开发的应用系统的支持不足。不能与用非Java语言书写的对象进行通讯(意思是只支持客户端和服务器端都是Java程序的代码的远程调用)。git
这个工程主要是存放client和server都会用到的公共接口。github
public interface IUserService { User getUserByName(String username); }
主要提供接口的实现以及rmi的服务配置。web
@SpringBootApplication public class RmiBootServer { @Autowired private IUserService userService; @Autowired private IPermissionService permissionService; @Bean public RmiServiceExporter rmiServiceExporter(){ RmiServiceExporter rmiServiceExporter = new RmiServiceExporter(); rmiServiceExporter.setServiceName("userService"); rmiServiceExporter.setService(userService); rmiServiceExporter.setServiceInterface(IUserService.class); rmiServiceExporter.setRegistryPort(2002);// 默认为1099,注意占用问题 try { rmiServiceExporter.afterPropertiesSet(); } catch (RemoteException e) { e.printStackTrace(); } return rmiServiceExporter; } public static void main(String[] args) { SpringApplication.run(RmiBootServer.class, args); } }
@Service public class UserServiceImpl implements IUserService { @Override public User getUserByName(String username) { User user = null; if (username != null && !username.equals("")) { user = new User(); if (username.equals("admin")) { user.setUsername("admin"); user.setPassword("123456"); }else{ user.setUsername("xxxx"); user.setPassword("111111"); } } return user; } }
server:
port: 8002
本地client如何实现调用远程的接口实现。编程
@SpringBootApplication public class RmiBootClient { @Bean public RmiProxyFactoryBean rmiProxyFactoryBean(){ RmiProxyFactoryBean rmiProxyFactoryBean = new RmiProxyFactoryBean(); rmiProxyFactoryBean.setServiceUrl("rmi://127.0.0.1:2002/userService"); rmiProxyFactoryBean.setServiceInterface(IUserService.class); return rmiProxyFactoryBean; } public static void main(String[] args) { SpringApplication.run(RmiBootClient.class, args); } }
server: port: 8001 logging: level: root: info
@RunWith(SpringJUnit4ClassRunner.class) @SpringBootTest(classes=RmiBootClient.class, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) @Slf4j public class RmiTest { Gson gson = new Gson(); @Autowired private IUserService userService; @Test public void getUser(){ log.info("get user{}",gson.toJson(userService.getUserByName("admin"))); } }
https://github.com/shaweiwei/sudu-rmi服务器
须要远程传输的java bean必定要实现Serializable接口,具体为啥看这篇 java序列化反序列化深刻探究网络