【dubbo系列】rpc、dubbo基础知识(三)

开课吧开课吧锤锤2021-03-08 11:41

    Java编程语言是一种简单、面向对象、分布式、解释型、健壮安全、与系统无关、可移植、高性能、多线程和动态的语言。如今Java已经广泛应用于各个领域的编程开发。

Java

    简单实现一个RPC框架

    没错就是简单的实现,上面我们在思考如何设计一个RPC框架的时候想了很多,那算是生产环境使用级别的功能需求了,我们这是Demo,目的是突出RPC框架重点功能-实现远程调用。

    所以啥七七八八的都没,并且我用伪代码来展示,其实也就是删除了一些保护性和约束性的代码,因为看起来太多了不太直观,需要一堆try-catch啥的,因此我删减了一些,直击重点。

    Let'sDoIt!

    首先我们定义一个接口和一个简单实现。

    publicinterfaceAobingService{

    Stringhello(Stringname);

    }

    publicclassAobingServiceImplimplementsAobingService{

    publicStringhello(Stringname){

    return"YomanHello,Iam"+name;

    }

    }

    然后我们再来实现服务提供者暴露服务的功能。

    publicclassAobingRpcFramework{

    publicstaticvoidexport(Objectservice,intport)throwsException{

    ServerSocketserver=newServerSocket(port);

    while(true){

    Socketsocket=server.accept();

    newThread(newRunnable(){

    //反序列化

    ObjectInputStreaminput=newObjectInputStream(socket.getInputStream());

    StringmethodName=input.read();//读取方法名

    Class<?>[]parameterTypes=(Class<?>[])input.readObject();//参数类型

    Object[]arguments=(Object[])input.readObject();//参数

    Methodmethod=service.getClass().getMethod(methodName,parameterTypes);//找到方法

    Objectresult=method.invoke(service,arguments);//调用方法

    //返回结果

    ObjectOutputStreamoutput=newObjectOutputStream(socket.getOutputStream());

    output.writeObject(result);

    }).start();

    }

    }

    publicstatic<T>Trefer(Class<T>interfaceClass,Stringhost,intport)throwsException{

    return(T)Proxy.newProxyInstance(interfaceClass.getClassLoader(),newClass<?>[]{interfaceClass},

    newInvocationHandler(){

    publicObjectinvoke(Objectproxy,Methodmethod,Object[]arguments)throwsThrowable{

    Socketsocket=newSocket(host,port);//指定provider的ip和端口

    ObjectOutputStreamoutput=newObjectOutputStream(socket.getOutputStream());

    output.write(method.getName());//传方法名

    output.writeObject(method.getParameterTypes());//传参数类型

    output.writeObject(arguments);//传参数值

    ObjectInputStreaminput=newObjectInputStream(socket.getInputStream());

    Objectresult=input.readObject();//读取结果

    returnresult;

    }

    });

    }

    }

    好了,这个RPC框架就这样好了,是不是很简单?就是调用者传递了方法名、参数类型和参数值,提供者接收到这样参数之后调用对于的方法返回结果就好了!这就是远程过程调用。

    我们来看看如何使用

    //服务提供者只需要暴露出接口

    AobingServiceservice=newAobingServiceImpl();

    AobingRpcFramework.export(service,2333);

    //服务调用者只需要设置依赖

    AobingServiceservice=AobingRpcFramework.refer(AobingService.class,"127.0.0.1",2333);

    service.hello();

    看起来好像好不错哟,不过这很是简陋,用作demo有助理解还是极好的!

    接下来就来看看Dubbo吧!上正菜!

    以上内容由开课吧老师敖丙提供,更多Java教程尽在开课吧广场Java教程频道。

有用
分享