栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

RMI的基础原理

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

RMI的基础原理

背景

上世纪90年代, 焦点转移到跨平台通信-一台计算机可以通过某种类型网络在另一台计算机上发起一个动作
CORBA、DCOM、Java RMI 技术等等,到现在的grpc等

Hello

package example.hello;

import java.rmi.Remote;
import java.rmi.RemoteException;

public interface Hello extends Remote {
    String sayHello() throws RemoteException;
}

server

package example.hello;
        
import java.rmi.registry.Registry;
import java.rmi.registry.LocateRegistry;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
        
public class Server implements Hello {
        
    public Server() {}

    public String sayHello() {
        return "Hello, world!";
    }
        
    public static void main(String args[]) {
        
        try {
            Server obj = new Server();
            Hello stub = (Hello) UnicastRemoteObject.exportObject(obj, 0);

            // Bind the remote object's stub in the registry
            Registry registry = LocateRegistry.getRegistry();
            registry.bind("Hello", stub);

            System.err.println("Server ready");
        } catch (Exception e) {
            System.err.println("Server exception: " + e.toString());
            e.printStackTrace();
        }
    }
}

client

package example.hello;

import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;

public class Client {

    private Client() {}

    public static void main(String[] args) {

        String host = (args.length < 1) ? null : args[0];
        try {
            Registry registry = LocateRegistry.getRegistry(host);
            Hello stub = (Hello) registry.lookup("Hello");
            String response = stub.sayHello();
            System.out.println("response: " + response);
        } catch (Exception e) {
            System.err.println("Client exception: " + e.toString());
            e.printStackTrace();
        }
    }
}
基础原理

RMI依赖于JVM, 仅支持用一个JVM调用到另一个JVM, 这种协议叫做JRMP
为了通用性(不仅仅Java), 出现了CORBA

原理图

客户端调用远程对象时,由 stub将请求传递给RRL, RRL与远程的RRL交互,最终server去调用这个方法,把返回值给传回了,我客户端调用方法就好像在自己本地调用一样, 不需要考虑细节. 序列化和如何通信这些都由存根去给封装了(代理模式)

上面的代码Registry就是个注册中心,服务端去注册给出的接口(对象), 这样客户端就可以lookup去查找是否由这个对象,找到就可以调用自己想要调用的接口了

RPC框架的重要结构

  1. 注册中心 :保存所有服务的名字,服务提供者的ip列表,服务消费者的IP列表
  2. 服务提供者: 提供跨进程服务
  3. 服务消费者: 寻找到指定命名的服务并消费。
举个常见的注册中心zookeeper用作注册中心

可以保证服务的高可用性, 容错容灾能力等等.

写的那么累,不采纳也给个赞把,谢谢(我是个庸俗的人)

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/351918.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号