背景
上世纪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);
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框架的重要结构
- 注册中心 :保存所有服务的名字,服务提供者的ip列表,服务消费者的IP列表
- 服务提供者: 提供跨进程服务
- 服务消费者: 寻找到指定命名的服务并消费。
举个常见的注册中心zookeeper用作注册中心
可以保证服务的高可用性, 容错容灾能力等等.
写的那么累,不采纳也给个赞把,谢谢(我是个庸俗的人)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)