网络编程--rpc实现原理--rpc--迭代版本v1--本地方法调用

limeOracle limeOracle     2022-09-05     188

关键词:

 网络编程 -- RPC实现原理 -- 目录

  啦啦啦

V1——RPC -- 本地方法调用:不通过网络 入门

  1. RPCObjectProxy rpcObjectProxy = new RPCObjectProxy(new LocalRPCClient()); : 绑定目标对象

  2. IUserService userService = (IUserService) rpcObjectProxy.create(IUserService.class); :返回代理类

  3. List<User> users = userService.queryAll(10, 4); : 调用目标对象的  Object invokeMethod(MethodStaics methodStaics);  方法,通过反射返回指定接口实现方法的返回值。

 

  Class : RPCObjectProxy

package lime.pri.limeNio.netty.rpc01.proxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.List;

import lime.pri.limeNio.netty.rpc01.entity.User;
import lime.pri.limeNio.netty.rpc01.service.IUserService;

public class RPCObjectProxy implements InvocationHandler {

    private RPCClient rpcClient;

    public RPCObjectProxy() {
        super();
    }

    public RPCObjectProxy(RPCClient rpcClient) {
        super();
        this.rpcClient = rpcClient;
    }

    private Class<?> targetInterface;

    public Object create(Class<?> targetInterface) {
        this.targetInterface = targetInterface;
        return Proxy.newProxyInstance(RPCObjectProxy.class.getClassLoader(), new Class[] { targetInterface }, this);
    }

    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        return rpcClient
                .invokeMethod(new MethodStaics(targetInterface, method.getName(), args, method.getParameterTypes()));
    }

    public static void main(String[] args) {

        RPCObjectProxy rpcObjectProxy = new RPCObjectProxy(new LocalRPCClient());
        IUserService userService = (IUserService) rpcObjectProxy.create(IUserService.class);
        System.out.println("---queryAll");
        List<User> users = userService.queryAll(10, 4);
        for (User user : users) {
            System.out.println(user);
        }
        System.out.println("---queryById");
        User user = userService.queryById(20);
        System.out.println(user);
    }
}

  Class : RPCClient

package lime.pri.limeNio.netty.rpc01.proxy;

public interface RPCClient {

    Object invokeMethod(MethodStaics methodStaics);

}

  Class : LocalRPCClient

package lime.pri.limeNio.netty.rpc01.proxy;

import java.lang.reflect.Method;

import lime.pri.limeNio.netty.rpc01.service.IUserService;

public class LocalRPCClient implements RPCClient {

    public Object invokeMethod(MethodStaics methodStaics) {
        try {
            IUserService object = (IUserService) BeanFactory.get(methodStaics.getTargetInterface().getSimpleName());
            Method method = object.getClass().getDeclaredMethod(methodStaics.getMethod(),
                    methodStaics.getParameterTypes());
            return method.invoke(object, methodStaics.getArgs());
        } catch (Exception e) {
            System.out.println(e);
        }
        return null;
    }

}

  Class : BeanFactory

package lime.pri.limeNio.netty.rpc01.proxy;

import java.util.HashMap;
import java.util.Map;

import lime.pri.limeNio.netty.rpc01.service.IUserService;
import lime.pri.limeNio.netty.rpc01.service.impl.UserService;

public class BeanFactory {

    private static Map<String,Object> beanFactory;
    static{
        beanFactory = new HashMap<String, Object>();
        beanFactory.put(IUserService.class.getSimpleName(), new UserService());
    }
    public static Object get(String targetInterface){
        return beanFactory.get(targetInterface);
    }
}

  Class : IUserService

package lime.pri.limeNio.netty.rpc01.service;

import java.util.List;

import lime.pri.limeNio.netty.rpc01.entity.User;

public interface IUserService {

    User queryById(Integer id);
    
    List<User> queryAll(Integer pageSize,Integer pageNum);
}

  Class : UserService

package lime.pri.limeNio.netty.rpc01.service.impl;

import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import lime.pri.limeNio.netty.rpc01.entity.User;
import lime.pri.limeNio.netty.rpc01.service.IUserService;

