Dobbo---分布式系统通信方式

分布式系统通信方式

1. RMI

RMI ( Remote Method Invocation 远程方法调用)
在这里插入图片描述

图1.1 客户端-服务端通信方式

客户端将要调用的方法及参数,打包为辅助对象,通过网络socket,发送给服务端辅助对象。服务端接收后,会进行解包,找出真正被调用的方法,然后将执行结果,依次再返回回去。服务端辅助对象进行打包,然后客户端辅助对象进行解包,结果返回给真正的调用者。

RMI 通信实现案例

在这里插入图片描述

1-2项目文件结构图
  1. 创建一个maven项目
  2. 创建一个HelloService接口
// 1. 接口本身继承Remote
// 2. 被调用的方式也要抛出相关的异常
public interface HelloService extends Remote {
    //底层需要经过网络通信,是有风险的,所以需要抛出RemoteException
    String sayHello(String msg) throws RemoteException;
}

  1. 创建一个HelloService实现类HelloServiceImpl
//1. 需要继承远程对象类 UnicastRemoteObject
//2. 由于此对象的参数和返回值都需要在网络上传输,所以需要可序列化 鼠标右键 Generate... ==> SerialVersionUID
public class HelloServiceImpl extends UnicastRemoteObject implements HelloService {


    //alt + insert
    private static final long serialVersionUID = -6444636358785164250L;



    //UnicastRemoteObject的构造函数抛出了异常,所以子类需要重写
    protected HelloServiceImpl() throws RemoteException {
    }

    public String sayHello(String msg) throws RemoteException {
        System.out.println("客户端返回的信息:" +msg);
        return "你想说的是这个::" +msg+"?";
    }
}


  1. 创建一个服务端

/**
 * 暴露服务
 * 提供可被调用的端口
 *
 */
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();
        }

    }


}
  1. 创建一个客户端
/**
 * 调用客户端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();
        }
    }
}

  1. 先启动服务端再启动客户端

在这里插入图片描述

图1.3 服务端-客户端通信结果

2. RPC

在这里插入图片描述

图2-1 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,有一定的应用范围

  • 12
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小江||小廖

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值