微服务7:通信之RPC
★微服务系列
1 什么是RPC通信
2 RPC通信详解
2.1 RCP角色和职能
2.2 RPC调用流程
RPC(Remote Procedure Call)远程过程调用,即一个节点通过网络调用的方式来请求另一个节点提供的服务的过程,也可以简单的理解为client访问server上提供的函数。
他的基本调用流程如下:

- 客户端(client)以本地调用方式(即以接口的方式)调用服务;
- 客户端存根(client stub)接收到调用后,负责将方法、参数等组装成能够进行网络传输的消息体(将消息体对象序列化为二进制 byte[]);
- 客户端通过sockets将消息发送到服务端;
- 服务端存根( server stub)收到消息后进行解码(将消息对象反序列化);
- 服务端存根( server stub)根据解码结果调用本地的服务;
- 本地服务执行并将结果返回给服务端存根( server stub);
- 服务端存根( server stub)将返回结果打包成消息(将结果消息对象序列化);
- 服务端(server)通过sockets将消息发送到客户端;
- 客户端存根(client stub)接收到结果消息,并进行解码(将结果消息反序列化);
- 客户端(client)得到最终结果。
2.3 多服务RPC通信模型
理解对服务的调用和RPC模式的结果返回,注意箭头的指向的区别。

2.4 RPC通信使用到的技术
2.5 RPC通信与普通函数调用的区别
虽然RPC可以简单的理解为client 去调用server 中的函数。但是RPC通信和直接的函数调用还是有很大的区别的:
| 内容项 | RPC调用 | 本地调用 |
| 函数寻址 | IP端口路由(NamingService + LoadBalancer)+函数路由 | 内存指针 |
| 传递数据 | 序列化后的数据流 | 内存对象 |
| 调用方异常处理 | timeout、retry、curcuit breaker | 抛出Exception / 函数返回固定异常标识的数据 |
| 被调用方异常处理 | 认证鉴权、过载保护 | 入参检查 / 执行异常捕获和处理 |
| 问题定位 | 分布式Trace、监控、日志中心 | 日志记录 / 断点调试跟踪 |
| 性能优化 | 连接池、多路复用、线程池、轻量级线程、non-block IO 等 | 编译器优化(inline等) |
这里可以看出rpc比函数调用复杂的多,比如:
- 函数寻址:你怎样调到你想要的哪个函数?在本地调用中其实就是一个函数指针,但是在RPC场景下,你要找到这个函数其实非常复杂,一个服务一般有多个下游实例,首先要选择一个下游实例,一般这个是由NamingService+LB来实现,到达对应的实例后,服务端还要解析请求体,找到函数名,然后做函数路由。
- 数据传递:在本地调用过程中其实就是传递一个指针或者值,在RPC场景下其实是通过网络传递的,网络上需要传递一个内存对象序列化之后的一个二进制网络数据流,response回来的时候也需要经过一个反序列化的过程。
- 异常处理:本地调用的情况下,无非就是判断下这个函数的返回值或者有没有抛一些异常,但是在RPC场景下就很复杂,比如网络拥塞了,服务端处理慢了或者超时,还有很多异常的情况,所以我们要做很多系统容错的事情,比如:超时、重试等策略来解决这些问题。本地调用的时候我只需要检查参数是否合法,但是在RPC的场景下我们要做一些类似认证鉴权,过载保护等策略,避免流量过大将server打挂。
- 问题定位:本地调用方法很多,比如:断点调试,打本地日志。但是在RPC场景下,这些方法其实是行不通的,我们需要分布式tracing、监控和分布式日志中心来帮助我们定位问题。
- 性能优化:本地调用其实我们不用关心太多,因为编译器会帮我们做一些列的优化,但是在RPC的场景下,就需要我们自己优化通信效率,常用的优化手段比如:连接池、多路复用、线程池等等很多方法,这些方法实现起来都非常的复杂。现在大家应该能理解RPC场景是非常复杂的
正因为有如此的复杂性,所以我们需要一个RPC框架来处理这些复杂的事情,让RPC看起来就像本地调用一样简单。
2.6 RPC 框架调用流分析
2.6.1 RPC框架功能(简单版本)

