当前位置: 首页 > news >正文

【最全最详细】RPC与HTTP的区别

目录

为什么需要远程调用?

到底什么是远程过程调用?

实现RPC需要用到的技术

开源RPC框架


RPC 是 Remote Procedure Call 的缩写,译为远程过程调用。要想实现 RPC 通常需要包含传输协议和序列化协议的实现。

而我们熟知的 HTTP,他的中文名叫超文本传输协议,所以他就是一种传输协议。所以,我们可以认为 RPC 和 HTTP 并不是同一个维度的两个概念。只不过他们都是可以作为远程调用的,所以经常拿来对比。

RPC 的具体实现上,可以像 HTTP 一样,基于 TCP 协议来实现,也可以直接基于 HTTP 协议实现。

RPC 主要用于公司内部服务之间的互相调用,所以他性能消耗低,传输效率高,服务治理方便。

而 HTTP 主要用于对外的异构环境,浏览器调用,APP 接口调用,第三方接口调用等等。

为什么需要远程调用?

如今的大型网站都是分布式部署的。拿一个下单流程来说,可能涉及到物流、支付、库存、红包等多个系统后,而多个系统又是分别部署在不同的机器上的,分别由不同的团队负责。而要想实现下单流程,就需要用到远程调用。

下单 {

        库存->减少库存

        支付->扣款

        红包->红包抵用

        物流->生成物流信息

}

到底什么是远程过程调用?

RPC 是指计算机 A 上的进程,调用另外一台计算机 B 上的进程,其中 A 上的调用进程被挂起,而 B 上的被调用进程开始执行。当值返回给 A 时,A 进程继续执行。调用方可以通过使用参数将信息传送给被调用方,而后可以通过传回的结果得到信息。而这一过程,对于开发人员来说是透明的。

就像后厨的例子一样,服务员把菜单传给后厨,厨师告诉备菜师和洗菜师开始工作,然后他等待他们完成工作。备菜师和洗菜师工作完之后,厨师开始炒菜。这个过程对于服务员来说其实是透明的,他不需要关心到底后厨是怎么做菜的。

由于各服务部署在不同机器上,要想在服务间进行远程调用免不了网络通信过程,服务消费方每调用一个服务都要写一坨网络通信相关的代码,不仅复杂而且极易出错。

如果有一种方式能让我们像调用本地服务一样调用远程服务,而让调用者对网络通信这些细节透明,那么将大大提高生产力,比如服务消费方在执行 orderService.buy("HHKB键盘") 时,实质上调用的是远端的服务。这种方式其实就是RPC。而提供了这种功能的工具我们称之为RPC框架。

在RPC框架中主要有三个角色:Provider、Consumer和Registry。如下图所示:

Server:暴露服务的服务提供方。

Client:调用远程服务的服务消费方。

Registry:服务注册与发现的注册中心。

服务提供方和服务消费方都比较好理解,就是后厨的洗菜师和厨师啦。厨师就是服务消费方,洗菜师就是服务提供方。厨师依赖洗菜师提供的服务。

服务注册中心又是个什么东西呢?

其实这个也比较好理解。对于那种很大的饭店来说,厨师可能有很多(集群部署),洗菜师也有很多(集群部署)。而厨师想要洗菜师帮忙洗菜的时候,他不会直接找某个洗菜师,而是通知一个中间人,这个人可能是洗菜师团队的领导,也可能就是一个专门协调后厨的人员。他知道整个厨房有多少洗菜师,也知道哪个洗菜师今天来上班了(需要先进行服务注册)。而且,他还可以根据各个洗菜师的忙碌情况动态分配任务(负载均衡)。

这个中间人就是服务注册中心。

服务提供者启动后主动向注册中心注册机器IP、端口以及提供的服务列表;服务消费者启动时向注册中心获取服务提供方地址列表,可实现软负载均衡和Failover。

实现RPC需要用到的技术

一个成熟的RPC框架需要考虑的问题有很多,这里只介绍实现一个远程调用需要用到的基本技术,感兴趣的朋友可以找一些开源的RPC框架代码来看下。

动态代理

生成client stub和server stub需要用到Java动态代理技术,我们可以使用JDK原生的动态代理机制,可以使用一些开源字节码工具框架,如:CgLib、Javassist等。

序列化

为了能在网络上传输和接收Java对象,我们需要对它进行序列化和反序列化操作。

可以使用Java原生的序列化机制,但是效率非常低,推荐使用一些开源的、成熟的序列化技术,例如:protobuf、Thrift、hessian、Kryo、Msgpack。

NIO

当前很多RPC框架都直接基于netty这一IO通信框架,比如阿里巴巴的HSF、dubbo,Hadoop Avro,推荐使用Netty作为底层通信框架。

