RPC是什么?为什么要学习RPC?

本文涉及的产品
传统型负载均衡 CLB,每月750个小时 15LCU
应用型负载均衡 ALB,每月750个小时 15LCU
EMR Serverless StarRocks,5000CU*H 48000GB*H
简介: 随着近几年分布式、微服务架构的火热,RPC在开发工作中使用的越来越多,也变的越来越重要。今天我们来看RPC是什么,为什么要了解RPC,通过学习RPC我们能掌握什么内容?什么是「RPC」RPC 全称 Remote Procedure Call,  ...

随着近几年分布式、微服务架构的火热,RPC在开发工作中使用的越来越多,也变的越来越重要。

今天我们来看RPC是什么,为什么要了解RPC,通过学习RPC我们能掌握什么内容?

什么是「RPC」

RPC 全称 Remote Procedure Call,  wikipedia的部分说明:

RPC is a request–response protocol. An RPC is initiated by the client , which sends a request message to a known remote server to execute a specified procedure with supplied parameters. The remote server sends a response to the client, and the application continues its process.

首先这里的重点是「protocol」,其次是 RPC中的R -「Remote」。所以这里的RPC的意义是一个调用执行远程方法的协议。我们对于方法的调用一般类似这样

Echoecho= child.say("Hello World");

这种一般是指调用自己本地的方法,比如 Java 应用是指调用在同一个 JVM 内的方法。

如果上述的代码要换成我们以RPC的形式去调用,写法有什么区别呢?

其实是没有的。

我们在调用时仍然按这个形式,仅需要在配置中指定这个方法对应的「远程地址」即可。

再举个生活化的例子。

假设你是招揽游客的小贩。每次集齐了游客你都在卖力的吆喝,在各种神奇的网站的搜索,找对应景点的导游。后来有一天,你和街边多个打印店谈了合作。符合条件可以导对应景点的都可以在打印店「登记」,你下次来的时候根据记录,直接「联系」对应的人即可,省力不少哇。

这里我们看到两种RPC的使用形式:

直接在配置中固定写好远程方法的地址,请求是一步到位

在配置中提供的「注册处」的地址,方法请求时先到注册处查方法地址再执行

看到这里,你不禁要说,调用个远程方法嘛,又不难,有啥看的。

那我们继续这个生活化的例子。

在你集齐了游客联系经常合作的导游时,他生病了。你要找谁? 你说我有「备份」嘛,登记处记录了好多呢。

那好,这好多个导游里,你「选哪一个」?

你说,靠,我那管那么多,随便挑一个打电话就是了。好,这时你就已经在用到了RPC中的「负载均衡LoadBalance」了,只不过你的策略是用的「随机」。

如果在导游登记的时候每个提供了照片和历史认证评级,那你可能不会随便挑一个打,可能会看看照片,哪个感觉更靠谱,哪个评级更高。此时这些项都做为你联系他的一个「权重」。在多个导游间,这个权重决定了被联系次数的多少。此时你的LB不再是简单随机,而是根据「权重」进行。

再比如你们合作多次,固定的几个景点就是固定的几个导游,老相识,每次带人来都找他。此时你的策略又变成了「一致性Hash」。

后来,有导游和你说,最近像他们这类自找生意的导游,被发现在主动拉生意,可能会罚款,下次联系他的时候别说那么多。于是你们订了个简单「协议」:先说「0或1」,代表是否空闲,再说「1到100」代表你们所带游客游览的景点。再说「0或1」代表是否可以带购物。

你会发现,此时你们的协议里有「编码」,有压缩,每个人在听到对方信息时,需要再在你这里解码,还原成真实的信息。在 RPC 里也一样,在方法调用前,需要将对应的参数序列化,以指定的「格式」传递,到达后再对应的还原回去执行方法。

过了一段时间,你的业务发展壮大,一个景区附近的导游们自动组队。在你请求到达时,这个景区的导游里自动根据上面的权重选一个人出来,这些导游组成的,就是一个「Cluster」

业务发展的同时,你成立了一个秘书团,这些人负责过一段时间联系一下各个导游组,判断这个景区是否能提供,这个时候,秘书团就在进行「监控」。

(一口老血,编不下去了……)

接下来要说的是,我们为什么要学习 RPC。

为什么要学习 RPC

为什么要学习 RPC呢? 我们开头时也提到,微服务、分布式应用的开发越来越常见, RPC 是其中相当重要的组件。通过 RPC 的学习,可以更好的理解和进行较大型应用的设计与开发。

同时, RPC 中涉及到的各类技术,也会使学习者知识面更宽广,每个方面,都值得深入。而对于技术,特别是源码的学习,又会返过来促使更好的理解 RPC,你写出更好的代码。

学习 RPC 我们能掌握什么

我们上面的生活化例子中,提到了这些技术

注册处

集群

负载均衡

协议

序列化编码、解码

一致性Hash

监控

……

这些技术,也是 RPC 中很重要的一些内容。 我们看 Dubbo 的源码中,从代码的组织上,也能一窥究竟。



img_825fea5402b1a55bff09d813557e03c8.jpe

这张图里,比我们在上面例子里提到的技术,多一些「Filter」,「Config」还有「Remoting」,包含了更完整的 RPC 的配置管理,请求过滤,多协议支持等内容。