实现的过程:
- client初始化一个channel,监听NamingService,从服务名字中解析出来服务真正的上游实例地址
- 客户端将请求的的数据进行序列化
- 上游可能多个实例,需要LB去选择一个下游的IP+Port,选出来之后需要和上游实例建立连接和发送请求
- 建立连接之后发送请求
- 服务端接着接受连接和接受数据,收到数据之后将二进制数据反序列化为一个内存对象request
- 然后再调用server的响应方法进行处理
- 服务端通过sockets将消息发送到客户端;
- 客户端接收到结果消息,并进行解码(将结果消息反序列化)
2.6.2 RPC框架功能(复杂版本)

有些RPC框架不只是处理通信相关的工作(如数据的序列化和反序列化,协议的解析/打包,数据的压缩解压缩,数据的加密和解密),还可以做很多微服务治理的工作。
比如Dubbo支持对服务的治理,包括 服务注册与发现、故障注入、超时重试、负载均衡、连接管理和健康检查等。除此之外,服务端还有认证鉴权、并发流量限制、函数路由、协议适配和参数校验等等复杂的策略。
所以一个成熟的RPC框架也可以是一个非常复杂全面的分布式系统,在一定程度上协助工程进行微服务建设。
2.7 主流RPC 框架对比
| 对比项 | Dubbo | gRPC | brpc | Thrift |
| 公司 | Ali | Baidu | ||
| 通讯协议 | tcp/http | http2 | 多种协议 | tcp/http |
| 序列化协议 | 可扩展 | protobuf | protobuf/json/mcpack | 可扩展 |
| 开发语言 | Java | 跨语言 | C++ / Java | 跨语言 |
| 主要特点 | 服务治理、扩展性 | 跨语言、性能 | 高性能、扩展性 | 跨语言 |
|
github star |
36.9K | 33.5K | 12.9K | 8.9K |
2.8 与RESTful API 的区别
RPC 主要用于公司内部的服务调用,性能消耗低,传输效率高,实现复杂。
HTTP 主要用于对外的异构环境,浏览器接口调用,App 接口调用,第三方接口调用等。
RPC 使用场景(大型的网站,内部子系统较多、接口非常多的情况下适合使用 RPC):
- 长链接。不必每次通信都要像 HTTP 一样去 3 次握手,减少了网络开销。
- 注册发布机制。RPC 框架一般都有注册中心,有丰富的监控管理;发布、下线接口、动态扩展等,对调用方来说是无感知、统一化的操作。
- 安全性,没有暴露资源操作。
- 微服务支持。就是最近流行的服务化架构、服务化治理,RPC 框架是一个强力的支撑。
3 总结
通过本篇我们详细学习了RPC的概念和原理,以及它能够提供的能力。也对目前业内主流的RPC的框架有了一定的了解。后面一篇我们以Dobbo为例子,来学习下怎么使用RPC框架来进行服务之间的通信。
微服务7:通信之RPC的更多相关文章
- 微服务架构介绍和RPC框架对比
微服务架构介绍和RPC框架对比 1.微服务架构 1.1 特征 自动化部署,端点智能化,语言和数据的去中心化控制. 1.2架构 一种将一个单一应用程序开发为一组小型服务的方法,每个服务运行在自己的进程中 ...
- 远程服务调用RPC框架介绍,微服务架构介绍和RPC框架对比,dubbo、SpringClound对比
远程服务调用RPC框架介绍,微服务架构介绍和RPC框架对比,dubbo.SpringClound对比 远程服务调用RPC框架介绍,RPC简单的来说就是像调用本地服务一样调用远程服务. 分布式RPC需要 ...
- .net core ——微服务内通信Thrift和Http客户端响应比较
原文:.net core --微服务内通信Thrift和Http客户端响应比较 目录 1.Benchmark介绍 2.测试下微服务访问效率 3.结果 引用链接 1.Benchmark介绍 wiki中有 ...
- 【JMICRO】 微服务简介及异步RPC体验
一,为什么写JMicro 印象中初次接触微服务大概是2011年,那会做Eclpise插件开发,网上查看好多关于OSGI的技术文章,发现Spring新出了一个叫Spring-boot的框架,那会没太上心 ...
- 微服务治理平台的RPC方案实现
导读:本文主要探讨了rpc框架在微服务化中所处的位置,需要解决的问题.同时介绍了用友云微服务治理平台的rpc解决方案,为什么选择该方案.该方案提供的好处是什么.同时也会介绍用友RPC框架的基本结构以及 ...
- 微服务实践之路--RPC
微服务实践之路--RPC 重点来了,本文全面阐述一下我们的RPC是怎么实现并如何使用的,跟Kubernetes和Openstack怎么结合. 在选型一文中说到我们选定的RPC框架是Apache Thr ...
- HTTP和RPC是现代微服务架构,HTTP和RPC是现代微服务架构
.NET Core使用gRPC打造服务间通信基础设施 一.什么是RPC rpc(远程过程调用)是一个古老而新颖的名词,他几乎与http协议同时或更早诞生,也是互联网数据传输过程中非常重要的传输机制 ...
- spring cloud深入学习(一)-----什么是微服务?什么是rpc?spring cloud简介
近年来,微服务非常的流行,那么为什么是它?简单介绍一下. 为什么是微服务? 微服务架构是一种将单应用程序作为一套小型服务开发的方法,每种应用程序都在其自己的进程中运行,并与轻量级机制(通常是HTTP资 ...
- Openstack+Kubernetes+Docker微服务实践之路--RPC
重点来了,本文全面阐述一下我们的RPC是怎么实现并如何使用的,跟Kubernetes和Openstack怎么结合. 在选型一文中说到我们选定的RPC框架是Apache Thrift,它的用法是在Ma ...
- 微服务理论之三:RPC框架原理
RPC调用是面向服务架构场景下进行服务间调用的常用组件,一个完整的RPC调用的流程如图1所示: 图1 RPC调用流程 为了方便RPC调用者和服务者的开发,开发者们开发了很多RPC框架.比较有名的RPC ...
随机推荐
- super、this、抽象类、继承
super 代表是父类对象,并且在创建子类对象时,就先创建父类对象,再创建子类对象,可以在子类方法中使用super调用父类的非私有方法. this 代表本类对象,谁创建就代表谁 实体类,被创建的cla ...
- IntelliJ IDEA 学习笔记 - 修改编码
感谢原文作者:codeke 原文链接:https://blog.csdn.net/cgl125167016/article/details/78666432 仓库:https://github.com ...
- java中使用反射获取pojo(实体)类的所有字段值
出处:https://developer.aliyun.com/article/239346 说起反射,不得不说它实在是太强大了,通过反射就可以轻轻松松拿到各种东东,如果你想在项目中解除对某个类的依赖 ...
- UIImageView的序列帧动画
#pragma mark - 开始动画 - (IBAction)startAnimation { // 1.1 加载所有的图片 NSMutableArray<UIImage *> *ima ...
- P2678 [NOIP2015 提高组] 跳石头
#include<bits/stdc++.h> using namespace std; int l,n,m,a[100010];//与起点的距离 bool check(int d) { ...
- 利用DP-SSL对少量的标记样本进行有效的半监督学习
作者 | Doreen 01 介绍 深度学习之所以能在图像分类.自然语言处理等方面取得巨大成功的原因在于大量的训练数据得到了高质量的标注. 然而在一些极其复杂的场景(例如:无人驾驶)中会产生海量的数据 ...
- 彻底明白Linux硬链接和软链接
[硬连接] 在Linux的文件系统中,保存在磁盘分区中的实际文件不管是什么类型系统都给它分配一个编号,称为索引节点号(Inode Index),这个索引节点用来标识这个文件,即这个索引节点就代表了这个 ...
- CobaltStrike逆向学习系列(7):Controller 任务发布流程分析
这是[信安成长计划]的第 7 篇文章 关注微信公众号[信安成长计划] 0x00 目录 0x01 Controller->TeamServer 0x02 TeamServer->Beacon ...
- KALI搭建Docker+Vulhub漏洞复现环境
在学习网络安全的过程中,少不了的就是做漏洞复现,而漏洞复现一般比较常用的方式就是使用docker-vulhub进行环境搭建,我近期也遇到了这个问题,但是网上的教程特别混乱,根本起不到帮助作用,即使有可 ...
- [Python]从哪里开始学习写代码(未完待续)
预警:这只是我在学习中的一点感受,可能并不完全准确,也不包括面向对象编程的思想(我还不太懂),也有水文的嫌疑,大佬请温和批评指正或者绕道. 计算机语言 语言,是用来交流的.计算机是不能直接听懂人的语言 ...