利用 Socket 实现简单的 PRC 功能

最近在阿里实习,学了不少中间件的用法,感觉最重要的应该就是分布式RPC框架HSF了,好像大部分互联网公司都有在用RPC框架。然后就自己参考《架构探险—从零开始写分布式服务框架》,写了一个最简单的远程过程调用。

其中用到了Java Socket,动态代理,反射,Apache-Commons-Lang3等。

服务端

调用这个类的provider(service, port)方法,可以在本地开一个socket服务,端口号为port。socket接收客户端发送的方法名+参数数组,然后反射调用service的相应方法,并将返回值通过socket写回。

客户端

这是客户端的一个动态代理类,consume方法返回实现了interfaceClass接口的代理类。内部则是通过发起一个socket连接,将被调用的方法名和参数名发送给服务端,服务端返回执行结果Object给客户端,然后再作为函数运行结果返回。

服务端使用方法

先定义一个接口:

实现这个接口:

最后发布HelloService这个服务:

客户端使用方法

定义相同的HelloService服务接口(无实现类):

生成动态代理并进行Rpc调用:

总结

这就是最简单的远程过程调用(RPC)功能的实现。是距离一个完整的RPC框架还差很多,比如:

  • 只用了ObjectStream,效率比较低,可以考虑使用JSON或Hessian等进行序列化
  • 使用了线程池处理请求,可以考虑高效的IO,比如Netty
  • 不容易与Spring等框架进行整合,发布和调用多个服务也比较麻烦
  • 没有注册中心、没有分布式功能、没有服务治理功能、没有负载均衡功能

后续将会继续研究RPC框架的这些功能及其底层原理,感觉能学到不少东西。

附源代码下载:simple_rpc

发表评论

电子邮件地址不会被公开。