而对 RPC 学习,例如负载均衡,除技术之外,还可以学习一种思想,是一种可迁移的东西。这种负载均衡的使用和实现,在 Nginx、Apache 做反向代理,在 应用服务器做集群搭建时,都会用的到。

像一致性Hash,对于通过 Hash思想来实现请求均衡的实现中,一致性 Hash 的思路,能更大程度的保证请求 Hash到原来的服务器上,在增减服务器时,影响减小。

再比如「注册处」Registry 中,我们可以了解到通过 zk, redis,甚至广播 的注册处实现。这种注册处的学习,可以在我们后续的微服务,分布式应用中常用的「注册中心」提供实现的思路。

再比如 我们远程调用时参数、信息的序列化,我们 Java 默认的序列化在性能上不能满足 RPC 这种高频序列化的应用场景,那有什么好的办法来提升序列化性能呢?

你会发现 Dubbo 中集成了 kryo,hessian2,fastjson等支持,可以比较学习这些不同的序列化实现,在自己的业务场景中有需要时,就发现你的技能工具箱中又多了一件工具。

类似的内容还有很多,学习这些都能让我们更好的成长。

欢迎工作一到五年的Java工程师朋友们加入Java架构开发:860113481

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

相关实践学习
SLB负载均衡实践
本场景通过使用阿里云负载均衡 SLB 以及对负载均衡 SLB 后端服务器 ECS 的权重进行修改,快速解决服务器响应速度慢的问题
负载均衡入门与产品使用指南
负载均衡(Server Load Balancer)是对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 本课程主要介绍负载均衡的相关技术以及阿里云负载均衡产品的使用方法。
相关文章
|
6月前
|
XML 存储 JSON
从零开始学习 RPC 与 Protobuf
在数据密集型应用领域,Google 开发的 Protobuf 作为一种高效数据编码方式而广受欢迎。它胜任于 JSON 及 XML 对比,不仅在体积和速度上表现出色,而且其结构化方式优化了网络传输中的性能。简而言之,Protobuf 是将复杂数据结构编码成二进制流的手段,并能够轻松将这些流再还原回原始数据格式。
|
中间件 Go 数据处理
Go语言学习 - RPC篇:gRPC-Gateway定制mux选项
通过上一讲,我们对gRPC的拦截器有了一定的认识,也能定制出很多通用的中间件。 但在大部分的业务系统中,我们面向的还是HTTP协议。那么,今天我们就从gRPC-Gateway的mux选项出发,一起来看看一些很实用的特性。
229 0
|
编解码 中间件 Go
Go语言学习 - RPC篇:gRPC拦截器剖析
我们在前几讲提到过,优秀的RPC框架都提供了`middleware`的能力,可以减少很多重复代码的编写。在gRPC-Gateway的方案里,包括了两块中间件的能力: 1. gRPC中的`ServerOption`,是所有gRPC+HTTP都会被处理 2. gRPC-Gateway中的`ServeMuxOption`,只有HTTP协议会被处理 今天,我们先关注共同部分的`ServerOption`,它提供的能力最为全面,让我们一起了解下。
87 0
|
存储 JSON Go
Go语言学习 - RPC篇:深入gRPC-Gateway-探索常用数据类型
今天,我们先迈出第一步:探索RPC服务中的数据类型。掌握常见的数据类型,灵活地运用到接口设计中,能帮助我们快速地提供优雅的接口类服务。
86 0
|
JSON 中间件 Go
Go语言学习 - RPC篇:gin框架的基础能力剖析
gin是非常流行的一款HTTP框架。相较于原生的HTTP server,gin有很多改进点,主要在于3点: 1. 上手简单,开发思路与原生HTTP基本一致 2. 引入多个工具库,提高了开发效率 3. 生态丰富,有许多开源的组件 围绕着gin框架,我们将展开今天的话题。
173 2
Go语言学习 - RPC篇:gin框架的基础能力剖析
|
Go API 开发者
Go语言学习 - RPC篇:gRPC-Gateway示例代码概览
gRPC-Gateway是gRPC生态的一环,用于对HTTP协议的扩展,是一套高性能、高扩展的开源RPC框架。 因此,要掌握gRPC-Gateway,必须要对gRPC有一定的基础,才能明白它的定位与价值。
125 0
|
JSON Go 开发工具
Go语言学习 - RPC篇:理解标准库HTTP的hander实现逻辑
在Go语言中,常见的RPC包括HTTP/gRPC/Thrift等,但绝大多数的开发场景仍是基于HTTP。本文对RPC的讨论,主要是基于HTTP的场景。
58 0
|
敏捷开发 JSON 负载均衡
RPC 实现以及相关学习
我们即希望能够敏捷开发,不做重复的劳动,用别人的势能赋能自己;又要成为一名能够赋能别人的人,拥有自身的势能。
RPC 实现以及相关学习
|
XML Java Apache
rpc框架之gRPC 学习 - hello world
grpc是google在github于2015年开源的一款RPC框架,虽然protobuf很早google就开源了,但是google一直没推出正式的开源框架,导致github上基于protobuf的rpc五花八门,国内比较著名的有百度的sofa-pbrpc,但是遗憾的是soft-pbrpc没有对应的java实现版本。
1500 0