服务注册中心

可选技术:Redis、Zookeeper、Consul、Etcd

开源RPC框架

Dubbo

Dubbo 是阿里巴巴公司开源的一个 Java 高性能优秀的服务框架,使得应用可通过高性能的 RPC 实现服务的输出和输入功能,可以和 Spring 框架无缝集成。目前已经进入 Apache 孵化器。

Motan

Motan 是新浪微博开源的一个 Java RPC 框架。2016 年 5 月开源。Motan 在微博平台中已经广泛应用,每天为数百个服务完成近千亿次的调用。

gRPC

gRPC 是 Google 开发的高性能、通用的开源 RPC 框架,其由 Google 主要面向移动应用开发并基于 HTTP/2 协议标准而设计,基于 ProtoBuf (Protocol Buffers) 序列化协议开发,且支持众多开发语言。本身它不是分布式的,所以要实现上面的框架的功能需要进一步的开发。

thrift

thrift 是 Apache 的一个跨语言的高性能的服务框架,也得到了广泛的应用。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • kali——nmap的使用
  • Centos7的x86上构建arm镜像docker
  • 【HuggingFace Transformers】Bert Model的应用
  • Qt/C++地址转坐标/坐标转地址/逆地址解析/支持百度高德腾讯和天地图
  • 时间格式--cotroller传递时间参数
  • RESP图形化界面远程连接虚拟机Redis教程
  • RepoAgent:基于大型语言模型的开源框架,主动生成、维护和更新代码文档
  • Amazon Bedrock 实践:零基础创建贪吃蛇游戏
  • [Algorithm][综合训练][体育课测验(二)][合唱队形][宵暗的妖怪]详细讲解
  • 嵌入式:Arm v7-M指令集架构中的字节序(大小端)
  • Java 入门指南:Java 并发编程 —— Synchronized 实现悲观锁(Pessimistic Locking)
  • 【Spring Boot 3】【Web】全局异常处理
  • 安卓开发环境搭建1
  • 在使用React Hooks中,如何避免状态更新时的性能问题?
  • 3.Redis高级特性和应用(慢查询、Pipeline、事务、Lua、限流原理)
  • [iOS]Core Data浅析一 -- 启用Core Data
  • 【挥舞JS】JS实现继承,封装一个extends方法
  • Computed property XXX was assigned to but it has no setter
  • github指令
  • in typeof instanceof ===这些运算符有什么作用
  • Js基础知识(一) - 变量
  • oldjun 检测网站的经验
  • opencv python Meanshift 和 Camshift
  • PAT A1120
  • Python中eval与exec的使用及区别
  • unity如何实现一个固定宽度的orthagraphic相机
  • 程序员最讨厌的9句话,你可有补充?
  • 仿天猫超市收藏抛物线动画工具库
  • 复习Javascript专题(四):js中的深浅拷贝
  • 简单数学运算程序(不定期更新)
  • 深度学习中的信息论知识详解
  • 时间复杂度与空间复杂度分析
  • 算法---两个栈实现一个队列
  • 用jQuery怎么做到前后端分离
  • 运行时添加log4j2的appender
  • 智能合约Solidity教程-事件和日志(一)
  • ​sqlite3 --- SQLite 数据库 DB-API 2.0 接口模块​
  • ​探讨元宇宙和VR虚拟现实之间的区别​
  • # Panda3d 碰撞检测系统介绍
  • # 手柄编程_北通阿修罗3动手评:一款兼具功能、操控性的电竞手柄
  • ###C语言程序设计-----C语言学习(3)#
  • #100天计划# 2013年9月29日
  • #Lua:Lua调用C++生成的DLL库
  • $jQuery 重写Alert样式方法
  • (C语言)输入一个序列,判断是否为奇偶交叉数
  • (ZT)出版业改革:该死的死,该生的生
  • (代码示例)使用setTimeout来延迟加载JS脚本文件
  • (动手学习深度学习)第13章 计算机视觉---图像增广与微调
  • (附表设计)不是我吹!超级全面的权限系统设计方案面世了
  • (附源码)计算机毕业设计SSM保险客户管理系统
  • (考研湖科大教书匠计算机网络)第一章概述-第五节1:计算机网络体系结构之分层思想和举例
  • (论文阅读笔记)Network planning with deep reinforcement learning
  • (深入.Net平台的软件系统分层开发).第一章.上机练习.20170424
  • (一)utf8mb4_general_ci 和 utf8mb4_unicode_ci 适用排序和比较规则场景
  • (原創) 如何優化ThinkPad X61開機速度? (NB) (ThinkPad) (X61) (OS) (Windows)