Java实现RPC(源码)

本文介绍了RPC在分布式系统中的作用,详细讲解了其组成成员包括动态代理、序列化和网络传输,并分享了使用Java实现RPC的具体源码,包括接口代理、序列化方式和网络传输模块的封装。同时,提供了功能测试的客户端和服务端测试,以及GitHub上的源码地址。
摘要由CSDN通过智能技术生成

一、RPC简介

分布式系统的成员之一,解决服务之间的调用问题。远程调用时,RPC实现了调用远程服务能够像本地调用一样方便,让调用者感知不到远程调用的逻辑。

二、RPC组成成员

  • 动态代理
  • 序列化
  • 网络传输
  • 调用服务API接口
    本次RPC搭建使用的接口代理模式、Java默认Serializable序列化以及BIO网络传输方式

三、源码实现

  • 动态代理模块封装
package com.ruider.Invoker;

/**
 * 动态代理工厂,对相应的class生产其对应代理类
 */

import com.ruider.common.ServiceInformation;
import com.ruider.networkCommunication.BIOService;
import com.ruider.networkCommunication.NetIO;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;


public class InvokerUtils implements InvocationHandler {
   

    /**
     * 调用服务类
     */
    private Class clazz;

    /**
     * 调用服务管理
     */
    private ServiceInformation serviceInformation;

    /**
     * 获取代理对象
     * @param T
     * @param url
     * @param port
     * @return
     */
    public Object getBean (Class T, String url, int port) {
   
        this.clazz = T;
        ServiceInformation serviceInformation = new ServiceInformation();
        serviceInformation.setServiceURL(url);
        serviceInformation.setPort(port);
        serviceInformation.setClassName(T.getName());
        this.serviceInformation = serviceInformation;
        return Proxy.newProxyInstance(T.getClassLoader(), new Class[]{
   T}, this);
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
   
        NetIO BIO = new BIOService();
        this.serviceInformation.setMethod(method);
        this.serviceInformation.setArgs(args);
        return BIO.send(serviceInformation);
    }
}
  • 网络传输模块封装
package com.ruider.networkCommunication;

import com.ruider.common.ServiceInformation;

/**
 * BIO服务
 */
public interface NetIO {
   

    /**
     * 客户端发送请求到其他服务端
     * @param serviceInformation
     * @return
     */
    Object send (ServiceInformation serviceInformation);

    /**
     * 本机作为服务端接受请求并且处理请求
     * @param port
     */
    void recv (int port);
}

package com.ruider.networkCommunication;

import com.ruider.common.ServiceInformation;
import com.ruider.common.UserApi;
import com.ruider.server.UserService;

import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.lang.reflect.Method;
import java.net.ServerSocket;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值