Java简易RPC框架学习(一)

1、前言

更多请前往个人博客

随着web技术越发成熟,技术体系越发地完善。在小公司经常会看见一个项目就是全部,但是大公司的系统就不一样了,由于业务种类的繁多,业务量的巨大,大公司的项目通常会将一些常用到的功能组件化、服务化,就需要一个框架来管理。于是微服务架构的概念就出来了。微服务框架需要解决很多问题,例如服务注册、服务路由、服务调用等等。本系列专注于研究服务调用方面,通过拜读阿里开源框架dubbo,研究其服务调用的实现。服务调用有很多种方式,可以使用Http API,也可以使用远程调用。dubbo使用的是远程调用方式,于是本系列自然就从RPC入手。如下图所示为dubbo的框架图,可以看到rpc在其中扮演了一个举足轻重的角色。

2、大体框架

若要实现简单的PRC实例,用不了多少代码,《简单RPC实现》使用netty实现了一个简单的远程调用。但是一个复杂的系统需要考虑方方面面,例如消息的传输、通信的维持、会话的管理、消息的表示等等,所以大型的系统都是分层次的。通过大致的阅读源码,我可以类比通信OSI参考模型将dubbo的远程调用体系分为了如下4个层次:应用层、表示层、会话层、传输层。其结构如下:

 

3、层次介绍

上述4层中主要介绍传输层和会话层。

3.1 传输层

以消息传输为核心,通过网络来传递数据,dubbo在设计次层的时候使用了门面模式(装饰器模式),transporters是门面类,transporter的逻辑封装在里面,通过此FACADE调用transporter逻辑。通过调用transporter.bind()来绑定服务器,通过调用transporters.connect()来连接服务器并获取客户端。然后具体的消息传输通过服务器和客户端类来实现。这里客户端和服务器类封装了netty或者mina的库,能够方便的实现同步以及异步消息传输,应对高并发能力也很高。

3.2 会话层

此层类似于web应用中的session,以request、response为核心,封装请求响应模式,同步转异步,并监控连接状态。同时此层也应用了门面模式,exchangers是门面类。

3.2 代理层

Proxy层封装了所有接口的透明化代理,通过invoker来暴露服务。待续...

3.3 protocol层

待续...

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现RPC框架的关键在于实现远程过程调用的功能。具体来说,需要完成以下步骤: 1. 定义RPC接口 2. 实现RPC框架 3. 编写客户端和服务端的代码 以下是一个简单的Java实现RPC框架的代码示例: 1. 定义RPC接口 ```java public interface HelloService { String sayHello(String name); } ``` 2. 实现RPC框架 ```java public class RPCFramework { // 暴露服务 public static void export(Object service, int port) throws Exception { ServerSocket server = new ServerSocket(port); while (true) { Socket socket = server.accept(); new Thread(() -> { try { ObjectOutputStream output = new ObjectOutputStream(socket.getOutputStream()); ObjectInputStream input = new ObjectInputStream(socket.getInputStream()); String methodName = input.readUTF(); Class<?>[] parameterTypes = (Class<?>[]) input.readObject(); Object[] args = (Object[]) input.readObject(); Method method = service.getClass().getMethod(methodName, parameterTypes); Object result = method.invoke(service, args); output.writeObject(result); } catch (Exception e) { e.printStackTrace(); } finally { try { socket.close(); } catch (IOException e) { e.printStackTrace(); } } }).start(); } } // 引用服务 public static <T> T refer(Class<T> interfaceClass, String host, int port) throws Exception { Socket socket = new Socket(host, port); ObjectOutputStream output = new ObjectOutputStream(socket.getOutputStream()); ObjectInputStream input = new ObjectInputStream(socket.getInputStream()); output.writeUTF(interfaceClass.getName()); output.writeUTF("sayHello"); output.writeObject(new Class<?>[]{String.class}); output.writeObject(new Object[]{"world"}); Object result = input.readObject(); return (T) result; } } ``` 3. 编写客户端和服务端的代码 服务端: ```java public class HelloServiceImpl implements HelloService { @Override public String sayHello(String name) { return "Hello, " + name + "!"; } } public class Server { public static void main(String[] args) throws Exception { HelloService helloService = new HelloServiceImpl(); RPCFramework.export(helloService, 1234); } } ``` 客户端: ```java public class Client { public static void main(String[] args) throws Exception { HelloService helloService = RPCFramework.refer(HelloService.class, "localhost", 1234); System.out.println(helloService.sayHello("world")); } } ``` 这样,客户端向服务端发起远程调用后就会得到服务端返回的结果。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值