前言

在实际后台服务开发中,比如订单服务(开发者A负责)需要调用商品服务(开发者B负责),那么开发者B会和A约定调用API,以接口的形式提供给A。通常都是B把API上传到Maven私服,然后B开始写API的实现,A只需要引入API依赖进行开发即可。

订单服务调用商品服务

上图简单的描述了RPC在实际场景中的应用,我们在开发中当然是利用现有的RPC框架来快速实现业务需求,比如百度开源了baidu-rpc,阿里的Dubbo早已声名在外,腾讯自己玩TAF。一文告诉你 RMI 和 RPC 的区别!本篇博客将实现一个迷你版的RPC,探索下RPC底层实现的奥秘!在Java技术栈微信公众号后台回复关键字:分布式,可以获取更多栈长整理的 Java 系列技术干货。

动手实现RPC

商品服务工程

商品服务工程

注意,我将商品服务的API以及实现分为Maven的2个模块来开发。这里,我们想给定一个商品ID,查询得到商品对象信息。

商品对象

商品API

Product

要注意的是,Product是可以被序列化的,Why?

很显然,订单系统调用商品系统的时候,需要商品系统返回一个商品,必然涉及到发生网络传输,这就涉及对象的序列化和反序列化了。

商品查询API接口

商品查询API

订单系统调用商品服务

订单服务调用商品服务

在订单系统工程中需要引入商品服务API依赖。

在上图代码中,最重要的就是rpc方法了!

rpc实现方法

rpc

第一,我们看到了Proxy.newProxyInstance

很显然在进行动态代理。也即是说,在订单服务调用商品服务的代码中,我们先是通过动态代理返回一个代理的IProductService类型对象,这意味着当代理对象调用queryById方法的时候,会自动调用invoke方法!

第二,我们看看invoke到底做了些什么?

它本质上就是进行Socket通信,那么它需要传递什么信息给到商品服务呢?

我们知道订单系统就是想调用商品服务的某个类的某个方法,然后把这个方法的返回结果传输给订单系统!

想一想,如何调用某个类的某个方法呢?

只要我们能确定这个类的全限定类名、确定方法名、确定方法的参数类型,给定方法需要的具体参数,通过反射就能实现。

商品服务调用后得到的结果,我们序列化写入Socket流中,在订单系统中反序列化得到对象即可。

第三,这里需要思考一个问题

在订单系统中我们只知道商品服务的API,并不知道这背后的API到底是如何实现的,所以我们需要有一个映射,就是商品服务的API到商品服务的实现的一个映射关系,其实这就是所谓的服务的注册!

商品服务

商品服务API实现

商品服务

商品服务

从这里,可以清晰的看到,商品服务读取了订单系统调用商品系统时发送的数据,利用反射机制,进行方法调用,并把调用结果写入Socket输出流。

运行结果

启动商品服务后,通过订单系统发起对商品服务的调用。

欢迎工作一到五年的Java工程师朋友们加入Java填坑之路:860113481

群内提供免费的Java架构学习资料(里面有高可用、高并发、高性能及分布式、Jvm性能调优、Spring源码,MyBatis,Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx等多个知识点的架构资料)合理利用自己每一分每一秒的时间来学习提升自己,不要再用"没有时间“来掩饰自己思想上的懒惰!趁年轻,使劲拼,给未来的自己一个交代!

转载于:https://blog.51cto.com/13732225/2345483

