RPC 框架

在分布式服务框架中,一个最基础的问题就是远程服务是怎么通讯的,在 Java 领域中有很多可以实现远程通讯的技术,例如:RMI、Hessian、SOAP、ESB 和 JMS 等。其基本原理是基于传输协议和网络 IO 来实现,其中传输协议比较出名的有 TCP、UDP 等,TCP、UDP 都是基于 Socket 概念上为某类应用场景而扩展出来的传输协议。

RPC 概念

全称 remote procedure call,即远程过程调用。借助 RPC 可以做到像本地调用一样调用远程服务。RPC 并不是一个具体的技术,而是只整个网络远程调用过程

sequenceDiagram
方法 A - 方法 B: 本地调用
方法 B -- 方法 A: 结果返回
#mermaid-svg-gM61r75PLSoRBCH8 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-gM61r75PLSoRBCH8 .error-icon{fill:#552222;}#mermaid-svg-gM61r75PLSoRBCH8 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-gM61r75PLSoRBCH8 .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-gM61r75PLSoRBCH8 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-gM61r75PLSoRBCH8 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-gM61r75PLSoRBCH8 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-gM61r75PLSoRBCH8 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-gM61r75PLSoRBCH8 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-gM61r75PLSoRBCH8 .marker.cross{stroke:#333333;}#mermaid-svg-gM61r75PLSoRBCH8 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-gM61r75PLSoRBCH8 .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-gM61r75PLSoRBCH8 text.actor>tspan{fill:black;stroke:none;}#mermaid-svg-gM61r75PLSoRBCH8 .actor-line{stroke:grey;}#mermaid-svg-gM61r75PLSoRBCH8 .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-gM61r75PLSoRBCH8 .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-gM61r75PLSoRBCH8 #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-gM61r75PLSoRBCH8 .sequenceNumber{fill:white;}#mermaid-svg-gM61r75PLSoRBCH8 #sequencenumber{fill:#333;}#mermaid-svg-gM61r75PLSoRBCH8 #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-gM61r75PLSoRBCH8 .messageText{fill:#333;stroke:#333;}#mermaid-svg-gM61r75PLSoRBCH8 .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-gM61r75PLSoRBCH8 .labelText,#mermaid-svg-gM61r75PLSoRBCH8 .labelText>tspan{fill:black;stroke:none;}#mermaid-svg-gM61r75PLSoRBCH8 .loopText,#mermaid-svg-gM61r75PLSoRBCH8 .loopText>tspan{fill:black;stroke:none;}#mermaid-svg-gM61r75PLSoRBCH8 .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-gM61r75PLSoRBCH8 .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-gM61r75PLSoRBCH8 .noteText,#mermaid-svg-gM61r75PLSoRBCH8 .noteText>tspan{fill:black;stroke:none;}#mermaid-svg-gM61r75PLSoRBCH8 .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-gM61r75PLSoRBCH8 .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-gM61r75PLSoRBCH8 .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-gM61r75PLSoRBCH8 .actorPopupMenu{position:absolute;}#mermaid-svg-gM61r75PLSoRBCH8 .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#mermaid-svg-gM61r75PLSoRBCH8 .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-gM61r75PLSoRBCH8 .actor-man circle,#mermaid-svg-gM61r75PLSoRBCH8 line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-gM61r75PLSoRBCH8 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}服务 1服务 2远程调用返回结果服务 1服务 2

一个完整的 RPC 框架里边包含了四个核心的组件,分别是 Client,Client Stub,Server 以及 Server Stub,这个 Stub 可以理解为存根。

  • 客户端(Client),服务的调用方。
  • 客户端存根(Client Stub),存放服务端的地址消息,再将客户端的请求参数打包成网络消息,然后通过网络远程发送给服务方。
  • 服务端(Server),真正的服务提供者。
  • 服务端存根(Server Stub),接收客户端发送过来的消息,将消息解包,并调用本地的方法。

RMI

Java RMI,即远程方法调用 (Remote Method Invocation),一种用于实现远程调用(RPC-Remote procedure call)的 Java API,能直接传输序列化后的 Java 对象。RMI 的实现依赖于 Java 虚拟机,因此只能支持一个 JVM 到另一个 JVM 的调用。

代码示例使用

需求分析
  1. 服务端提供 ID 查询用户的方法
  2. 客户端调用服务端方法,并返回用户对象
  3. 要求使用 RMI 进行远程通讯
代码实现

服务端

/*** 服务端*/
public class RMIServer {public static void main(String[] args) {try {//1.注册Registry实例. 绑定端口Registry registry = LocateRegistry.createRegistry(9998);//2.创建远程对象IUserService userService = new UserServiceImpl();//3.将远程对象注册到RMI服务器上即(服务端注册表上)registry.rebind("userService", userService);System.out.println("---RMI服务端启动成功----");} catch (RemoteException e) {e.printStackTrace();}}
}

客户端

/*** 客户端*/
public class RMIClient {public static void main(String[] args) throws RemoteException, NotBoundException {//1.获取Registry实例Registry registry = LocateRegistry.getRegistry("127.0.0.1", 9998);//2.通过Registry实例查找远程对象IUserService userService = (IUserService) registry.lookup("userService");User user = userService.getByUserId(2);System.out.println(user.getId() + "----" + user.getName());}
}

接口及其实现类

public interface IUserService extends Remote {User getByUserId(int id) throws RemoteException;
}public class UserServiceImpl extends UnicastRemoteObject implements IUserService {Map<Object, User> userMap = new HashMap();public UserServiceImpl() throws RemoteException {super();User user1 = new User();user1.setId(1);user1.setName("张三");User user2 = new User();user2.setId(2);user2.setName("李四");userMap.put(user1.getId(), user1);userMap.put(user2.getId(), user2);}@Overridepublic User getByUserId(int id) throws RemoteException {return userMap.get(id);}
}

Netty 实现 RPC

需求分析

使用 Netty 实现一个简单的 RPC 框架,消费者和提供者约定接口和协议,消费者远程调用提供者的服务。