public class UserService implements IUserService {

    private static Map<Integer, User> userMap = new HashMap<Integer, User>();

    static {
        for (int i = 1; i <= 100; i++) {
            userMap.put(i, new User(i, "lime_" + i, new Date()));
        }
    }

    public User queryById(Integer id) {
        return userMap.get(id);
    }

    public List<User> queryAll(Integer pageSize, Integer pageNum) {
        int stNum = (pageNum - 1) * pageSize + 1;
        int enNum = pageNum * pageSize;
        List<User> result = new ArrayList<User>();
        for (int i = stNum; i <= enNum; i++) {
            result.add(userMap.get(i));
        }
        return result;
    }
}

  Class : 

package lime.pri.limeNio.netty.rpc01.proxy;

import java.io.Serializable;
import java.util.Arrays;

/**
 * @author lime
 *
 */
public class MethodStaics implements Serializable{

    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    private Class<?> targetInterface;
    private String method;
    private Object[] args;
    private Class[] parameterTypes;
    public MethodStaics() {
        super();
        // TODO Auto-generated constructor stub
    }
    public MethodStaics(Class<?> targetInterface, String method, Object[] args, Class[] parameterTypes) {
        super();
        this.targetInterface = targetInterface;
        this.method = method;
        this.args = args;
        this.parameterTypes = parameterTypes;
    }
    @Override
    public String toString() {
        return "MethodStaics [targetInterface=" + targetInterface + ", method=" + method + ", args="
                + Arrays.toString(args) + ", parameterTypes=" + Arrays.toString(parameterTypes) + "]";
    }
    public Class<?> getTargetInterface() {
        return targetInterface;
    }
    public void setTargetInterface(Class<?> targetInterface) {
        this.targetInterface = targetInterface;
    }
    public String getMethod() {
        return method;
    }
    public void setMethod(String method) {
        this.method = method;
    }
    public Object[] getArgs() {
        return args;
    }
    public void setArgs(Object[] args) {
        this.args = args;
    }
    public Class[] getParameterTypes() {
        return parameterTypes;
    }
    public void setParameterTypes(Class[] parameterTypes) {
        this.parameterTypes = parameterTypes;
    }

}

  Class : User

package lime.pri.limeNio.netty.rpc01.entity;

import java.io.Serializable;
import java.util.Date;

public class User implements Serializable {

    /**
     * 
     */
    private static final long serialVersionUID = 1L;

    private int id;
    private String name;
    private Date birth;

    public User() {
        super();
        // TODO Auto-generated constructor stub
    }

    public User(int id, String name, Date birth) {
        super();
        this.id = id;
        this.name = name;
        this.birth = birth;
    }

    @Override
    public String toString() {
        return "User [id=" + id + ", name=" + name + ", birth=" + birth + "]";
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Date getBirth() {
        return birth;
    }

    public void setBirth(Date birth) {
        this.birth = birth;
    }

}

啦啦啦

网络编程--rpc实现原理--nio多线程--迭代版本v1

