通信方式
- 分布式系统通信方式
- 1. RMI
- RMI 通信实现案例
- 2. RPC
- 常用RPC框架
分布式系统通信方式
1. RMI
RMI ( Remote Method Invocation 远程方法调用)
客户端将要调用的方法及参数,打包为辅助对象,通过网络socket,发送给服务端辅助对象。服务端接收后,会进行解包,找出真正被调用的方法,然后将执行结果,依次再返回回去。服务端辅助对象进行打包,然后客户端辅助对象进行解包,结果返回给真正的调用者。
RMI 通信实现案例
- 创建一个maven项目
- 创建一个HelloService接口
// 1. 接口本身继承Remote
// 2. 被调用的方式也要抛出相关的异常
public interface HelloService extends Remote {//底层需要经过网络通信,是有风险的,所以需要抛出RemoteExceptionString sayHello(String msg) throws RemoteException;
}
- 创建一个HelloService实现类HelloServiceImpl
//1. 需要继承远程对象类 UnicastRemoteObject
//2. 由于此对象的参数和返回值都需要在网络上传输,所以需要可序列化 鼠标右键 Generate... ==> SerialVersionUID
public class HelloServiceImpl extends UnicastRemoteObject implements HelloService {//alt + insertprivate static final long serialVersionUID = -6444636358785164250L;//UnicastRemoteObject的构造函数抛出了异常,所以子类需要重写protected HelloServiceImpl() throws RemoteException {}public String sayHello(String msg) throws RemoteException {System.out.println("客户端返回的信息:" +msg);return "你想说的是这个::" +msg+"?";}
}
- 创建一个服务端
/*** 暴露服务* 提供可被调用的端口**/
public class RMIServer {public static void main(String[] args) {try {//通过本地中心注册LocateRegistry.createRegistry(9090);//注册具体实现类到通信地址下HelloService helloService = new HelloServiceImpl();Naming.bind("rmi://127.0.0.1/RMIServer",helloService);System.out.println("rmi服务端启动成功");} catch (Exception e) {e.printStackTrace();}}}
- 创建一个客户端
/*** 调用客户端RMI*/
public class RMIClient {public static void main(String[] args) {HelloService helloService = null;try {helloService = (HelloService) Naming.lookup("rmi://127.0.0.1:9090/RMIServer");String result = helloService.sayHello("hello demo ");System.out.println("客户端接收结果为: " + result);} catch (NotBoundException e) {e.printStackTrace();} catch (MalformedURLException e) {e.printStackTrace();} catch (RemoteException e) {e.printStackTrace();}}
}
- 先启动服务端再启动客户端
2. RPC
- LPC = Local Procedure Call 本地过程调用
本地过程调用(LPC)LPC用在多任务操作系统中,使得同时运行的任务能互相会话。 - RPC = Remote Procedure Call 远程过程调用
特指一种隐藏了过程调用时实际通信细节的IPC方法。
RPC真正的目的,是像调用本地方法一样去调用远程方法,而且不需要关心方法部署在哪里,这样才能够解耦服务。
简单说,RPC就是从一台机器通过参数传递的方式,调用另一台机器上的方法,并得到返回结果。
常用RPC框架
1) Dubbo,阿里开发,基于Spring和Netty,是当前使用最广泛的RPC框架
2) brpc,百度开发,“baidu-rpc”,支持多种协议,性能优良
3) grpc,谷歌开发,基于Netty,在人工智能领域有广泛应用,服务于tensorflow的底层通信
4) Thrift,脸书开发,已开源给apache,有一定的应用范围