  • 创建一个接口,定义抽象方法。用于消费者和提供者之间的约定;
  • 创建一个提供者,该类需要监听消费者的请求,并按照约定返回数据;
  • 创建一个消费者,该类需要透明的调用自己不存在的方法,内部需要使用 Netty 进行数据通信
  • 提供者与消费者数据传输使用 json 字符串数据格式
  • 提供者使用 Netty 集成 Spring Boot 环境实现

代码实现

代码库:https://gitee.com/teaegg/netty-rpc.git

简单介绍 RPC 框架相关推荐

  1. 最简单的RPC框架实现

    RPC架构 RPC的全称是 Remote Procedure Call,它是一种进程间通信方式.允许像调用本地服务一样调用远程服务,它的具体实现方式可以不同,例如Spring 的 HTTP Invok ...

  2. Java实现简单的RPC框架

    一.RPC简介 RPC,全称为Remote Procedure Call,即远程过程调用,它是一个计算机通信协议.它允许像调用本地服务一样调用远程服务.它可以有不同的实现方式.如RMI(远程方法调用) ...

  3. IOS学习之 网络编程(10)--简单介绍ASI框架的使用

    转载自 http://www.cnblogs.com/wendingding/p/3950027.html 说明:本文主要介绍网络编程中常用框架ASI的简单使用. 一.ASI简单介绍 ASI:全称是A ...

  4. 小司机带你撸一个简单的RPC框架

    随着业务的增长,有时候普通的单一型架构不再能满足我们的需求,这就诞生了RPC框架,经过多年的发展,我们可以看到市面上可用性高的开源RPC框架还是比较多的,比如说:Hessian,Dubbo等,这些框架 ...

  5. jsonrpc php使用,php实现的一个简单json rpc框架实例

    json rpc 是一种以json为消息格式的远程调用服务,它是一套允许运行在不同操作系统.不同环境的程序实现基于Internet过程调用的规范和一系列的实现.这种远程过程调用可以使用http作为传输 ...

  6. 简单说说 RPC 框架,你 悟到了吗?

    愿打开此篇对你有所帮助. 网上讲的不明不白的居多,我来试试,争取让做过后端开发项目的学生能看明白,基础再往下我就没办法了. 如果有大佬,可以帮我看看我理解的是不是有错. 最基本的 CS 框架先说一下是 ...

  7. 前端可视化组件库-Apache ECharts简单介绍vue框架使用eCharts例子

    eCharts是一个基于 JavaScript 的开源可视化图表库. 实现集成了前端可视化的多种手段. 官网链接:ECharts官网 初学者建议去官网看看起步的内容,另外博主也是今天刚学的噢,写得不好 ...

  8. 如何手写一个简单的RPC框架

    http://www.czhenblog.cn/article?articleId=29

  9. 使用Akka实现简单RPC框架

    使用Akka实现简单RPC框架 最近简单看了看Flink的RPC通讯相关的源码,它是通过Akka实现的,为了更好的阅读理解代码,又大体看了看Akka相关的知识.这篇文章主要记录了如果使用Akka来实现 ...

最新文章

  1. 如何与风险投资商打交道
  2. Java并发编程实战_一线大厂架构师整理:java并发编程实践教程
  3. 使用parted命令对硬盘进行操作
  4. 我是一只IT小小鸟读书笔记
  5. win7系统怎样打开音频服务器,win7系统打开音频管理器的具体教程
  6. Android启动后icon应用图标不能显示的可能问题
  7. 视频监控系统中的平台服务器,【视频监控主机 网络视频集中管理平台服务器】 - 太平洋安防网...
  8. HashMap 和 Hashtable 的同和不同
  9. 一些前端常用工具的生命周期
  10. 以中划线开头正则表达式_正则表达式 汉字、数字、字母、横杠
  11. Matlab rand randn randint
  12. LCA Tarjan
  13. Unity运行失败,Unsafe code may only appear if compiling with /unsafe
  14. R语言实战之基本统计分析
  15. 10 本 Linux PDF 书籍免费分享
  16. 跳跃游戏2(求最少跳跃次数)Python解法
  17. 串口的使用–蓝牙模块
  18. 安装bugzilla
  19. 金融业务知识(2):股票交易的基本流程
  20. 关于电商秒杀系统中防超卖处理方案简述,统统给你解决!

热门文章

  1. Unity实战问题-双击脚本打不开的原因和解决方法
  2. 关于平方根运算的算法
  3. English Learning - L3 Lesson2 VOA-Color 译文
  4. 齐晖医药冲刺上交所:拟募资7亿 为刘祥宜与朱建民夫妻店
  5. js运算符及其优先级
  6. HTTP篇-----HTTP的基础知识
  7. libsvm matlab 3.18下载,libsvm-3.17 最新的从官方网站下载的 工具箱 matlab 238万源代码下载- www.pudn.com...
  8. RegularExpressionValidator控件
  9. CLSID与ProgID转换
  10. 应用竞赛树结构模拟实现外排序(C++实现)