Java RMI 实践

定义

Java 远程方法调用,即 Java RMI(Java Remote Method Invocation)是 Java 编程语言里,一种用于实现远程过程调用的应用程序编程接口。它使客户机上运行的程序可以调用远程服务器上的对象。远程方法调用特性使 Java 编程人员能够在网络环境中分布操作。RMI 全部的宗旨就是尽可能简化远程接口对象的使用。

参考维基百科:https://wikipedia.tk.gugeeseo.com/baike-Java远程方法调用

实例

比如我们提供一个简单的 HelloService 服务调用,代码如下:

  1. // 接口
  2. public interface IHelloService {
  3. String sayHello(String msg);
  4. }
  5. // 实现类
  6. public class HelloServiceImpl implements IHelloService {
  7. public String sayHello(String msg) {
  8. return "Hello " + msg;
  9. }
  10. }

在同一个应用里面只需要实例化这个 HelloServiceImpl 对象就可以使用了,但是如果出现了跨进程、跨应用调用 HelloService 服务怎么实现呢?我们拿不到 HelloServiceImpl 对象。

所以我们使用 Java RMI 来实现跨进程、跨应用的服务调用。如果要实现 Java RMI 需要对 HelloService 服务做如下改动。

1.IHelloService 接口继承 Remote 接口,方法 sayHello 抛出 RemoteException 异常

  1. public interface IHelloService extends Remote {
  2. String sayHello(String msg) throws RemoteException;
  3. }

2.HelloServiceImpl 类继承 UnicastRemoteObject 类,重写构造函数,方法 sayHello 抛出 RemoteException 异常
**

  1. public class HelloServiceImpl extends UnicastRemoteObject implements IHelloService {
  2. protected HelloServiceImpl() throws RemoteException {
  3. super();
  4. }
  5. public String sayHello(String msg) throws RemoteException {
  6. return "Hello " + msg;
  7. }
  8. }

3.发布服务

  1. public class Server {
  2. public static void main(String[] args) {
  3. // 发布服务
  4. try {
  5. IHelloService helloService = new HelloServiceImpl();
  6. LocateRegistry.createRegistry(2000);
  7. Naming.rebind("rmi://127.0.0.1:2000/hello", helloService);
  8. System.out.println("服务启动成功");
  9. } catch (Exception e) {
  10. e.printStackTrace();
  11. }
  12. }
  13. }

4.客户端的 Demo 里面调用远程服务

  1. public class ClientDemo {
  2. public static void main(String[] args) {
  3. try {
  4. IHelloService helloService =
  5. (IHelloService) Naming.lookup("rmi://127.0.0.1:2000/hello");
  6. System.out.println(helloService.sayHello("zhangsan"));
  7. } catch (Exception e) {
  8. e.printStackTrace();
  9. }
  10. }
  11. }

RMI 源码分析

深究Java中的RMI底层原理

作者:殷建卫 链接:https://www.yuque.com/yinjianwei/vyrvkf/co43r6 来源:殷建卫 - 架构笔记 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。