向高手进阶,从 0 开始手写实现一个 RPC 框架!相关推荐

  1. 【编程实践】为了带你搞懂RPC,我们手写了一个RPC框架

    如今分布式系统大行其道的年代,RPC 有着举足轻重的地位.风靡的 Duboo.Thrift.gRpc 等框架各领风骚,深入了解RPC是新手也是老鸟的必修课.你知道 RPC 的实现原理吗?想动手实现一个 ...

  2. 从 0 开始手写一个 Spring MVC 框架,向高手进阶

    转载自   从 0 开始手写一个 Spring MVC 框架,向高手进阶 Spring框架对于Java后端程序员来说再熟悉不过了,以前只知道它用的反射实现的,但了解之后才知道有很多巧妙的设计在里面.如 ...

  3. JavaScript进阶必会的手写功能(二)

    JavaScript进阶必会的手写功能(一) 6. 手写浅拷贝 6.1 JavaScript数据类型分类 1. 简单数据类型: Number. String.Boolean.null.undefine ...

  4. Vue2.0 + ElementUI 手写权限管理系统后台模板(一)——简述

    简介 这个权限管理就是为了方便,跟系统安全真的不沾边,只是根据后台返回的角色信息来生成他可以看见的菜单和按钮,显示菜单的方法是根据权限删除掉路由表里没有权限的路由,然后再动态添加,原本包含没有访问权限 ...

  5. Vue2.0 + ElementUI 手写权限管理系统后台模板(三)——页面搭建

    框架布局 本章只介绍基础布局,和一些主要的js,页面上基本上都是些交互事件,项目代码上都有注释,不懂的地方debug跑一变就知道了,只是这些事件基本上没有独立存在的,相互之间都有关联 框架风格 新建页 ...

  6. 手写一个RPC框架,理解更透彻(附源码)

    作者:烟味i www.cnblogs.com/2YSP/p/13545217.html 一.前言 前段时间看到一篇不错的文章<看了这篇你就会手写RPC框架了>,于是便来了兴趣对着实现了一遍 ...

  7. 【RPC框架、RPC框架必会的基本知识、手写一个RPC框架案例、优秀的RPC框架Dubbo、Dubbo和SpringCloud框架比较】

    一.RPC框架必会的基本知识 1.1 什么是RPC? RPC(Remote Procedure Call --远程过程调用),它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络的技术. ...

  8. 手写并发任务执行框架

    手写并发任务执行框架 目标: 实现: 思路: 一.框架开发 1.添加依赖 2.任务处理器接口 3.超时机制包装类 4.任务信息类 5.任务结果类型 6.任务结果类 7.框架主体处理类 8.过期任务清理 ...

  9. 手写实现一个HashMap

    手写实现一个HashMap 前言 HashMap是Java中常用的集合,而且HashMap的一些思想,对于我们平时解决业务上的一些问题,在思路上有帮助,基于此,本篇博客将分析HashMap底层设计思想 ...

最新文章

  1. 禁止validateRequest的办法
  2. iis6中FTP配置的技巧和细节
  3. android筛选cookie,服务器无法从Android手机识别Cookie
  4. 你的计算机无法启动一键还原,教你电脑怎么一键还原
  5. linux哪些分区用固态硬盘,关于linux:简单聊聊固态硬盘的物理结构
  6. Json工具类 - JsonUtils.java
  7. 12.当效率至关重要时,请在map::operator[]与map::insert之间谨慎作出选择
  8. js算法初窥06(算法模式03-函数式编程)
  9. matlab sdk7.1,免费试用MATLAB Compiler SDK
  10. java 并发框架源码_某网Java并发编程高阶技术-高性能并发框架源码解析与实战(云盘下载)...
  11. sql server 中xml 数据类型的insert、update、delete
  12. 周鸿祎为何忘不掉搜索?
  13. 如何规范化数据库模型设计
  14. 【数据结构C++】哈希表(三)
  15. 组织能力:企业成败的关键(组织能力杨三角系列一)
  16. TIBCO Rendezvous 概念
  17. Abel逆变换的MATLAB实现(未完成版)
  18. c语言单片机程序段,51单片机C语言编程基础及实例
  19. ehcache 缓存丢失_解决Ehcache缓存警告问题
  20. 微信小程序时间加法_微信小程序日期转换、比较、加减

热门文章

  1. 对象转数组_fastJson中java对象 jsonObject jsonArray之间转换
  2. 商用计算机的使用环境,工业一体机电脑和普通的商用电脑区别
  3. [pyinstaller]PermissionError: [Errno 13] Permission denied:C:\Users\xxx\AppData\Local\ucrtbase.dll
  4. 初识、理解生成器模式
  5. 小学生们在B站讲算法,网友:我只会阿巴阿巴
  6. 用GAN也可以P图,效果还不输PS | 英伟达出品
  7. 国产岚图入局高端智能电动车,对标特斯拉,放话一年内量产
  8. 2位华人获得加州理工学院计算机、数学博士奖学金,3年近一半由华人获得
  9. 今年芯片行业最大收购案:亚德诺209亿美元收购美信,对抗行业老大德州仪器...
  10. vue实现移动端圆形旋钮插件