分布式消息通信框架RPC

文章详细介绍了RPC(远程过程调用)的概念,通过JavaRMI展示了远程方法调用的基本实现,包括创建接口、实现接口、注册服务和启动服务的步骤。然后,文章进一步探讨了手动实现RPC框架的思路,分为服务端和客户端两部分,涉及ServerSocket、线程池、动态代理和TCP连接等技术。
摘要由CSDN通过智能技术生成

什么是RPC

RPC(Remote Procedure Call,远程过程调用),一般用来实现部署在不同机器上的系统之间的方法调用,使得程序能够像访问本地系统资源一样,通过网络传输去访问远端系统资源;对于客户端来说, 传输层使用什么协议,序列化、反序列化都是透明的

了解 Java RMI

RMI 全称是 remote method invocation – 远程方法调用, 一种用于远程过程调用的应用程序编程接口,是纯 java 的网络分布式应用系统的核心解决方案之一。RMI 目前使用 Java 远程消息交换协议 JRMP(Java Remote Messageing Protocol)进行通信,由于 JRMP 是专为 Java 对象制定的,是分布式应用系统的百分之百纯 java 解决方案,用 Java RMI 开发的应用系统可以部署在任何支持 JRE 的平台上,缺点是,由于 JRMP 是专门为 java 对象指定的, 因此 RMI 对于非 JAVA 语言开发的应用系统的支持不足,不能与非 JAVA 语言书写的对象进行通信

Java RMI代码实现

1、创建一个IHelloService接口,提供一个sayHello方法,由于接口要作为远程调用的服务发布出去,所以要先继承Rmote表示这是一个远程调用的服务:

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

2、新建HelloServiceImpl继承UnicastRemoteObject,实现IhelloService接口。

public class HelloServiceImpl extends UnicastRemoteObject implements IHelloService {
   

    public HelloServiceImpl() throws RemoteException {
   
        super();
    }

    @Override
    public String sayHello(String msg) throws RemoteException {
   
        return "Hello,"+msg;
    }
}

3、注册并启动服务

 public static void main(String[] args) throws RemoteException {
   
        try{
   
            IHelloService service = new HelloServiceImpl();
            LocateRegistry.createRegistry(1099);
            Naming.bind("rmi//127.0.0.1/sayHello", service);
            System.out.println("服务启动成功!");
        }catch (Exception e){
   
            e.printStackTrace();
        }
    }

4、客户端访问服务

 public static void main(String[] args) throws MalformedURLException, NotBoundException, RemoteException {
   
       IHelloService iHelloService = (IHelloService)Naming.lookup("rmi//127.0.0.1/sayHello");
        System.out.println(iHelloService.sayHello("yangChanglLing"));
    }

手动实现RCP框架

手动实现RPC框架的思路

创建两个工程,一个作为服务提供端Service,一个作为客户端Client。
Service服务端
1.创建一个服务(提供服务的接口,以及接口实现类)
2.提供一个publish方法
3.这个方法新建一个ServerSocket,向外暴露一个端口,提供一个服务
4.通过while(true){serversocket.accept()}监听暴露的端口
5.通过线程池为每一个客户端提供一个线程的服务
6.线程里通过TCP连接拿到对应的参数,通过反射获取到对应类的方法,执行
7.将执行结果写回给客户端
Client客户端
1.创建要访问的服务的对应的接口(与服务端保持一致)
2.创建动态代理类,用于代理客户端将要访问的服务
3.实现动态代理的invoke方法,通过socket=new Socket(host,port)新建连接
4.创建客户端与服务端交互的实体类,用于tcp数据传输(将要请求的参数序列化传输)
5.通过代理类发送请求数据(返回即为调用服务的结果)
在这里插入图片描述

服务端Service

1、服务端创建一个接口IHelloService,作为向外提供的服务,

public interface IHelloService {
   
    String Hello(String msg);
}

2.接口实现类

public class HelloServiceImpl implements IHelloService {
   
    @Override
    public String Hello(String msg) {
   
        return "Hello,"+msg;
    }
}

3、新建一个RpcService类提供服务的发布,在RpcService创建publisher方法发布服务,publisher方法,通过port新建socke套接字连接,启动一个服务监听。利用线程池执行,新建ProcessorHander处理Socket请求:

public class RpcService {
   
    private final ExecutorService executorService = Executors.newCachedThreadPool();
    //发布
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值