rpc架构介绍以及原理分析.doc

  1. 1、本文档共65页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
Say Hello、Say Goodbye, 一次RPC调用之旅 架构演进 RPC (Remote Procedure Call) 让构建分布式计算(应用)更容易, 在提供强大的远程调用能力时不损失本地调用的语义简洁性。 (就像调用本地方法一样调用远程服务——调用机制透明) 目录 Part 1 玩具级RP 框架实现 Part 2 企业级RP 要解决的问题 Part 3 为什么选择dubbo 一、玩具级RPC框架实现 1.1 RPC 调用流程 1.2 搭建一个RPC框架 1.2 搭建一个RPC框架——ServiceClient public class ServiceClient { public static class ServiceProxy implements InvocationHandler { public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { //1. 构造请求参数 model = new Protocol.ProtocolModel(); model.setClazz(clazz.getName()); model.setMethod(method.getName()); model.setArgs(args); for (int i = 0; i argType.length; i++) { argType[i] = method.getParameterTypes()[i].getName(); } model.setArgTypes(argType); // 2. 编码(序列化) Ptocol.encode(model); // 3. 方法调用 rsp = ClientRemoter.client.getDataRemote(req); // 4. 解码(反序列化) Ptocol.decode(rsp, method.getReturnType()); } } } 1.2 搭建一个RPC框架——Protocol public class Protocol { public byte[] encode(Object o) { return JSON.toJSONBytes(o); } public T T decode(byte[] data, ClassT clazz) { return JSON.parseObject(data, clazz); } public static class ProtocolModel { private String clazz; private String method; private String[] argTypes; private Object[] args; } } 1.2 搭建一个RPC框架——ClientRemoter public class ClientRemoter { public byte[] getDataRemote(byte[] requestData) { // 1. 建立网络连接 socket = new Socket() socket.connect(new InetSocketAddress(, 9999)); // 2. 发送请求 socket.getOutputStream().write(requestData); socket.getOutputStream().flush(); // 3. 获取响应 byte[] data = new byte[10240]; int len = socket.getInputStream().read(data); return Arrays.copyOfRange(data, 0, len); } } 1.2 搭建一个RPC框架——ServerRemoter public class ServerRemoter { private static final ExecutorService executor = Executors.newFixedThreadPool(…); public void startServer(int port) throws Exception { // 1. 启动并接收socket请求 socket = server.accept(); executor.execute(new MyRunnable(socket)); } class MyRunnable implements Runnable { public void run() { // 2. 获取输入、输出流,用于读取请求,写入返回值 is = socket.g

文档评论(0)

137****0427 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档