  网络编程--RPC实现原理--目录  啦啦啦V1——设置标识变量selectionKey.attach(true);只处理一次(会一直循环遍历selectionKeys,占用CPU资源)。(由于key没有清除,依旧在selectionKeys中存在,遍历时依旧会检测到对应事件,除非socke... 查看详情

rpc----rpc入门了解&最简单的rpc的实现(代码片段)

...决了什么问题?5、RPCvsHTTP远程调用方式6、常用RPC框架三、实现1、对象序列化1.1序列化的原因1.2概念1.3解决方案(RPC序列化框架)1.4代码实现2、网络通讯协议2.1基于TCP协议实现的RPC2.1.1版本一2.1.1.1原理2.1.1.2场景2.1.1.3实现代码2.1.1.4... 查看详情

rpc核心原理

...,即远程过程调用.其中远程需要跨机器,跨机器需要可靠的网络编程技术实现,无论是Java原生的网络编程模型还是Netty都会让代码中出现大量与业务无关的网络编程代码,RPC技术则是为了解决这个问题的.它帮助我们屏蔽网络编程的细... 查看详情

java学习---快速掌握rpc原理及实现

【原文】https://www.toutiao.com/i6592365493435236872/?RPC概述RPC(RemoteProcedureCall)即远程过程调用,也就是说两台服务器A,B,一个应用部署在A服务器上,想要调用B服务器上应用提供的函数/方法,由于不在一个内存空间,不能直接调用,需... 查看详情

rpc实现原理

RPC实现原理 查看详情

rpc实现原理

RPC实现原理 查看详情

rpc通信原理

...RPC主要特质:RPC是协议:协议意味着规范。目前典型的RPC实现包括Hetty等。但这些实现往往都会附加其他重要功能,例如Du理、访问权限管理等功能。网络协议和网络IO模型对其透明:既然RPC的客户端认地对象。那么传输层使用的... 查看详情

rpc的实现原理

...露要开放的服务接口,客户调用服务接口的一个代理实现,这个代理实现负责收集数据、编码并传输给服务器然后等待结果返回。 查看详情

rpc的实现原理

...露要开放的服务接口,客户调用服务接口的一个代理实现,这个代理实现负责收集数据、编码并传输给服务器然后等待结果返回。 查看详情

自己实现一个rpc框架(代码片段)

...过反射,来执行该接口的方法,再将反射执行的结果通过网络编程传回消费者端。现在我们来依次实现这些概念。这里我们做最简单的实现,网络编程使用的是BIO,大家可以使用Re 查看详情

rpc----基于zookeeper为注册中心实现的rpc(代码片段)

基于ZooKeeper为注册中心实现的RPC一、原理二、统一配置管理1、服务的注册2、服务的发现3、测试代码服务的注册测试服务的发现测试测试截图三、负载均衡1、接口2、随机、轮询代码3、客户端服务发现代码三、动态感知服务器状... 查看详情

rpc原理及实现

...,不能直接调用,这时候需要通过--就可以应用RPC框架的实现来解决。RPC会隐藏底层的通讯细节(不需要直接处理Socket通讯或Http通讯)RPC是一个请求响应模型。客户端发起请求,服务器返回响应(类似于Http的工作方式)RPC在使... 查看详情

rpc原理及rpc实例分析

1、什么是RPC由于各服务部署在不同的机器,服务间的调用免不了网络通信过程,服务消费方没调用一个服务都要写一坨网络通信相关的代码,不仅负责而且容易出错RPC(RemoteProcedureCall)远程过程调用能让我们像调用本地服务一样... 查看详情

面向服务架构之rpc原理与实例

...户端组件与职责  -RpcClient:负责导入远程接口的代理实现  -RpcProx 查看详情

rpc原理及实现

...强大的远程调用能力时不损失本地调用的语义简洁性。为实现该目标,RPC框架需提供一种透明调用机制让使用者不必显式的区分本地调用和远程调用。2调用分类RPC调用分以下两种:同步调用客户方等待调用执行完成并返回结果... 查看详情

自定义rpc的完整实现---深入理解rpc内部原理(代码片段)

倘若不使用RPC远端调用的情况下,代码如下:local.py#coding:utf-8#本地调用除法运算的形式classInvalidOperation(Exception):def__init__(self,message=None):self.message=messageor‘involidoperation‘defdivide(num1,num2=1):ifnum2==0:raiseInv 查看详情

zookeeper--基于watcher原理实现带注册中心的rpc框架(代码片段)

...terCenter publicvoidregister(StringserviceName,StringserviceAddress); //实现类packagezoorpc.zk;importorg.apache.curator.framework.CuratorFramework;importorg.apache.curator.framework.CuratorFrameworkFactory;importorg.apache.curator.retry.ExponentialBackoffRetry;importorg.apache.zookeeper.Create... 查看详情

rpc原理

...好处就是,不限定服务的提供方使用什么技术选型,能够实现大公司跨团队的技术解耦,如下图:  服务A是欧洲团队提供服务,欧洲团队的技术背景是Java,可以用Java实现服务;服务B是美洲团队提供服务,可以用C++实现服... 查看详情