RPC架构
RPC 的全称是 Remote Procedure Call,它是一种进程间通信方式。允许像调用本地服务一样调用远程服务。
1.RPC 框架原理
RPC 框架的目标就是让远程过程(服务)调用更加简单、透明,RPC框架负责屏蔽底层的传输方式(TCP 或者 UDP)、序列化方式(XML、JSON、二进制)和通信细节。
框架使用者只需要了解谁在什么位置,提供了什么样的远程服务接口即可,开发者不需要关心底层通信细节和调用过程。
2.最简单的 RPC 框架实现
· 下面通过 JAVA 原生的序列化、TCP Socket通信、动态代理和反射机制,实现最简单的 RPC 框架。它由三部分组成:
- 服务提供者:它运行在服务端,负责提供服务接口定义和服务实现类。(EchoService 和 EchoServiceImpl)
- 服务发布者,它运行在 RPC 服务端,负责将本地服务发布成远程服务,供其他消费者调用。(RPCExporter)
- 本地服务代理,它运行在 RPC 客户端,通过代理调用远程服务提供者,然后将结果进行封装返回给本地消费者。(RPCImporter)
下面看具体代码,首先是服务端接口定义和服务实现类。
代码清单 :EchoService
package com.rpc.test; /** * @Description - 调用接口 * @Author zww * @Date 2018/12/10 17:29 */public interface EchoService { String echo(String ping); }
代码清单:EchoServiceImpl
package com.rpc.test; /** * @Description - 调用接口实现 * @Author zww * @Date 2018/12/10 17:30 */public class EchoServiceImpl implements EchoService { @Override public String echo(String ping) { return ping != null ? ping + "挺不错的。" : "挺不错的。"; } }
RPC 服务端发布者代码实现如下:
代码清单:RPCExporter
package com.rpc.test; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.lang.reflect.Method; import java.net.InetSocketAddress; import java.net.ServerSocket; import java.net.Socket; import java.util.concurrent.Executor; import java.util.concurrent.Executors; /** * @Description - 服务端发布者(提供服务) * @Author zww * @Date 2018/12/10 17:33 */public class RPCExporter { //线程池 static Executor executor = Executors.newFixedThreadPool(Runtime.getRuntime().avail

